Моды в Claude Code — это плагины, которые меняют поведение и внешний вид инструмента изнутри: они состоят из обработчиков событий на JavaScript или TypeScript, которые Claude Code вызывает при каждом значимом действии — вызове инструмента, отправке промпта или отрисовке элемента интерфейса. Официальное описание механизма опубликовано в Mods overview — там же полная справка по API и событиям. Компания Anthropic, разработчик чат-бота Claude, представила моды как ответ на запрос разработчиков получить больше контроля над поведением Claude Code, не ожидая обновлений от команды.
В отличие от скиллов, settings-хуков и MCP-серверов, которые работают снаружи процесса, мод выполняется внутри него. Обработчик (hook) может наблюдать за событием и пропускать его дальше, переписать содержимое события или ответить вместо Claude Code, прервав цепочку. Это открывает возможности, которые внешним механизмам недоступны: рисовать собственные панели, перехватывать вызовы инструментов до их выполнения, делить данные между несколькими хуками через переменные модуля.

В статье последовательно разобрано всё, что нужно разработчику: из каких файлов состоит мод, какие события он перехватывает, как его установить или написать самому, как включать и выключать, чем мод опасен и как им управляют на уровне организации.
Мод — это плагин, который меняет поведение и вид Claude Code и собран из обработчиков событий на JavaScript или TypeScript; каждый обработчик (hook) Claude Code вызывает, когда происходит определённое событие, и хук может наблюдать за ним, переписать его или ответить вместо Claude Code. Anthropic анонсировала моды Claude Code как ответ на запрос разработчиков получить больше контроля над поведением инструмента без ожидания обновлений.
Плагин — общий контейнер для расширений Claude Code: он может включать скиллы, команды, агенты и MCP-серверы. Плагин становится модом, когда в его hooks.json есть ключ modules, указывающий на файл с кодом. Именно наличие этого ключа отличает мод от других видов плагинов.
Код, на который указывает hooks.json, называется hooks module — в примере это register.js. Он экспортирует функцию register(on), которую Claude Code вызывает один раз при загрузке. Внутри этой функции вызовами on('событие', обработчик) мод сообщает, на какие события подписаться. В документации слово «hook» в контексте модов означает такой обработчик-функцию; хук, заданный командой в файле настроек, там называется «settings hook» — это разные вещи.
Когда Claude Code вызывает инструмент, он испускает событие tool.call; когда рисует спиннер — событие ui.render с component: 'Spinner'. Если мод подписан на эти события, Claude Code вызывает соответствующие обработчики перед тем, как совершить действие само. Несколько модов, подписанных на одно событие, образуют цепочку: первый загруженный получает событие первым и результат последним.
Канонический пример из документации — мод с двумя хуками и общей переменной calls = 0 в файле. Хук tool.call срабатывает каждый раз, когда Claude собирается использовать инструмент: он прибавляет единицу к calls, вызывает $.ui.invalidate('ui.render'), чтобы попросить Claude Code перерисовать интерфейс, и возвращает next(e) — пропускает событие дальше без изменений.
Хук ui.render срабатывает при каждой отрисовке спиннера (фильтр { component: 'Spinner' }). Он возвращает next({ ...e, props: { ...e.props, suffix: ' · tool calls: ' + calls + '…' } }) — передаёт изменённую копию события дальше, и Claude Code рисует оригинальный спиннер с добавленным суффиксом. Пока Claude перечисляет файлы и читает их, строка над промптом меняется с Thinking · tool calls: 1… до 3…. Этот пример показывает ключевую особенность модов: два хука одного файла пользуются общей переменной calls, которую ни один внешний механизм передать не мог бы.
Мод работает внутри процесса Claude Code, поэтому умеет то, что недоступно внешним settings-хукам, скиллам и MCP: рисовать свой интерфейс, перерисовывать интерфейс Claude Code, вклиниваться в вызов инструмента или запрос и запускать код по команде. Settings-хуки, скиллы и MCP-серверы запускаются снаружи — они могут дать Claude текст или инструменты, но не могут нарисовать кнопку или придержать вызов до ответа пользователя.
Первое — рисовать собственный интерфейс: панель сбоку от транскрипта или полосу над промптом с вкладками, кнопками и полями ввода. Второе — перерисовывать интерфейс самого Claude Code: заменять или менять стиль строки вызова инструмента, спиннера или диалогового окна с вопросом. События ui.render позволяют поменять практически любой компонент, кроме самого запроса разрешения — его мод изменить не может.
Третье — вклиниваться в вызов инструмента или запрос: придержать вызов и задать пользователю вопрос, ответить без выполнения инструмента, переслать запрос другой модели, например флагманской модели Claude через изменённое поле model в событии turn.step. Четвёртое — запускать собственный код по /command мгновенно, без хода Claude, даже пока Claude уже работает. Пятое — делить данные между хуками: переменные на уровне файла модуля доступны всем хукам мода, поэтому один хук считает вызовы инструментов, а другой показывает счётчик рядом со спиннером.
| Механизм | Что представляет | Язык / среда | Рисует интерфейс | Когда выбирать |
|---|---|---|---|---|
| Мод | Функции в плагине (JS/TS) | Внутри Claude Code | Да | Нужен интерфейс, перехват события или общие данные между хуками |
| Settings hook | Shell-команда или HTTP-запрос в settings.json | Внешний процесс | Нет | Простые реакции на события: логирование, блокировка команды |
| Skill | Markdown-файл с инструкциями | Текст для модели | Нет | Добавить знания или паттерн поведения в Claude |
| MCP server | Внешний процесс с инструментами | Любой язык | Нет | Интегрировать внешние API или источники данных |
Один плагин может содержать и мод, и скилл, и MCP-сервер одновременно. Если settings hook или скилл уже решают задачу, мод писать не нужно: он сложнее в отладке и несёт больший риск из-за доступа к процессу. Выбирать мод стоит тогда, когда нужен интерфейс, перехват события с изменением или обмен данными между несколькими обработчиками.
Минимальный мод состоит из трёх файлов — plugin.json, hooks.json и register.js, где plugin.json это манифест плагина, hooks.json ключом modules указывает на код, а register.js и есть сам код мода (hooks module). Никакого бандлера или сборочного шага не нужно — .js и .ts-файлы Claude Code загружает напрямую.
Дерево каталогов минимального мода выглядит так:
first-mod/.claude-plugin/plugin.json — манифест с полями name, version, description, authorfirst-mod/hooks/hooks.json — конфигурация с ключом modules: ['./register.js']; именно этот ключ превращает плагин в модfirst-mod/hooks/register.js — hooks module: экспортирует функцию register(on), которую Claude Code вызывает один раз при загрузкеВнутри register(on) каждый вызов on('событие', обработчик) подписывает функцию на конкретное событие. Вторым аргументом можно передать матчер-фильтр — объект, массив или регулярное выражение — чтобы хук срабатывал только при определённых значениях свойств события. Например, on('ui.render', { component: 'Spinner' }, handler) вызывает handler только при отрисовке спиннера, не каждого компонента.

Каждому обработчику Claude Code передаёт три аргумента. Первый — Mods API под именем $: пространство имён с методами $.ui, $.command, $.process, $.fs, $.http, $.env, $.settings, $.model. Через эти методы мод взаимодействует с Claude Code и системой.
Второй аргумент — событие e: объект заморожен (Object.freeze), присваивание полю бросает ошибку. Чтобы изменить событие, нужно создать копию: { ...e, text: e.text.trim() }. Третий аргумент — next: функция, вызывающая следующий обработчик в цепочке. next(e) передаёт событие дальше и возвращает результат — это паттерн middleware. Если хук хочет ответить сам и не пускать событие дальше, он возвращает результат без вызова next.
Событие хук обрабатывает одним из трёх способов: наблюдает (делает работу и возвращает next(e)), переписывает (вызывает next с изменённой копией e) или отвечает сам (возвращает результат без вызова next, прерывая цепочку). Хук tool.call может отказать в вызове, изменить аргументы или пропустить его в зависимости от того, что вернуть.
Режим observe — самый безопасный: хук записывает данные, вызывает next(e) и возвращает его результат. Событие продолжает путь по цепочке и в итоге доходит до Claude Code без изменений. Именно так работает хук tool.call в примере со счётчиком: он только увеличивает переменную и пропускает вызов дальше.

Режим rewrite: так как событие e заморожено, хук передаёт next новый объект — next({ ...e, text: e.text.trim() }). Остальные моды в цепочке и сам Claude Code получат уже изменённую версию. Порядок важен: первый загруженный мод видит оригинал события, последний получает уже переработанный результат. Режим answer — хук возвращает результат без вызова next, например { deny: 'Опасная операция заблокирована' } для отказа в инструменте. Никто из последующих обработчиков событие не получит.
| Событие | Когда срабатывает | Что можно сделать |
|---|---|---|
tool.call | Перед каждым вызовом инструмента (включая субагентов и MCP) | Изменить аргументы (e.command для Bash), заблокировать { deny }, ответить своим результатом |
tool.check | До показа запроса разрешения | Одобрить или отклонить вызов раньше пользователя |
prompt.submit | Перед ходом Claude | Переписать e.text, добавить context или вернуть { drop } |
ui.render | При отрисовке компонента интерфейса | Изменить props компонента, фильтровать по { component: 'Spinner' } |
turn.start / turn.step / turn.complete | На шагах хода Claude | Следить за ходом; turn.step принимает next({...e, model}) для другой модели |
Фильтр-матчер вторым аргументом on позволяет сузить срабатывание: строка, массив строк или регулярное выражение сравниваются с нужным полем события. Например, on('tool.call', { tool: 'Bash' }, handler) вызывает хук только при вызовах Bash.
Образец blast-radius из репозитория Anthropic демонстрирует паттерн guard: хук подписан на tool.call с фильтром { tool: 'Bash' }. Если e.command совпадает с паттерном rm -rf или git push --force, хук вызывает $.ui.ask — этот метод рисует диалог с кнопками «Выполнить» и «Отменить» и приостанавливает обработку события.
Пока пользователь не ответил, инструмент не запускается. Если пользователь нажимает «Отменить», хук возвращает { deny: 'Cancelled by user' } без вызова next — это answer-режим, команда не выполнится и запроса разрешения от Claude Code не последует. Если «Выполнить» — next(e), команда идёт дальше как обычно. Тот же паттерн подходит для редактирования production-конфигов, принудительных git-операций и любых команд с необратимыми последствиями.
7 октября 2026 г.
Хакер атаковал банки Кореи с ИИ-агентами и оставил в открытом доступе свою историю Claude Code
CrowdStrike нашла на серверах атакующего открытые журналы Claude Code и восстановила по ним, как шёл взлом.
7 октября 2026 г.
Claude проложил подростку маршрут в горы — снимать со скалы пришлось вертолётом
16-летний турист из Канады проложил маршрут в горы с помощью Claude и застрял на опасном скальном гребне. Снимали вертолётом.
6 октября 2026 г.
OpenAI выложила 719 математических «решений» разом, а математики призвали прекратить с ней работать
OpenAI выложила на GitHub 719 рукописей с решениями открытых математических задач, а Ассоциация за человеческую математику призвала прекратить работу с компанией.
5 октября 2026 г.
Википедия поймала ИИ-агентов OpenAI: правки без спроса, попытки взлома и миллионы запросов
Фонд Викимедиа подтвердил, что агенты OpenAI правили вики без разрешения, пытались превратить общие инструменты в прокси и засыпали Wikidata миллионами запросов.
15 сентября 2026 г.
Мозг мухи «пилотирует» дрон: что на самом деле показал энтузиаст
Энтузиаст подключил открытую карту мозга дрозофилы к мини-дрону. Что в эксперименте правда, а что пока только слова автора.
8 августа 2026 г.
Kimi K3 в vLLM: DSpark разгоняет инференс до 370 токенов в секунду
vLLM добавил day-0 поддержку Kimi K3 с DSpark-спекулятором — скорость выросла с 118 до 370 токенов/сек. Что нужно для запуска и как это считать.
21 июля 2026 г.
Kimi K3 занял первое место в Frontend Code Arena: 1679 баллов, обогнав Claude Fable 5 и GPT-5.6
Узнайте, как Kimi K3 от Moonshot AI стал лидером Frontend Code Arena с 1679 баллами, опередив Claude Fable 5, GPT-5.6 Sol и другие топ-модели.
21 июля 2026 г.
Kimi K3 открывает веса 27 июля: что это значит для разработчиков
Узнайте, что даёт релиз open-weight весов Kimi K3 27 июля: 2,8T параметров, локальный деплой, файн-тюнинг и реакция рынка.
21 июля 2026 г.
Kimi K3 против DeepSeek V4 Pro: сравнение на бенчмарках открытых моделей с триллионами параметров
Сравниваем Kimi K3, DeepSeek V4 Pro и GLM-5.2 по бенчмаркам, цене инференса и лицензиям. Кто побеждает?
18 июля 2026 г.
Moonshot AI подняла оценку до $31,5 млрд на фоне запуска Kimi K3
Узнайте, как запуск Kimi K3 совпал с раундом Moonshot AI на $31,5 млрд — рост с $20 млрд в мае и что это значит для рынка открытых ИИ-моделей.
9 июля 2026 г.
Grok 4.5: что нового, чем полезен и как получить доступ в России
Grok 4.5: что нового, чем модель полезна для кода и офиса, честное сравнение с Opus 4.8 и рабочие способы доступа из России без VPN.
6 июля 2026 г.
Claude Fable 5 снова доступна: что изменилось
Модель Claude Fable 5 от Anthropic снова работает. Рассказываем о снятии ограничений, новых ценах за токены, лимитах и как пользоваться нейросетью.
Мод получают тремя путями: установить готовый как плагин из маркетплейса командой /plugin install name@marketplace, попросить Claude написать его в сессии или написать самому по трёхфайловому шаблону. В каждом случае мод в итоге оказывается плагином, который Claude Code загружает при старте сессии.
Мод устанавливается как плагин из маркетплейса: в интерактивной сессии командой /plugin install token-chart@your-org, в шелле — claude plugin install token-chart@your-org. Готовые плагины с модами ищут в каталоге Claude (claude.ai/directory) или через /plugin прямо из сессии.
Если плагин устанавливается из шелла, пока сессия открыта, нужно выполнить /reload-plugins — иначе мод загрузится только при следующем старте Claude Code. Маркетплейс можно добавить свой: например, локальный клон репозитория claude-code-playground со встроенными образцами Anthropic добавляется как маркетплейс claude-code-playground-mods, и образцы устанавливаются оттуда как обычные плагины.
В интерактивной сессии достаточно описать, что нужно: «сделай мод, показывающий текущую git-ветку над промптом». Claude Code использует встроенный скилл plugin-authoring (загружается автоматически или по команде /plugin-authoring), пишет TypeScript-файлы мода, сохраняет их в ~/.claude/dev-mods/<id сессии>/ и предлагает включить hot reload на эту сессию — изменения будут подхватываться без перезапуска.
Мод, написанный в сессии, живёт только в ней. Чтобы сохранить его, нужно скопировать каталог и в дальнейшем загружать через --plugin-dir, или оформить как плагин и установить. Этот путь — самый быстрый для прототипа: не нужно знать API наизусть, Claude сам заполнит hooks.json и plugin.json. Набросать идею мода и обсудить логику хука можно и вне терминала: черновик на TypeScript напишет любая нейросеть онлайн.
Быстро попробовать свой мод можно без установки: claude --plugin-dir ./first-mod загружает каталог на одну сессию. Для постоянной установки мод оформляется как плагин и добавляется в маркетплейс.
Шаги для запуска образца из репозитория Anthropic:
https://github.com/anthropics/claude-code-playground.claude-code/mods/blast-radius.README.md — там описано, что делает мод и какие события перехватывает.claude plugin validate ./blast-radius и проверить строки hooks: и calls:.claude --plugin-dir ./blast-radius и проверить, что мод загрузился командой /plugin.claude-code/mods как маркетплейс и выполнить /plugin install blast-radius@claude-code-playground-mods.Образцы Anthropic: token-weather — рисует прогноз заполненности контекстного окна над промптом; blast-radius — придерживает опасную shell-команду; replay-theater — добавляет команду /replay, пошагово воспроизводящую правки файлов последнего хода.
Моды работают начиная с Claude Code v2.1.287 и включены по умолчанию, а выключают их по-разному в зависимости от охвата: один мод — в /plugin, все на сессию — флагом --safe-mode, все навсегда — настройкой disableAllHooks. Проверить текущую версию: claude --version; если она старше, нужно обновить Claude Code.
Моды требуют достаточно новой версии и включены по умолчанию. Переменная окружения CLAUDE_CODE_ENABLE_FUNCTION_HOOKS из раннего доступа потеряла смысл: достаточно новые версии Claude Code её игнорируют, поэтому установка в 0 моды не отключит — переменную нужно убрать совсем.
Если мод загружен, но ничего не делает, стоит сначала проверить версию, а затем выполнить /plugin в сессии: строка под вкладками покажет что-то вроде 1 mod active · first-mod. Если мод там не значится, причина не в версии, а в синтаксисе hooks.json или в отсутствии ключа modules. Подробнее о поиске проблем — в разделе про безопасность, где описана команда claude plugin validate.
Варианты выключения — от точечного до полного:
Installed в /plugin.--safe-mode; он также отключает прочие пользовательские настройки."disableAllHooks": true в ~/.claude/settings.json; это остановит и settings-хуки, и кастомный status line, но моды, которыми управляет организация, продолжат работать.Важно: disableAllHooks и организационная опция allowManagedModsOnly останавливают только хуки мода, не весь плагин. Скиллы, команды, агенты и MCP-серверы того же плагина продолжат загружаться. Узнать текущий тарифы подписок Pro и Max можно на сайте Anthropic — доступность управляемых настроек зависит от плана.
Мод выполняется с правами пользователя и не находится в песочнице, поэтому перед установкой проверяют, что он делает, командой claude plugin validate, которая выводит обрабатываемые события и вызовы API без запуска кода. Устанавливать моды стоит только из источников, которым доверяете так же, как доверяете любому коду, запускаемому на своём компьютере.
После загрузки мод может делать всё, что доступно пользователю:
Включение sandbox-режима не защищает: песочница изолирует только Bash-команды, которые выполняет Claude, а процесс самого мода работает вне неё. Единственное, что мод гарантированно не может — изменить интерфейс запроса разрешения, тот диалог, в котором Claude Code спрашивает подтверждения у пользователя.
Получите файлы мода (например, клонируйте репозиторий) и выполните:
claude plugin validate ./some-mod
Вывод содержит строку hooks: — список событий, на которые подписан мод, и строку calls: — методы Mods API, которые он вызывает. Это факты о статическом коде: $.fs.read и $.fs.write — работает с файлами, $.process.run — запускает программы, $.http.fetch — делает сетевые запросы, $.env.get и $.settings.read — читает секреты, $.model.complete — вызывает модель за ваш счёт.
Если в hooks: стоят tool.call и prompt.submit одновременно, мод видит все вызовы инструментов и все промпты. Если в calls: есть $.http.fetch рядом с $.env.get или $.settings.read — мод может отправить ваши секреты наружу. Команда не запускает код мода, поэтому проверка безопасна даже для непроверенных источников.
В организации моды контролируют через управляемые настройки: первым загружается встроенный мод sec-default, защищающий управляемые настройки от пользовательских модов, а опция allowManagedModsOnly вовсе запрещает загрузку чужих модов. Пользователь не может отключить ни sec-default, ни ограничение allowManagedModsOnly — они управляются только администратором.
На тарифах Team и Enterprise и на любой машине с управляемыми настройками sec-default (в списке плагинов он значится как cc-plugin-sec-default@builtin) загружается первым, раньше любых пользовательских модов. Он не позволяет пользовательскому моду переопределять deny-правила разрешений, изменять управляемый системный промпт, CLAUDE.md и настройки организации, а также подменять конфигурацию MCP. Исходный код sec-default открыт в репозитории Claude Code (каталог mods) — администратор может изучить ограничения до развёртывания.
Когда несколько модов подписаны на одно событие, они образуют цепочку по порядку загрузки. Порядок: сначала prependPlugins (сюда обычно ставят sec-default и аудитный мод организации), затем пользовательские моды, затем appendPlugins, затем встроенные. Первый в цепочке получает оригинальное событие и последним видит итоговый результат — поэтому аудитный мод, загруженный первым, гарантированно видит всё, что делают последующие моды.

Опция allowManagedModsOnly под ключом cc-plugin-sec-default@builtin в managed settings запрещает все пользовательские моды: загруженные через --plugin-dir, установленные из маркетплейса и написанные Claude в сессии — все они перестают грузиться. Активны остаются только моды, явно перечисленные в enabledPlugins организации, и встроенные. Административно дополнять инфраструктуру планирует и сама Anthropic: предстоящее IPO компании предполагает расширение enterprise-направления, включая инструменты управления Claude Code в корпоративной среде.
Команды используют моды для собственных средств контроля:
prependPlugins, записывает каждый вызов каждого другого модаЕсли организация разворачивает собственный мод вместо sec-default, рекомендация документации — добавить sec-default в список явно, чтобы сохранить его ограничения.
Часть функций Claude Code уже поставляется модами — например /diff это мод cc-plugin-diff, который можно выключить или заменить своим; рисуют панели и строки моды везде, где загружается плагин, однако отображается это только в терминале и Desktop-приложении. Встроенный мод, в отличие от settings hook, выполняется внутри процесса Claude Code и может рисовать полноценный интерфейс.
Просмотреть встроенные моды можно в /plugin, вкладка Installed, раздел Built-in. Обновить или удалить их нельзя, каждый выключается отдельно. Помимо cc-plugin-diff (командная панель /diff), в список входят: cc-plugin-agents-md (загружает AGENTS.md как инструкции проекта), cc-plugin-sec-default (защитный, описан выше), cc-plugin-telemetry (аналитика использования), cc-plugin-you-should-know (боковой агент-подсказчик, по умолчанию выключен). Исходники части встроенных модов открыты в официальном репозитории Claude Code в каталоге mods.
Anthropic намерена переводить всё больше функций Claude Code в моды — идея в том, чтобы оставить небольшое ядро, а остальное сделать заменяемым. Если выключить cc-plugin-diff, команда /diff продолжит работать через встроенный fallback. Это позволяет, например, полностью переписать отображение результата инструмента или заменить диалог вопроса Claude на собственный компонент.
Хуки мода выполняются в любой сессии, загрузившей плагин: Claude Code в терминале (включая встроенный терминал VS Code, JetBrains и любой другой), вкладка Code в Claude Desktop, VS Code-расширение, claude -p, Agent SDK, Remote Control и облачные сессии. Рисование интерфейса — панели, полосы, перерисованные строки — работает только в терминале и Desktop-приложении; в WSL-сессии, запущенной из Desktop, плагины вообще недоступны и мод не загрузится. Мод, использующий $.ui, может проверить среду выполнения через Mods API и при необходимости откатиться к строке в транскрипте вместо графического элемента.

Моды пишут на JavaScript или TypeScript. Код мода — это обработчики событий (event handlers), которые Claude Code вызывает при наступлении тех или иных событий в сессии.
Да. Если вы установили или обновили мод из командной строки, пока сессия открыта, выполните команду /reload-plugins прямо в сессии — мод загрузится немедленно.
Они выполняются в порядке загрузки: первый загруженный мод получает событие первым и результат последним. Это позволяет комбинировать моды от разных авторов, не конфликтуя.
Да. Мод может перехватить запрос к Claude и перенаправить его к другой модели — это один из примеров того, что умеет мод, но не умеет обычный хук из файла настроек.
Да. Встроенная команда /diff теперь сама является модом, поэтому её можно отключить через /plugin или полностью заменить собственной реализацией. Anthropic планирует переводить и другие встроенные функции в моды.
Примеры доступны в каталоге Claude (claude.ai/directory), а также в публичном репозитории Anthropic на GitHub. Кроме того, некоторые встроенные функции Claude Code сами являются модами и служат наглядным образцом.
Минимальный мод состоит из трёх файлов: plugin.json — манифест, hooks.json — указывает на код через ключ modules, и register.js — сам код с обработчиками событий (hooks module).
Выполните команду claude plugin validate — она выводит строки hooks: и calls:, показывая, какие события мод обрабатывает и какие методы Mods API вызывает, например $.fs.read или $.process.run, без запуска кода мода.