6 6
7> Полный справочник по модам Claude Code: структура модуля хуков, события, методы API модов, точки отрисовки, элементы по интерфейсам, ограничения и настройки.7> Полный справочник по модам Claude Code: структура модуля хуков, события, методы API модов, точки отрисовки, элементы по интерфейсам, ограничения и настройки.
8 8
9Здесь можно найти любое событие, которое может обрабатывать [мод](/docs/ru/plugins/mods/overview.md), любой метод API модов, который он может вызвать, и любую точку отрисовки, в которой он может рисовать. Записи охватывают CLI Claude Code и приложение Desktop по состоянию на v2.1.290, а также расширение VS Code по состоянию на v2.1.299. Для каждой записи указаны имя и однострочное описание, а также ссылка на раздел руководства с пояснениями, если такой раздел есть.9Здесь можно найти любое событие, которое может обрабатывать [мод](https://code.claude.com/docs/ru/plugins/mods/overview.md), любой метод API модов, который он может вызвать, и любую точку отрисовки, в которой он может рисовать. Записи охватывают CLI Claude Code и приложение Desktop по состоянию на v2.1.290, а также расширение VS Code по состоянию на v2.1.299. Для каждой записи указаны имя и однострочное описание, а также ссылка на раздел руководства с пояснениями, если такой раздел есть.
10 10
11> [!NOTE]11> [!NOTE]
12>12>
13> Полный справочник — это [TypeScript-декларации Claude Code для модов](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts), в которых описаны все события, методы и элементы с примерами. Копия на GitHub может быть старше установленной у вас версии Claude Code. Если они расходятся, доверяйте [копии, которую Claude Code записывает для вашей версии](/docs/ru/plugins/mods/create.md#get-the-types-for-your-build).13> Полный справочник — это [TypeScript-декларации Claude Code для модов](https://github.com/anthropics/claude-code/blob/main/mods/types/claude-code.d.ts), в которых описаны все события, методы и элементы с примерами. Копия на GitHub может быть старше установленной у вас версии Claude Code. Если они расходятся, доверяйте [копии, которую Claude Code записывает для вашей версии](https://code.claude.com/docs/ru/plugins/mods/create.md#get-the-types-for-your-build).
14 14
15## Файлы15## Файлы
16 16
18 18
19| Файл | Обязателен | Содержимое |19| Файл | Обязателен | Содержимое |
20| :- | :- | :- |20| :- | :- | :- |
21| `.claude-plugin/plugin.json` | Да | [Манифест](/docs/ru/plugins/manifest-reference.md) плагина. Моды не добавляют обязательных полей. |21| `.claude-plugin/plugin.json` | Да | [Манифест](https://code.claude.com/docs/ru/plugins/manifest-reference.md) плагина. Моды не добавляют обязательных полей. |
22| `hooks/hooks.json` | Да | `modules`: массив с одним путём к модулю хуков относительно этого файла, например `"modules": ["./register.js"]`. Может также содержать [хуки настроек](/docs/ru/hooks.md) в поле `hooks`. |22| `hooks/hooks.json` | Да | `modules`: массив с одним путём к модулю хуков относительно этого файла, например `"modules": ["./register.js"]`. Может также содержать [хуки настроек](https://code.claude.com/docs/ru/hooks.md) в поле `hooks`. |
23| Модуль хуков, например [`hooks/register.js`](/docs/ru/plugins/mods/create#write-a-mod-yourself) | Да | Точка входа мода. Экспортирует `register(on, options)`. Имеет расширение `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` или `.tsx`. Является ES-модулем. |23| Модуль хуков, например [`hooks/register.js`](https://code.claude.com/docs/ru/plugins/mods/create#write-a-mod-yourself) | Да | Точка входа мода. Экспортирует `register(on, options)`. Имеет расширение `.js`, `.mjs`, `.cjs`, `.jsx`, `.ts`, `.mts`, `.cts` или `.tsx`. Является ES-модулем. |
24| [`types/index.d.ts`](/docs/ru/plugins/mods/interface#declare-the-values), указанный в поле `types` манифеста | Когда мод использует `$.state` или добавляет пространство имён в API модов | Объявляет значения `PluginState` и любое пространство имён, которое добавляет мод |24| [`types/index.d.ts`](https://code.claude.com/docs/ru/plugins/mods/interface#declare-the-values), указанный в поле `types` манифеста | Когда мод использует `$.state` или добавляет пространство имён в API модов | Объявляет значения `PluginState` и любое пространство имён, которое добавляет мод |
25| Файлы, имена которых заканчиваются на `.test.ts` или `.test.tsx` | Нет | Тесты, которые запускает [`claude plugin test`](/docs/ru/plugins/mods/test#write-a-test) |25| Файлы, имена которых заканчиваются на `.test.ts` или `.test.tsx` | Нет | Тесты, которые запускает [`claude plugin test`](https://code.claude.com/docs/ru/plugins/mods/test#write-a-test) |
26 26
27`register` получает `on` и `options`. `options` содержит значения полей [`userConfig`](/docs/ru/plugins/components#user-configuration), объявленных в манифесте, с подставленными значениями по умолчанию.27`register` получает `on` и `options`. `options` содержит значения полей [`userConfig`](https://code.claude.com/docs/ru/plugins/components#user-configuration), объявленных в манифесте, с подставленными значениями по умолчанию.
28 28
29## Функция хука29## Функция хука
30 30
31Мод регистрирует каждый из своих хуков, то есть обработчиков событий, вызывая `on` внутри `register`. `on` принимает имя события, необязательный [matcher](/docs/ru/plugins/mods/events.md#filter-which-events-a-hook-handles), то есть фильтр по полям события, и сам хук, например `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` возвращает регистрацию с одним методом, `.catch(handler)`, который задаёт [обработчик ошибок](/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails) хука.31Мод регистрирует каждый из своих хуков, то есть обработчиков событий, вызывая `on` внутри `register`. `on` принимает имя события, необязательный [matcher](https://code.claude.com/docs/ru/plugins/mods/events.md#filter-which-events-a-hook-handles), то есть фильтр по полям события, и сам хук, например `on('tool.call', { tool: 'Bash' }, async ($, e, next) => next(e))`. `on` возвращает регистрацию с одним методом, `.catch(handler)`, который задаёт [обработчик ошибок](https://code.claude.com/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails) хука.
32 32
33| Аргумент | Что это |33| Аргумент | Что это |
34| :- | :- |34| :- | :- |
35| [`$`](/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | API модов: все методы из раздела [Методы API модов](#mods-api-methods). Записывайте каждый вызов полностью, пространство имён и затем метод, например `$.fs.read('notes.md')`. |35| [`$`](https://code.claude.com/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | API модов: все методы из раздела [Методы API модов](#mods-api-methods). Записывайте каждый вызов полностью, пространство имён и затем метод, например `$.fs.read('notes.md')`. |
36| [`e`](/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | Входные данные события в виде глубоко замороженных простых данных. Чтобы изменить их, передайте копию в `next`. |36| [`e`](https://code.claude.com/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | Входные данные события в виде глубоко замороженных простых данных. Чтобы изменить их, передайте копию в `next`. |
37| [`next(e)`](/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | Следующий обработчик, как в middleware. Запускает хуки, идущие после этого, а затем поведение Claude Code. Разрешается в результат события. |37| [`next(e)`](https://code.claude.com/docs/ru/plugins/mods/events#how-a-hook-handles-an-event) | Следующий обработчик, как в middleware. Запускает хуки, идущие после этого, а затем поведение Claude Code. Разрешается в результат события. |
38| [`next.signal`](/docs/ru/plugins/mods/api#stop-background-work) | `AbortSignal`, который прерывается, когда событие отменено |38| [`next.signal`](https://code.claude.com/docs/ru/plugins/mods/api#stop-background-work) | `AbortSignal`, который прерывается, когда событие отменено |
39| `next.origin` | `{ plugin, tier }` того, кто инициировал событие. Сам Claude Code — это `{ plugin: 'engine', tier: 'core' }`. `tier` мода — это его группа приоритета в [порядке запуска модов](/docs/ru/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append` или `builtin`. |39| `next.origin` | `{ plugin, tier }` того, кто инициировал событие. Сам Claude Code — это `{ plugin: 'engine', tier: 'core' }`. `tier` мода — это его группа приоритета в [порядке запуска модов](https://code.claude.com/docs/ru/plugins/mods/events.md#the-order-mods-run-in): `prepend`, `user`, `append` или `builtin`. |
40| `next.budget` | Ограничение времени хука в миллисекундах: `next.budget.ms` — всё ограничение, а `next.budget.remainingMs` — оставшееся на данный момент время |40| `next.budget` | Ограничение времени хука в миллисекундах: `next.budget.ms` — всё ограничение, а `next.budget.remainingMs` — оставшееся на данный момент время |
41| `next.to(e, tier)` | Переходит к более позднему уровню: `append`, `builtin` или `core`. `next.to(e, 'append')` пропускает моды, установленные пользователем. Вызвать его может только мод из `prependPlugins` или `appendPlugins`. |41| `next.to(e, tier)` | Переходит к более позднему уровню: `append`, `builtin` или `core`. `next.to(e, 'append')` пропускает моды, установленные пользователем. Вызвать его может только мод из `prependPlugins` или `appendPlugins`. |
42| `next.error` | Только в обработчике `.catch`. `kind` — это `throw` или `timeout`, если хук завершился сбоем, а `message` — текст ошибки. `kind` равно `re-entry`, если хук был пропущен, потому что событие возникло внутри вызова API модов, сделанного этим хуком или кодом вашего мода вне его хуков. Для `re-entry` требуется Claude Code v2.1.292 или новее. |42| `next.error` | Только в обработчике `.catch`. `kind` — это `throw` или `timeout`, если хук завершился сбоем, а `message` — текст ошибки. `kind` равно `re-entry`, если хук был пропущен, потому что событие возникло внутри вызова API модов, сделанного этим хуком или кодом вашего мода вне его хуков. Для `re-entry` требуется Claude Code v2.1.292 или новее. |
43| `next.error.cause` | Задаётся, только когда `kind` равно `re-entry`. `rewritten`, если хук `tool.call` или [`PreToolUse`](/docs/ru/hooks#pretooluse) изменил вызов API модов, из которого возникло событие, или хук `agent.spawn` изменил агента, запущенного этим вызовом. `lent`, если это событие инициировал метод, который другой мод добавляет в API модов, если только не применимо также `rewritten`. Для `lent` требуется Claude Code v2.1.292 или новее, а для `rewritten` — v2.1.300 или новее. |43| `next.error.cause` | Задаётся, только когда `kind` равно `re-entry`. `rewritten`, если хук `tool.call` или [`PreToolUse`](https://code.claude.com/docs/ru/hooks#pretooluse) изменил вызов API модов, из которого возникло событие, или хук `agent.spawn` изменил агента, запущенного этим вызовом. `lent`, если это событие инициировал метод, который другой мод добавляет в API модов, если только не применимо также `rewritten`. Для `lent` требуется Claude Code v2.1.292 или новее, а для `rewritten` — v2.1.300 или новее. |
44| `next.called` | Только в обработчике `.catch`. `true`, если хук вызвал `next`. |44| `next.called` | Только в обработчике `.catch`. `true`, если хук вызвал `next`. |
45 45
46## События46## События
55 55
56| Событие | Срабатывает, когда | Хук может вернуть |56| Событие | Срабатывает, когда | Хук может вернуть |
57| :- | :- | :- |57| :- | :- | :- |
58| [`tool.call`](/docs/ru/plugins/mods/events#guard-or-change-a-tool-call) | Инструмент вот-вот запустится | `next(e)`, `{ deny: reason }` или `{ result }` |58| [`tool.call`](https://code.claude.com/docs/ru/plugins/mods/events#guard-or-change-a-tool-call) | Инструмент вот-вот запустится | `next(e)`, `{ deny: reason }` или `{ result }` |
59| [`tool.check`](/docs/ru/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code решает, может ли вызов инструмента выполниться, после хуков `tool.call` и `PreToolUse`. `next(e)` разрешается в решение, к которому пришли правила, режим разрешений и эти хуки. | `next(e)` или `{ decision }`, где `decision` равно `allow`, `ask` или `deny`, с необязательным `reason` |59| [`tool.check`](https://code.claude.com/docs/ru/plugins/mods/events#where-settings-hooks-run-in-the-order) | Claude Code решает, может ли вызов инструмента выполниться, после хуков `tool.call` и `PreToolUse`. `next(e)` разрешается в решение, к которому пришли правила, режим разрешений и эти хуки. | `next(e)` или `{ decision }`, где `decision` равно `allow`, `ask` или `deny`, с необязательным `reason` |
60| `tool.describe` | Один раз для каждого инструмента, когда его описание впервые отправляется Claude. Второй раз для инструмента MCP, когда Claude загружает его через [поиск инструментов](/docs/ru/mcp.md#scale-with-mcp-tool-search); при этом `e.description` содержит текст, который Claude читает для загруженного инструмента. | `{ description }`, при необходимости с `isDeferred`, равным `true`, чтобы поместить инструмент за поиск инструментов, или `false`, чтобы загрузить его сразу |60| `tool.describe` | Один раз для каждого инструмента, когда его описание впервые отправляется Claude. Второй раз для инструмента MCP, когда Claude загружает его через [поиск инструментов](https://code.claude.com/docs/ru/mcp.md#scale-with-mcp-tool-search); при этом `e.description` содержит текст, который Claude читает для загруженного инструмента. | `{ description }`, при необходимости с `isDeferred`, равным `true`, чтобы поместить инструмент за поиск инструментов, или `false`, чтобы загрузить его сразу |
61 61
62#### Поля агента и организации в `tool.check`62#### Поля агента и организации в `tool.check`
63 63
64В хуке `tool.check` читайте эти поля, чтобы отличить вызов субагента от вызова основного диалога и узнать, требует ли ваша организация подтверждения для инструмента коннектора:64В хуке `tool.check` читайте эти поля, чтобы отличить вызов субагента от вызова основного диалога и узнать, требует ли ваша организация подтверждения для инструмента коннектора:
65 65
66* **`e.agentId`**: задано, когда вызов делает [субагент](/docs/ru/sub-agents.md) или [участник команды, работающий в том же процессе](/docs/ru/agent-teams.md#choose-a-display-mode), и отсутствует, когда вызов делает основной диалог66* **`e.agentId`**: задано, когда вызов делает [субагент](https://code.claude.com/docs/ru/sub-agents.md) или [участник команды, работающий в том же процессе](https://code.claude.com/docs/ru/agent-teams.md#choose-a-display-mode), и отсутствует, когда вызов делает основной диалог
67* **`e.ceiling`**: `ask` для инструмента коннектора, для которого ваша организация установила `ask`, в [сессиях, где эта настройка доходит до Claude Code](/docs/ru/mcp.md#organization-controls-on-connector-tools)67* **`e.ceiling`**: `ask` для инструмента коннектора, для которого ваша организация установила `ask`, в [сессиях, где эта настройка доходит до Claude Code](https://code.claude.com/docs/ru/mcp.md#organization-controls-on-connector-tools)
68 68
69В `tool.check` поля `e.agentId` и `e.ceiling` требуют Claude Code v2.1.290 или новее.69В `tool.check` поля `e.agentId` и `e.ceiling` требуют Claude Code v2.1.290 или новее.
70 70
71#### Поле `e.isReadOnly` в `tool.check`71#### Поле `e.isReadOnly` в `tool.check`
72 72
73В хуке `tool.check` поле `e.isReadOnly` равно `true`, когда инструмент сообщает, что этот вызов выполняется только для чтения. В противном случае поле отсутствует, а не равно `false`. Значение — это собственное сообщение инструмента, поэтому прочитайте раздел [Проверка того, выполняется ли вызов инструмента только для чтения](/docs/ru/plugins/mods/events.md#check-whether-a-tool-call-is-read-only), прежде чем подтверждать вызов только на основании этого поля.73В хуке `tool.check` поле `e.isReadOnly` равно `true`, когда инструмент сообщает, что этот вызов выполняется только для чтения. В противном случае поле отсутствует, а не равно `false`. Значение — это собственное сообщение инструмента, поэтому прочитайте раздел [Проверка того, выполняется ли вызов инструмента только для чтения](https://code.claude.com/docs/ru/plugins/mods/events.md#check-whether-a-tool-call-is-read-only), прежде чем подтверждать вызов только на основании этого поля.
74 74
75В `tool.check` поле `e.isReadOnly` требует Claude Code v2.1.304 или новее.75В `tool.check` поле `e.isReadOnly` требует Claude Code v2.1.304 или новее.
76 76
80 80
81| Событие | Срабатывает, когда | Хук может вернуть |81| Событие | Срабатывает, когда | Хук может вернуть |
82| :- | :- | :- |82| :- | :- | :- |
83| [`prompt.submit`](/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Промпт отправлен | `next({ ...e, text })`, `next({ ...e, context })` или `{ drop: reason }` |83| [`prompt.submit`](https://code.claude.com/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Промпт отправлен | `next({ ...e, text })`, `next({ ...e, context })` или `{ drop: reason }` |
84| `prompt.fill`, `prompt.suggest` | Текст вот-вот попадёт в поле промпта как черновик или как приглушённая подсказка | `next(e)` с изменённым текстом |84| `prompt.fill`, `prompt.suggest` | Текст вот-вот попадёт в поле промпта как черновик или как приглушённая подсказка | `next(e)` с изменённым текстом |
85| `prompt.edit` | Пользователь редактирует поле промпта | `next(e)` |85| `prompt.edit` | Пользователь редактирует поле промпта | `next(e)` |
86| `prompt.autocomplete` | Пользователь вводит текст в поле промпта, и у курсора заканчивается слово. `e.token` — это слово. Claude Code не ждёт хук: его собственные строки автодополнения показываются первыми. | `{ suggestions }` — список строк `{ text, label, description }`, которые показываются под собственными строками Claude Code. Выбор строки записывает её `text` поверх слова. |86| `prompt.autocomplete` | Пользователь вводит текст в поле промпта, и у курсора заканчивается слово. `e.token` — это слово. Claude Code не ждёт хук: его собственные строки автодополнения показываются первыми. | `{ suggestions }` — список строк `{ text, label, description }`, которые показываются под собственными строками Claude Code. Выбор строки записывает её `text` поверх слова. |
87| `prompt.compose` | Claude Code формирует системный промпт | `{ sections }` — список `{ id, text, scope }` в порядке отправки |87| `prompt.compose` | Claude Code формирует системный промпт | `{ sections }` — список `{ id, text, scope }` в порядке отправки |
88| [`prompt.section`](/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Один раз для каждого именованного раздела системного промпта. `e.name` — это `id` раздела в `prompt.compose`. | `{ text }` или `{ text: null }`, чтобы пропустить раздел |88| [`prompt.section`](https://code.claude.com/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Один раз для каждого именованного раздела системного промпта. `e.name` — это `id` раздела в `prompt.compose`. | `{ text }` или `{ text: null }`, чтобы пропустить раздел |
89| [`prompt.context`](/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Один раз для каждого диалога, для контекста, отправляемого с первым сообщением | `{ blocks }` |89| [`prompt.context`](https://code.claude.com/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Один раз для каждого диалога, для контекста, отправляемого с первым сообщением | `{ blocks }` |
90| `prompt.attachment` | Claude Code добавляет собственное сообщение для Claude, например напоминание. `e.type` указывает вид, а для видов, объявленных в типах, `e.detail` содержит факты, на основе которых написан текст. | `{ text }` или `{ text: null }`, чтобы пропустить его |90| `prompt.attachment` | Claude Code добавляет собственное сообщение для Claude, например напоминание. `e.type` указывает вид, а для видов, объявленных в типах, `e.detail` содержит факты, на основе которых написан текст. | `{ text }` или `{ text: null }`, чтобы пропустить его |
91| `prompt.mention` | Claude Code вот-вот прочитает файл, упомянутый в промпте через @. Требуется Claude Code v2.1.290 или новее. | `next({ ...e, path })`, чтобы прочитать другой файл, или `{ deny: reason }` |91| `prompt.mention` | Claude Code вот-вот прочитает файл, упомянутый в промпте через @. Требуется Claude Code v2.1.290 или новее. | `next({ ...e, path })`, чтобы прочитать другой файл, или `{ deny: reason }` |
92| [`skill.prompt`](/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Текст скилла раскрывается для Claude | `{ text }` |92| [`skill.prompt`](https://code.claude.com/docs/ru/plugins/mods/events#rewrite-or-add-to-a-prompt) | Текст скилла раскрывается для Claude | `{ text }` |
93| `attribution.text` | Claude Code составляет текст атрибуции для коммита или pull request | `{ text }` |93| `attribution.text` | Claude Code составляет текст атрибуции для коммита или pull request | `{ text }` |
94 94
95#### Поля источника и frontmatter в `skill.prompt`95#### Поля источника и frontmatter в `skill.prompt`
98 98
99| Поле | Тип | Что содержит |99| Поле | Тип | Что содержит |
100| :- | :- | :- |100| :- | :- | :- |
101| `e.source` | string | Кто предоставляет скилл: `policySettings`, `userSettings` или `projectSettings` для скилла в корпоративном, личном или проектном [расположении](/docs/ru/skills.md#where-skills-live) соответственно. Другие источники дают слово вроде `plugin`, `mcp`, `syncedSkills` или `built-in`. |101| `e.source` | string | Кто предоставляет скилл: `policySettings`, `userSettings` или `projectSettings` для скилла в корпоративном, личном или проектном [расположении](https://code.claude.com/docs/ru/skills.md#where-skills-live) соответственно. Другие источники дают слово вроде `plugin`, `mcp`, `syncedSkills` или `built-in`. |
102| `e.pluginName` | string | Имя плагина для скилла, у которого `e.source` равно `plugin` |102| `e.pluginName` | string | Имя плагина для скилла, у которого `e.source` равно `plugin` |
103| `e.path` | string | Абсолютный путь к файлу `SKILL.md` скилла или к его файлу `.md` для скилла, написанного как [файл команды](/docs/ru/skills.md#where-skills-live). Отсутствует, если у скилла нет файла на этой машине, как у встроенного скилла. |103| `e.path` | string | Абсолютный путь к файлу `SKILL.md` скилла или к его файлу `.md` для скилла, написанного как [файл команды](https://code.claude.com/docs/ru/skills.md#where-skills-live). Отсутствует, если у скилла нет файла на этой машине, как у встроенного скилла. |
104| `e.frontmatter` | object | Frontmatter файла скилла в виде простых данных |104| `e.frontmatter` | object | Frontmatter файла скилла в виде простых данных |
105| `e.frontmatterProblem` | string | Причина, по которой в `e.frontmatter` отсутствует frontmatter файла или один из его ключей, например `is a list or a single value, not a table`. Отсутствует, если `e.frontmatter` содержит весь frontmatter или у скилла его нет. |105| `e.frontmatterProblem` | string | Причина, по которой в `e.frontmatter` отсутствует frontmatter файла или один из его ключей, например `is a list or a single value, not a table`. Отсутствует, если `e.frontmatter` содержит весь frontmatter или у скилла его нет. |
106 106
107Хук может передать изменённые `text` или `frontmatter` в `next`: хуки после него читают оба поля, а Claude читает итоговый `text`. Хук, который изменяет любое другое поле, [завершается ошибкой](/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails).107Хук может передать изменённые `text` или `frontmatter` в `next`: хуки после него читают оба поля, а Claude читает итоговый `text`. Хук, который изменяет любое другое поле, [завершается ошибкой](https://code.claude.com/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails).
108 108
109В `skill.prompt` поля `e.source`, `e.pluginName`, `e.path`, `e.frontmatter` и `e.frontmatterProblem` требуют Claude Code v2.1.299 или новее.109В `skill.prompt` поля `e.source`, `e.pluginName`, `e.path`, `e.frontmatter` и `e.frontmatterProblem` требуют Claude Code v2.1.299 или новее.
110 110
114 114
115| Событие | Срабатывает, когда | Хук может вернуть |115| Событие | Срабатывает, когда | Хук может вернуть |
116| :- | :- | :- |116| :- | :- | :- |
117| [`command.run`](/docs/ru/plugins/mods/api#add-a-command) | Команда вот-вот запустится | `{ text }`, `{}` или `next(e)` |117| [`command.run`](https://code.claude.com/docs/ru/plugins/mods/api#add-a-command) | Команда вот-вот запустится | `{ text }`, `{}` или `next(e)` |
118| `command.describe` | Один раз для каждой команды, для списка команд | `{ description, argumentHint, isHidden }` |118| `command.describe` | Один раз для каждой команды, для списка команд | `{ description, argumentHint, isHidden }` |
119| `config.set` | Строка `/config` вот-вот изменится | `next({ ...e, value })` или `{ deny: reason }` |119| `config.set` | Строка `/config` вот-вот изменится | `next({ ...e, value })` или `{ deny: reason }` |
120| `config.describe` | Один раз для каждой строки `/config` | `{ label, description, isHidden }` |120| `config.describe` | Один раз для каждой строки `/config` | `{ label, description, isHidden }` |
125 125
126| Событие | Срабатывает, когда | Хук может вернуть |126| Событие | Срабатывает, когда | Хук может вернуть |
127| :- | :- | :- |127| :- | :- | :- |
128| [`turn.start`](/docs/ru/plugins/mods/events#follow-a-turn) | Начинается ход | `next(e)` |128| [`turn.start`](https://code.claude.com/docs/ru/plugins/mods/events#follow-a-turn) | Начинается ход | `next(e)` |
129| [`turn.step`](/docs/ru/plugins/mods/events#follow-a-turn) | Один запрос вот-вот отправится модели | `yield* next(e)` или `next({ ...e, model })`, `next({ ...e, effort })` |129| [`turn.step`](https://code.claude.com/docs/ru/plugins/mods/events#follow-a-turn) | Один запрос вот-вот отправится модели | `yield* next(e)` или `next({ ...e, model })`, `next({ ...e, effort })` |
130| [`turn.complete`](/docs/ru/plugins/mods/events#follow-a-turn) | Ход завершился | `next(e)` или `{ text }`, чтобы показать строку под ответом |130| [`turn.complete`](https://code.claude.com/docs/ru/plugins/mods/events#follow-a-turn) | Ход завершился | `next(e)` или `{ text }`, чтобы показать строку под ответом |
131 131
132### Сессия132### Сессия
133 133
135 135
136| Событие | Срабатывает, когда | Хук может вернуть |136| Событие | Срабатывает, когда | Хук может вернуть |
137| :- | :- | :- |137| :- | :- | :- |
138| [`session.start`](/docs/ru/plugins/mods/api#add-a-command-or-a-tool) | Один раз для каждого загруженного мода, перед первым промптом, и снова после перезагрузки этого мода. Не срабатывает после `/clear`, `/resume` или `/branch`. | `next(e)` |138| [`session.start`](https://code.claude.com/docs/ru/plugins/mods/api#add-a-command-or-a-tool) | Один раз для каждого загруженного мода, перед первым промптом, и снова после перезагрузки этого мода. Не срабатывает после `/clear`, `/resume` или `/branch`. | `next(e)` |
139| `session.end` | Сессия завершается или выполняется `/clear`, `/resume` либо `/branch`. `e.reason` — это `clear`, `resume`, `logout`, `prompt_input_exit` или `other`. `/branch` сообщает `resume`. | `next(e)` |139| `session.end` | Сессия завершается или выполняется `/clear`, `/resume` либо `/branch`. `e.reason` — это `clear`, `resume`, `logout`, `prompt_input_exit` или `other`. `/branch` сообщает `resume`. | `next(e)` |
140| `session.compact` | Диалог вот-вот будет сжат | `{ skip: reason }` |140| `session.compact` | Диалог вот-вот будет сжат | `{ skip: reason }` |
141| [`session.receive`](/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions) | Сообщение приходит от другого агента или сессии либо вот-вот будет отправлено им. См. [Отправка и получение сообщений между сессиями](/docs/ru/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` для `receive`, `{ isDelivered: false, reason }` для `send` |141| [`session.receive`](https://code.claude.com/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions), [`session.send`](https://code.claude.com/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions) | Сообщение приходит от другого агента или сессии либо вот-вот будет отправлено им. См. [Отправка и получение сообщений между сессиями](https://code.claude.com/docs/ru/plugins/mods/api.md#send-and-receive-messages-between-sessions). | `{ consumed: reason }` для `receive`, `{ isDelivered: false, reason }` для `send` |
142| `session.append` | Один раз для каждой строки, которую сохраняет диалог, например промпта, блока ответа, результата инструмента или уведомления, перед её сохранением | `next({ ...e, message })` с изменённым `message.content`, чтобы переписать текстовые блоки строки или `content` блока `tool_result` в ней |142| `session.append` | Один раз для каждой строки, которую сохраняет диалог, например промпта, блока ответа, результата инструмента или уведомления, перед её сохранением | `next({ ...e, message })` с изменённым `message.content`, чтобы переписать текстовые блоки строки или `content` блока `tool_result` в ней |
143| `session.attach`, `session.detach` | Другое приложение подключается к сессии или отключается от неё | `next(e)` |143| `session.attach`, `session.detach` | Другое приложение подключается к сессии или отключается от неё | `next(e)` |
144| `session.measure` | После каждого хода, а также когда меняется процент использования лимита тарифа | `next(e)` |144| `session.measure` | После каждого хода, а также когда меняется процент использования лимита тарифа | `next(e)` |
150| Событие | Срабатывает, когда | Хук может вернуть |150| Событие | Срабатывает, когда | Хук может вернуть |
151| :- | :- | :- |151| :- | :- | :- |
152| `agent.offer` | Тип субагента предлагается Claude | `{ isOffered: false }`, чтобы скрыть его |152| `agent.offer` | Тип субагента предлагается Claude | `{ isOffered: false }`, чтобы скрыть его |
153| `agent.spawn` | Субагент или участник [команды агентов](/docs/ru/agent-teams.md) вот-вот запустится. Для участника команды `e.isTeammate` равно `true`. | `next({ ...e, model })`, чтобы выбрать его модель, или `{ deny: reason }` |153| `agent.spawn` | Субагент или участник [команды агентов](https://code.claude.com/docs/ru/agent-teams.md) вот-вот запустится. Для участника команды `e.isTeammate` равно `true`. | `next({ ...e, model })`, чтобы выбрать его модель, или `{ deny: reason }` |
154 154
155Когда Claude возобновляет субагента с помощью инструмента [`SendMessage`](/docs/ru/sub-agents#resume-subagents), ваш хук `agent.spawn` повторно не запускается. Чтобы отклонять вызовы `SendMessage`, которые возобновляют субагента, сопоставляйте этот инструмент в хуке [`tool.call`](/docs/ru/plugins/mods/events#guard-or-change-a-tool-call).155Когда Claude возобновляет субагента с помощью инструмента [`SendMessage`](https://code.claude.com/docs/ru/sub-agents#resume-subagents), ваш хук `agent.spawn` повторно не запускается. Чтобы отклонять вызовы `SendMessage`, которые возобновляют субагента, сопоставляйте этот инструмент в хуке [`tool.call`](https://code.claude.com/docs/ru/plugins/mods/events#guard-or-change-a-tool-call).
156 156
157### Интерфейс157### Интерфейс
158 158
159События интерфейса срабатывают, когда Claude Code рисует точку отрисовки и когда пользователь использует элемент управления, нарисованный модом. В разделе [Рисование в интерфейсе](/docs/ru/plugins/mods/interface.md) показано, что возвращает хук `ui.render`:159События интерфейса срабатывают, когда Claude Code рисует точку отрисовки и когда пользователь использует элемент управления, нарисованный модом. В разделе [Рисование в интерфейсе](https://code.claude.com/docs/ru/plugins/mods/interface.md) показано, что возвращает хук `ui.render`:
160 160
161| Событие | Срабатывает, когда |161| Событие | Срабатывает, когда |
162| :- | :- |162| :- | :- |
163| [`ui.render`](/docs/ru/plugins/mods/interface#pick-where-to-draw) | [Точка отрисовки](#render-sites) вот-вот будет нарисована |163| [`ui.render`](https://code.claude.com/docs/ru/plugins/mods/interface#pick-where-to-draw) | [Точка отрисовки](#render-sites) вот-вот будет нарисована |
164| `ui.resolve` | Загружаются моды, один раз для каждого приложения, точки отрисовки и мода. Результат — таблица элементов, которую читает `$.ui.resolve(e)`. |164| `ui.resolve` | Загружаются моды, один раз для каждого приложения, точки отрисовки и мода. Результат — таблица элементов, которую читает `$.ui.resolve(e)`. |
165| [`ui.press`](/docs/ru/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](/docs/ru/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](/docs/ru/plugins/mods/interface#respond-to-presses-and-typing) | Используется `Button`, `Input` или `Select`, нарисованный модом |165| [`ui.press`](https://code.claude.com/docs/ru/plugins/mods/interface#respond-to-presses-and-typing), [`ui.input`](https://code.claude.com/docs/ru/plugins/mods/interface#respond-to-presses-and-typing), [`ui.select`](https://code.claude.com/docs/ru/plugins/mods/interface#respond-to-presses-and-typing) | Используется `Button`, `Input` или `Select`, нарисованный модом |
166| `ui.focus`, `ui.scroll` | Вот-вот изменится элемент управления в фокусе или позиция прокрутки панели или полосы |166| `ui.focus`, `ui.scroll` | Вот-вот изменится элемент управления в фокусе или позиция прокрутки панели или полосы |
167| `ui.close` | Панель вот-вот закроется. `e.id` — это панель, а `e.origin.kind` — `plugin`, `person` или `unload`. |167| `ui.close` | Панель вот-вот закроется. `e.id` — это панель, а `e.origin.kind` — `plugin`, `person` или `unload`. |
168| [`ui.message`](/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | Элемент `Client` отправляет данные своему моду |168| [`ui.message`](https://code.claude.com/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | Элемент `Client` отправляет данные своему моду |
169| [`ui.fault`](/docs/ru/plugins/mods/interface#redraw-when-something-changes) | Элемент `Client`, нарисованный вашим модом, не удалось загрузить, отрисовать или запустить. `e.phase` — это `load`, `render` или `run`, а `e.reason` — сообщение об ошибке. Требуется Claude Code v2.1.289 или новее. |169| [`ui.fault`](https://code.claude.com/docs/ru/plugins/mods/interface#redraw-when-something-changes) | Элемент `Client`, нарисованный вашим модом, не удалось загрузить, отрисовать или запустить. `e.phase` — это `load`, `render` или `run`, а `e.reason` — сообщение об ошибке. Требуется Claude Code v2.1.289 или новее. |
170 170
171### Другие моды171### Другие моды
172 172
174 174
175| Событие | Срабатывает, когда | Хук может вернуть |175| Событие | Срабатывает, когда | Хук может вернуть |
176| :- | :- | :- |176| :- | :- | :- |
177| [`plugin.register`](/docs/ru/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Модуль хуков вот-вот загрузится. `e.uses` перечисляет его события, вызовы API модов, переменные окружения и состояние в том виде, в каком их выводит `claude plugin validate`. Каждый вызов записан без префикса `$.`, например `fs.read`. | `{ refuse: reason }` |177| [`plugin.register`](https://code.claude.com/docs/ru/plugins/mods/admin#enforce-a-policy-with-a-mod-of-your-own) | Модуль хуков вот-вот загрузится. `e.uses` перечисляет его события, вызовы API модов, переменные окружения и состояние в том виде, в каком их выводит `claude plugin validate`. Каждый вызов записан без префикса `$.`, например `fs.read`. | `{ refuse: reason }` |
178| `engine.create` | Для этого мода строится API модов | Изменённый API модов, чтобы добавить пространство имён. Мод вне [уровня](#the-hook-function) `user` также может скрыть его. |178| `engine.create` | Для этого мода строится API модов | Изменённый API модов, чтобы добавить пространство имён. Мод вне [уровня](#the-hook-function) `user` также может скрыть его. |
179 179
180Когда хук другого мода вызывает метод пространства имён, которое вы добавили в `engine.create`, вызовы `$` вашего метода выполняются в контексте этого хука, пока все хуки на этом событии не вернут результат. Например, относительный путь разрешается относительно рабочего каталога этого хука, а `$.prompt.submit` отклоняется, пока ход ожидает этот хук. Вызовы, которые ваш метод делает после этого, выполняются в собственном контексте вашего мода.180Когда хук другого мода вызывает метод пространства имён, которое вы добавили в `engine.create`, вызовы `$` вашего метода выполняются в контексте этого хука, пока все хуки на этом событии не вернут результат. Например, относительный путь разрешается относительно рабочего каталога этого хука, а `$.prompt.submit` отклоняется, пока ход ожидает этот хук. Вызовы, которые ваш метод делает после этого, выполняются в собственном контексте вашего мода.
189 189
190### События хуков настроек190### События хуков настроек
191 191
192Каждое [событие хука настроек](/docs/ru/hooks.md#hook-events) — это событие с именем `classic.<Event>`, например `classic.Stop` или `classic.PostToolUse`. `e` — это JSON, который хук получает через stdin.192Каждое [событие хука настроек](https://code.claude.com/docs/ru/hooks.md#hook-events) — это событие с именем `classic.<Event>`, например `classic.Stop` или `classic.PostToolUse`. `e` — это JSON, который хук получает через stdin.
193 193
194### Вызовы API модов194### Вызовы API модов
195 195
197 197
198## Методы API модов198## Методы API модов
199 199
200API модов — это аргумент `$`, который получает каждый хук. Его методы сгруппированы по пространствам имён, например `$.ui`. В этой таблице методы каждого пространства имён перечислены по имени, поэтому `open` в строке `$.ui` — это вызов `$.ui.open(...)`. В руководствах показано использование распространённых методов, а в [типах для вашей сборки](/docs/ru/plugins/mods/create.md#get-the-types-for-your-build) каждый метод документирован с примером.200API модов — это аргумент `$`, который получает каждый хук. Его методы сгруппированы по пространствам имён, например `$.ui`. В этой таблице методы каждого пространства имён перечислены по имени, поэтому `open` в строке `$.ui` — это вызов `$.ui.open(...)`. В руководствах показано использование распространённых методов, а в [типах для вашей сборки](https://code.claude.com/docs/ru/plugins/mods/create.md#get-the-types-for-your-build) каждый метод документирован с примером.
201 201
202| Пространство имён | Методы |202| Пространство имён | Методы |
203| :- | :- |203| :- | :- |
204| `$.plugin` | `name`, `root`: имя и каталог этого плагина |204| `$.plugin` | `name`, `root`: имя и каталог этого плагина |
205| [`$.ui`](/docs/ru/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |205| [`$.ui`](https://code.claude.com/docs/ru/plugins/mods/interface#pick-where-to-draw) | `resolve`, `invalidate`, `open`, `close`, `panes`, `focus`, `scroll`, `toast`, `notify`, `status`, `log`, `notice`, `ask`, `copy`, `selection`, `blit` |
206| [`$.command`](/docs/ru/plugins/mods/api#add-a-command) | `register`, `run`, `list` |206| [`$.command`](https://code.claude.com/docs/ru/plugins/mods/api#add-a-command) | `register`, `run`, `list` |
207| [`$.tool`](/docs/ru/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |207| [`$.tool`](https://code.claude.com/docs/ru/plugins/mods/api#add-a-tool) | `register`, `call`, `check`, `list` |
208| `$.agent` | `register`, `spawn`, `list`. `list()` возвращает субагентов и участников команды агентов этой сессии, у каждого из которых есть `status` со значением `pending`, `running`, `waiting`, `idle`, `completed`, `failed` или `killed`, причём `idle` и `waiting` требуют Claude Code v2.1.289 или более поздней версии. |208| `$.agent` | `register`, `spawn`, `list`. `list()` возвращает субагентов и участников команды агентов этой сессии, у каждого из которых есть `status` со значением `pending`, `running`, `waiting`, `idle`, `completed`, `failed` или `killed`, причём `idle` и `waiting` требуют Claude Code v2.1.289 или более поздней версии. |
209| [`$.model`](/docs/ru/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |209| [`$.model`](https://code.claude.com/docs/ru/plugins/mods/api#call-a-model) | `complete`, `fork`, `classify` |
210| [`$.prompt`](/docs/ru/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude читает текст из `submit({ text })` после предложения, называющего ваш мод отправителем. `submit({ text, asUser: true })` отправляет текст как собственные слова пользователя, без этого предложения. |210| [`$.prompt`](https://code.claude.com/docs/ru/plugins/mods/api#start-a-turn-from-a-background-job) | `submit`, `read`, `fill`, `suggest`, `compose`. Claude читает текст из `submit({ text })` после предложения, называющего ваш мод отправителем. `submit({ text, asUser: true })` отправляет текст как собственные слова пользователя, без этого предложения. |
211| `$.turn` | `abort` |211| `$.turn` | `abort` |
212| [`$.session`](/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` возвращает `{ startedAt, context, rateLimits, cost }`: `context` содержит `tokens`, `window` и `percent`, а `rateLimits` — это список `{ kind, percentUsed, resetsAt }`. |212| [`$.session`](https://code.claude.com/docs/ru/plugins/mods/api#send-and-receive-messages-between-sessions) | `messages`, `cwd`, `root`, `model`, `turns`, `id`, `repo`, `surfaces`, `usage`, `version`, `compact`, `send`, `append`, `authorize`. `usage()` возвращает `{ startedAt, context, rateLimits, cost }`: `context` содержит `tokens`, `window` и `percent`, а `rateLimits` — это список `{ kind, percentUsed, resetsAt }`. |
213| `$.config` | `list`, `set` |213| `$.config` | `list`, `set` |
214| [`$.settings`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `read` |214| [`$.settings`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `read` |
215| [`$.env`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |215| [`$.env`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `get`, `set` |
216| [`$.fs`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` не атомарен: он заменяет содержимое файла на месте, поэтому другой процесс может прочитать частично записанный файл. Храните данные, которые изменяют несколько сессий, в `$.store`. |216| [`$.fs`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `read`, `write`, `list`, `exists`, `stat`, `ancestors`. `write` не атомарен: он заменяет содержимое файла на месте, поэтому другой процесс может прочитать частично записанный файл. Храните данные, которые изменяют несколько сессий, в `$.store`. |
217| [`$.store`](/docs/ru/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Хранилище «ключ–значение», общее для всех сессий на машине. См. [Сохранение из нескольких сессий](/docs/ru/plugins/mods/interface.md#save-from-more-than-one-session). |217| [`$.store`](https://code.claude.com/docs/ru/plugins/mods/interface#keep-state) | `get`, `set`, `delete`, `keys`. Хранилище «ключ–значение», общее для всех сессий на машине. См. [Сохранение из нескольких сессий](https://code.claude.com/docs/ru/plugins/mods/interface.md#save-from-more-than-one-session). |
218| [`$.state`](/docs/ru/plugins/mods/interface#keep-a-value-in-\$-state) | Реактивное состояние: `get`, `set`, со вспомогательными функциями `atom`, `read`, `update`, `derive` и `memberOf`, импортируемыми из `claude-code` |218| [`$.state`](https://code.claude.com/docs/ru/plugins/mods/interface#keep-a-value-in-\$-state) | Реактивное состояние: `get`, `set`, со вспомогательными функциями `atom`, `read`, `update`, `derive` и `memberOf`, импортируемыми из `claude-code` |
219| [`$.clock`](/docs/ru/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |219| [`$.clock`](https://code.claude.com/docs/ru/plugins/mods/api#run-work-in-the-background) | `now`, `sleep`, `after`, `every` |
220| [`$.http`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |220| [`$.http`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `fetch` |
221| [`$.process`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |221| [`$.process`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `run`, `spawn` |
222| [`$.mcp`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` подключает MCP-сервер, указанный в манифесте вашего собственного плагина. |222| [`$.mcp`](https://code.claude.com/docs/ru/plugins/mods/api#reach-files-processes-and-the-network) | `call`, `connect`. `connect(server)` подключает MCP-сервер, указанный в манифесте вашего собственного плагина. |
223| `$.audio` | `play`, `speak` |223| `$.audio` | `play`, `speak` |
224| `$.telemetry` | `log`, `mark`. Запись отправляется, только если вызов делает Claude Code или встроенный мод. |224| `$.telemetry` | `log`, `mark`. Запись отправляется, только если вызов делает Claude Code или встроенный мод. |
225 225
226## Точки отрисовки226## Точки отрисовки
227 227
228Точка отрисовки — это точка расширения в интерфейсе Claude Code. Каждая строка — это значение `e.component` в хуке `ui.render` с полями `e.props` и приложениями, которые её отрисовывают. `e.surface` указывает приложение, которое выполняет отрисовку, например `terminal`, `desktop` или `vscode`. В разделе [Изменение того, что уже рисует Claude Code](/docs/ru/plugins/mods/interface.md#change-what-claude-code-already-draws) показано, что хук может делать в точке отрисовки, с примером для каждого варианта.228Точка отрисовки — это точка расширения в интерфейсе Claude Code. Каждая строка — это значение `e.component` в хуке `ui.render` с полями `e.props` и приложениями, которые её отрисовывают. `e.surface` указывает приложение, которое выполняет отрисовку, например `terminal`, `desktop` или `vscode`. В разделе [Изменение того, что уже рисует Claude Code](https://code.claude.com/docs/ru/plugins/mods/interface.md#change-what-claude-code-already-draws) показано, что хук может делать в точке отрисовки, с примером для каждого варианта.
229 229
230Для отрисовки в расширении VS Code требуется расширение версии 2.1.299 или новее. Сессии, которая [не получает флаги функций](/docs/ru/env-vars.md#features-that-need-feature-flag-fetching), требуется версия 2.1.304 или новее. В разделе [Рисование в расширении VS Code](/docs/ru/plugins/mods/interface.md#draw-in-the-vs-code-extension) перечислено, что расширение рисует иначе.230Для отрисовки в расширении VS Code требуется расширение версии 2.1.299 или новее. Сессии, которая [не получает флаги функций](https://code.claude.com/docs/ru/env-vars.md#features-that-need-feature-flag-fetching), требуется версия 2.1.304 или новее. В разделе [Рисование в расширении VS Code](https://code.claude.com/docs/ru/plugins/mods/interface.md#draw-in-the-vs-code-extension) перечислено, что расширение рисует иначе.
231 231
232| Точка | `e.props` | `e.requestId` | Отрисовывается в |232| Точка | `e.props` | `e.requestId` | Отрисовывается в |
233| :- | :- | :- | :- |233| :- | :- | :- | :- |
234| [`Pane`](/docs/ru/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | `id` панели | Terminal, Desktop, VS Code |234| [`Pane`](https://code.claude.com/docs/ru/plugins/mods/interface#pick-where-to-draw) | `title`, `isFocused`, `bodyColumns`, `placement`, `scroll`, `view` | `id` панели | Terminal, Desktop, VS Code |
235| [`AbovePrompt`](/docs/ru/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Один экземпляр | Terminal, Desktop |235| [`AbovePrompt`](https://code.claude.com/docs/ru/plugins/mods/interface#pick-where-to-draw) | `hasSurvey`, `isWorking`, `maxRows`, `bodyColumns`, `scroll`, `view` | Один экземпляр | Terminal, Desktop |
236| `UserMessage` | `text`, `origin`, `isExpanded` и `task` или `from` в зависимости от источника | id сообщения | Terminal, Desktop, VS Code |236| `UserMessage` | `text`, `origin`, `isExpanded` и `task` или `from` в зависимости от источника | id сообщения | Terminal, Desktop, VS Code |
237| `AssistantMessage` | Текст ответа | id сообщения | Terminal, Desktop, VS Code |237| `AssistantMessage` | Текст ответа | id сообщения | Terminal, Desktop, VS Code |
238| `ToolUse`, `ToolResult`, `ToolGroup` | Имя, входные данные и результат инструмента | id вызова инструмента | Terminal, Desktop, VS Code |238| `ToolUse`, `ToolResult`, `ToolGroup` | Имя, входные данные и результат инструмента | id вызова инструмента | Terminal, Desktop, VS Code |
239| `CommandOutput` | `command`, `text` | id сообщения | Terminal, Desktop |239| `CommandOutput` | `command`, `text` | id сообщения | Terminal, Desktop |
240| [`AskUserQuestion`](/docs/ru/plugins/mods/interface#change-what-claude-code-already-draws) | Вопрос и варианты | id вызова инструмента | Terminal, Desktop, VS Code |240| [`AskUserQuestion`](https://code.claude.com/docs/ru/plugins/mods/interface#change-what-claude-code-already-draws) | Вопрос и варианты | id вызова инструмента | Terminal, Desktop, VS Code |
241| `ToolProgress` | `kind` | id вызова инструмента | Terminal |241| `ToolProgress` | `kind` | id вызова инструмента | Terminal |
242| [`Spinner`](/docs/ru/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | id агента | Terminal, Desktop, VS Code |242| [`Spinner`](https://code.claude.com/docs/ru/plugins/mods/interface#change-what-claude-code-already-draws) | `word`, `message`, `suffix`, `mode` | id агента | Terminal, Desktop, VS Code |
243| `TurnDuration` | `word`, `durationMs` | id сообщения | Terminal |243| `TurnDuration` | `word`, `durationMs` | id сообщения | Terminal |
244| `InfoNotice` | `text`, `command` | id сообщения | Terminal |244| `InfoNotice` | `text`, `command` | id сообщения | Terminal |
245| `SessionMode` | `modes` | Один экземпляр | Terminal, Desktop |245| `SessionMode` | `modes` | Один экземпляр | Terminal, Desktop |
251 251
252* **Ширина `Pane` или полосы**: рисуйте по `e.props.bodyColumns`252* **Ширина `Pane` или полосы**: рисуйте по `e.props.bodyColumns`
253* **Высота `Pane` рядом с транскриптом**: когда `e.props.placement` равно `'dock'`, `e.props.scroll.bodyRows` — это число строк, которые панель отводит под ваше дерево253* **Высота `Pane` рядом с транскриптом**: когда `e.props.placement` равно `'dock'`, `e.props.scroll.bodyRows` — это число строк, которые панель отводит под ваше дерево
254* **Высота `Pane` над промптом**: когда `e.props.placement` равно `'inline'`, панель растёт вместе с вашим деревом до предела, а `bodyRows` — это этот предел. Чтобы запросить другой предел, см. [поле `rows` в `$.ui.open`](/docs/ru/plugins/mods/interface#open-a-pane-at-the-right-time).254* **Высота `Pane` над промптом**: когда `e.props.placement` равно `'inline'`, панель растёт вместе с вашим деревом до предела, а `bodyRows` — это этот предел. Чтобы запросить другой предел, см. [поле `rows` в `$.ui.open`](https://code.claude.com/docs/ru/plugins/mods/interface#open-a-pane-at-the-right-time).
255 255
256Дерево, которое выше панели, прокручивается целиком.256Дерево, которое выше панели, прокручивается целиком.
257 257
258## Элементы258## Элементы
259 259
260Элементы — это строительные блоки дерева, которое возвращает хук `ui.render`, и вы получаете их из `$.ui.resolve(e)`. В разделе [Построение дерева из элементов](/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) показаны распространённые элементы и то, как их рисует терминал, а в [галерее интерфейса](/docs/ru/plugins/mods/gallery.md) есть снимки экрана большинства из них. Галочка означает, что приложение умеет рисовать элемент.260Элементы — это строительные блоки дерева, которое возвращает хук `ui.render`, и вы получаете их из `$.ui.resolve(e)`. В разделе [Построение дерева из элементов](https://code.claude.com/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) показаны распространённые элементы и то, как их рисует терминал, а в [галерее интерфейса](https://code.claude.com/docs/ru/plugins/mods/gallery.md) есть снимки экрана большинства из них. Галочка означает, что приложение умеет рисовать элемент.
261 261
262| Элемент | Основные пропсы | Terminal | Desktop | VS Code |262| Элемент | Основные пропсы | Terminal | Desktop | VS Code |
263| :- | :- | :-: | :-: | :-: |263| :- | :- | :-: | :-: | :-: |
264| [`Box`](/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `key`, flex-раскладка, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, [`borderStyle`](#box-border-styles), `backgroundColor`, `position`, `hover` | ✓ | ✓ | ✓ |264| [`Box`](https://code.claude.com/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `key`, flex-раскладка, [`gap`, `padding`, `margin`](#box-spacing-steps), `width`, `height`, `minWidth`, `minHeight`, [`borderStyle`](#box-border-styles), `borderColor`, `borderDimColor`, `backgroundColor`, `position`, `top`, `left`, `right`, `bottom`, `overflow`, `display`, `hover` | ✓ | ✓ | ✓ |
265| [`Text`](/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography) | ✓ | ✓ | ✓ |265| [`Text`](https://code.claude.com/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `color`, `backgroundColor`, [`bold`](#text-bold), `italic`, `underline`, `strikethrough`, `dimColor`, `inverse`, `wrap`, [`size`, `weight`, `mono`, `tabular`](#text-typography), `hover` | ✓ | ✓ | ✓ |
266| [`Button`](/docs/ru/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action` | ✓ | ✓ | ✓ |266| [`Button`](https://code.claude.com/docs/ru/plugins/mods/interface#respond-to-presses-and-typing) | `key`, `label`, `onPress`, `hotkey`, `plain`, `dimColor`, `autoFocus`, `action`, `hover` | ✓ | ✓ | ✓ |
267| [`Link`](/docs/ru/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. См. [Ограничения](#limits). | ✓ | ✓ | ✓ |267| [`Link`](https://code.claude.com/docs/ru/plugins/mods/interface#link-in-the-desktop-app) | `href`, `label`. См. [Ограничения](#limits). | ✓ | ✓ | ✓ |
268| [`Code`](/docs/ru/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |268| [`Code`](https://code.claude.com/docs/ru/plugins/mods/gallery#show-code-and-changes) | `source`, `language`, `path`, `startLine`, `format`, `wrap` | ✓ | ✓ | ✓ |
269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |269| `Markdown` | `text`, `key`, `dimColor`, `onLinkPress`, `pressableLinks` | ✓ | ✓ | ✓ |
270| [`Input`](/docs/ru/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |270| [`Input`](https://code.claude.com/docs/ru/plugins/mods/interface#take-typed-input-and-draw-a-row-for-each-item) | `key`, `label`, `placeholder`, `value`, `submitLabel`, `onSubmit`, `onInput`, `autoFocus` | ✓ | ✓ | ✓ |
271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |271| `Select` | `key`, `label`, `options`, `value`, `onSelect`, `autoFocus` | ✓ | ✓ | ✓ |
272| `Svg` | SVG-документ, до 131 072 символов | | ✓ | ✓ |272| `Svg` | `source` с SVG-разметкой до 131 072 символов, текст `alt`, `width`, `height` и `isInteractive` | | ✓ | ✓ |
273| [`Client`](/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key` | ✓ | ✓ | |273| [`Client`](https://code.claude.com/docs/ru/plugins/mods/interface#build-a-tree-from-elements) | `module`, `key`, `props`, `width`, `height`, `flexGrow` | ✓ | ✓ | |
274| [`Raster`](/docs/ru/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` до 512, `rows` до 256, `cells`. См. [Рисование сетки цветных ячеек](/docs/ru/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |274| [`Raster`](https://code.claude.com/docs/ru/plugins/mods/interface#draw-a-grid-of-colored-cells) | `key`, `columns` до 512, `rows` до 256, `cells`. См. [Рисование сетки цветных ячеек](https://code.claude.com/docs/ru/plugins/mods/interface.md#draw-a-grid-of-colored-cells). | ✓ | | |
275| `Image` | Байты PNG или RGBA до 2 МиБ либо путь к файлу, `columns` и `rows` до 255, а также текст `alt`. См. [какие терминалы его рисуют](/docs/ru/plugins/mods/gallery.md#image-and-client). | ✓ | | |275| `Image` | `key`, `source`, например байты PNG или RGBA до 2 МиБ либо путь к файлу, `columns` и `rows` до 255, а также текст `alt`. См. [какие терминалы его рисуют](https://code.claude.com/docs/ru/plugins/mods/gallery.md#image-and-client). | ✓ | | |
276 276
277Дополнительные правила для `Button`: `action` указывает одно из собственных [действий сочетаний клавиш](/docs/ru/keybindings.md) Claude Code, и сочетание, назначенное пользователем для этого действия, нажимает кнопку, если это аккорд или клавиша с модификатором. Цифровой `hotkey` на кнопке в полосе также срабатывает, когда пользователь вводит только эту цифру в пустой промпт и делает паузу. Если две кнопки в одной отрисовке указывают один и тот же `hotkey`, он достаётся более поздней. `autoFocus` на любом элементе управления принимает только `true`, поэтому, чтобы отключить его, опустите этот проп.277Дополнительные правила для `Button`:
278
279* **`action`**: указывает одно из собственных [действий сочетаний клавиш](https://code.claude.com/docs/ru/keybindings.md) Claude Code, и сочетание, назначенное пользователем для этого действия, нажимает кнопку, если это аккорд или клавиша с модификатором
280* **Цифровые горячие клавиши на полосе**: цифровой `hotkey` на кнопке в полосе также срабатывает, когда пользователь вводит только эту цифру в пустой промпт и делает паузу
281* **Свёрнутая полоса**: пока полоса [свёрнута](https://code.claude.com/docs/ru/plugins/mods/interface.md#when-the-user-collapses-the-band), ни привязка `action`, ни горячая клавиша не нажимают кнопку в ней
282* **Две кнопки с одной горячей клавишей**: если две кнопки в одной отрисовке указывают один и тот же `hotkey`, он достаётся более поздней
283
284`autoFocus` на любом элементе управления принимает только `true`, поэтому, чтобы отключить его, опустите этот проп.
278 285
279Расширение VS Code игнорирует некоторые пропсы элементов и рисует элемент так, как если бы вы их не указали:286Расширение VS Code игнорирует некоторые пропсы элементов и рисует элемент так, как если бы вы их не указали:
280 287
281* **`Box`**: `position` и `hover`288* **`Box`**: `position` вместе с его `top`, `left`, `right` и `bottom`, `alignSelf`, `borderDimColor` и `hover`
282* **`Text`**: `size`, `mono` и `tabular`289* **`Text`**: `size`, `mono`, `tabular` и `hover`
283* **`Button`**: `hotkey`, `plain`, `autoFocus` и `action`, поэтому там пользователь нажимает кнопку щелчком или клавишей Enter, когда кнопка в фокусе290* **`Button`**: `hotkey`, `plain`, `autoFocus`, `action` и `hover`, поэтому там пользователь нажимает кнопку щелчком или клавишей Enter, когда кнопка в фокусе
284* **`Code`**: `language`, `path`, `startLine`, `format` и `wrap`, поэтому код рисуется без цветов и номеров строк, а блок с `format: 'diff'` показывает необработанный текст diff291* **`Code`**: `language`, `path`, `startLine`, `format` и `wrap`, поэтому код рисуется без цветов и номеров строк, а блок с `format: 'diff'` показывает необработанный текст diff
285* **`Input` и `Select`**: `autoFocus`292* **`Input` и `Select`**: `autoFocus`
293* **`Svg`**: `isInteractive`
286 294
287### Стили рамки `Box`295### Стили рамки `Box`
288 296
317 325
318Если задать для `gap`, `padding` или `margin` шаг, он применяется сразу и по горизонтали, и по вертикали. Например, в терминале и расширении VS Code `padding: 'md'` означает две ячейки с каждой стороны и одну строку сверху и снизу.326Если задать для `gap`, `padding` или `margin` шаг, он применяется сразу и по горизонтали, и по вертикали. Например, в терминале и расширении VS Code `padding: 'md'` означает две ячейки с каждой стороны и одну строку сверху и снизу.
319 327
320Имена шагов требуют Claude Code v2.1.299 или более поздней версии. В более ранних выпусках Claude Code [рисует собственную версию сайта](/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) вместо дерева, в котором используется имя шага.328Имена шагов требуют Claude Code v2.1.299 или более поздней версии. В более ранних выпусках Claude Code [рисует собственную версию сайта](https://code.claude.com/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) вместо дерева, в котором используется имя шага.
321 329
322### Типографские пропсы `Text`330### Типографские пропсы `Text`
323 331
330| `mono` | `true`, чтобы запросить моноширинный шрифт приложения | Игнорируется: терминал всегда моноширинный | Игнорируется, поэтому текст сохраняет собственный шрифт расширения |338| `mono` | `true`, чтобы запросить моноширинный шрифт приложения | Игнорируется: терминал всегда моноширинный | Игнорируется, поэтому текст сохраняет собственный шрифт расширения |
331| `tabular` | `true`, чтобы запросить цифры одинаковой ширины, чтобы число, обновляемое на месте, или столбец чисел оставались выровненными | Игнорируется: цифры в терминале и так занимают одну ячейку | Игнорируется |339| `tabular` | `true`, чтобы запросить цифры одинаковой ширины, чтобы число, обновляемое на месте, или столбец чисел оставались выровненными | Игнорируется: цифры в терминале и так занимают одну ячейку | Игнорируется |
332 340
333Эти четыре пропса требуют Claude Code v2.1.299 или более поздней версии. В более ранних выпусках Claude Code [рисует собственную версию сайта](/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) вместо дерева, в котором задан `size`, `weight`, `mono` или `tabular`.341Эти четыре пропса требуют Claude Code v2.1.299 или более поздней версии. В более ранних выпусках Claude Code [рисует собственную версию сайта](https://code.claude.com/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements) вместо дерева, в котором задан `size`, `weight`, `mono` или `tabular`.
334 342
335#### Замена `bold` на `weight`343#### Замена `bold` на `weight`
336 344
337`bold` для `Text` объявлен устаревшим в пользу `weight`, но по-прежнему работает. Чтобы заменить его для `Text` без `weight`, измените `bold: true` на `weight: 'semibold'` — в Claude Code v2.1.299 или более поздней версии результат будет тем же.345`bold` для `Text` объявлен устаревшим в пользу `weight`, но по-прежнему работает. Чтобы заменить его для `Text` без `weight`, измените `bold: true` на `weight: 'semibold'` — в Claude Code v2.1.299 или более поздней версии результат будет тем же.
338 346
339В выпусках до v2.1.299 дерево, в котором задан `weight`, не рисуется, и вместо него Claude Code [рисует собственную версию сайта](/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements). Если задать для `Text` и `bold`, и `weight`, `bold` не действует.347В выпусках до v2.1.299 дерево, в котором задан `weight`, не рисуется, и вместо него Claude Code [рисует собственную версию сайта](https://code.claude.com/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements). Если задать для `Text` и `bold`, и `weight`, `bold` не действует.
340 348
341## Ограничения349## Ограничения
342 350
346| :- | :- |354| :- | :- |
347| Собственное время выполнения хука для одного события, без учёта времени внутри `next` или вызова API модов, кроме `$.clock.sleep` | 10 секунд или 50 миллисекунд для хука `prompt.edit` |355| Собственное время выполнения хука для одного события, без учёта времени внутри `next` или вызова API модов, кроме `$.clock.sleep` | 10 секунд или 50 миллисекунд для хука `prompt.edit` |
348| Время выполнения обработчика `.catch` | 1 секунда |356| Время выполнения обработчика `.catch` | 1 секунда |
349| Все хуки `session.end` вместе | Столько же, сколько [бюджет хука SessionEnd](/docs/ru/hooks.md#sessionend-input), — 1,5 секунды, если вы его не измените; отсчёт начинается после завершения хуков `SessionEnd` из ваших настроек |357| Все хуки `session.end` вместе | Столько же, сколько [бюджет хука SessionEnd](https://code.claude.com/docs/ru/hooks.md#sessionend-input), — 1,5 секунды, если вы его не измените; отсчёт начинается после завершения хуков `SessionEnd` из ваших настроек |
350| Таймаут `$.process.run` | 30 секунд по умолчанию, не более 10 минут |358| Таймаут `$.process.run` | 30 секунд по умолчанию, не более 10 минут |
351| `maxTokens` для `$.model.complete` | 1024 по умолчанию, до 64 000 или предела вывода модели |359| `maxTokens` для `$.model.complete` | 1024 по умолчанию, до 64 000 или предела вывода модели |
352| `$.fs.read` и `$.fs.write` | 4 МиБ на один файл |360| `$.fs.read` и `$.fs.write` | 4 МиБ на один файл |
354| Тело ответа `$.http.fetch` | 4 МиБ. `text` содержит первые 4 МиБ, а остальное не считывается. Если заголовок `Content-Length` объявляет больший размер, вызов вместо этого отклоняется с причиной, оканчивающейся на `is over the 4194304-byte limit`, за исключением случая, когда последний запрос после всех перенаправлений использует метод `HEAD`. Исключение для `HEAD` требует Claude Code v2.1.296 или новее. |362| Тело ответа `$.http.fetch` | 4 МиБ. `text` содержит первые 4 МиБ, а остальное не считывается. Если заголовок `Content-Length` объявляет больший размер, вызов вместо этого отклоняется с причиной, оканчивающейся на `is over the 4194304-byte limit`, за исключением случая, когда последний запрос после всех перенаправлений использует метод `HEAD`. Исключение для `HEAD` требует Claude Code v2.1.296 или новее. |
355| Один вызов `$.http.fetch`, включая перенаправления и тело | 30 секунд |363| Один вызов `$.http.fetch`, включая перенаправления и тело | 30 секунд |
356| Перенаправления, по которым проходит один вызов `$.http.fetch` | 5 |364| Перенаправления, по которым проходит один вызов `$.http.fetch` | 5 |
357| Причина `drop` хука или причина `deny` для `config.set` | 4 096 символов. Конец более длинной причины обрезается, а drop или deny всё равно применяется. Обрезка требует Claude Code v2.1.292 или новее; в более ранних версиях хук вместо этого [завершается с ошибкой](/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails). |365| Причина `drop` хука или причина `deny` для `config.set` | 4 096 символов. Конец более длинной причины обрезается, а drop или deny всё равно применяется. Обрезка требует Claude Code v2.1.292 или новее; в более ранних версиях хук вместо этого [завершается с ошибкой](https://code.claude.com/docs/ru/plugins/mods/events.md#handle-a-hook-that-fails). |
358| Текст в одном дереве | Отрисовываются первые 100 000 символов |366| Текст в одном дереве | Отрисовываются первые 100 000 символов |
359| `language` или `path` элемента `Code`, `value` варианта `Select` или `module` элемента `Client` | 10 000 символов. Если значение длиннее, Claude Code [отрисовывает собственную версию области](/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements). |367| `language` или `path` элемента `Code`, `value` варианта `Select` или `module` элемента `Client` | 10 000 символов. Если значение длиннее, Claude Code [отрисовывает собственную версию области](https://code.claude.com/docs/ru/plugins/mods/interface.md#build-a-tree-from-elements). |
360| `href` элемента `Link` | 2 048 символов. Более длинный `href` не даёт отрисовать всё дерево. |368| `href` элемента `Link` | 2 048 символов. Более длинный `href` не даёт отрисовать всё дерево. |
361| `$.store` | 4 МиБ JSON в сумме |369| `$.store` | 4 МиБ JSON в сумме |
362| `$.session.messages()` | Последние 4 096 записей |370| `$.session.messages()` | Последние 4 096 записей |
375| :- | :- | :- |383| :- | :- | :- |
376| `CLAUDE_CODE_PLUGIN_DIRS` | Окружение или `env` в `~/.claude/settings.json` | Каталоги плагинов для загрузки так же, как это делает `--plugin-dir`, — для приложений, которым нельзя передать флаг. Абсолютные пути, разделённые `:`, или `;` в Windows. |384| `CLAUDE_CODE_PLUGIN_DIRS` | Окружение или `env` в `~/.claude/settings.json` | Каталоги плагинов для загрузки так же, как это делает `--plugin-dir`, — для приложений, которым нельзя передать флаг. Абсолютные пути, разделённые `:`, или `;` в Windows. |
377| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Окружение | `1` заставляет долго работающую неинтерактивную сессию перезагружать моды из `--plugin-dir` при сохранении |385| `CLAUDE_CODE_PLUGIN_DIR_WATCH` | Окружение | `1` заставляет долго работающую неинтерактивную сессию перезагружать моды из `--plugin-dir` при сохранении |
378| `prependPlugins`, `appendPlugins` | Управляемые настройки. Пользовательские настройки — только на машине без управляемых настроек, в сессии, учётные данные которой получены не через `/login` Team или Enterprise. | Списки id плагинов, например `acme-guard@acme-tools`. Моды из `prependPlugins` выполняются перед каждым модом, установленным пользователем, а моды из `appendPlugins` — после, в указанном порядке. См. [Порядок запуска модов](/docs/ru/plugins/mods/events.md#the-order-mods-run-in). |386| `prependPlugins`, `appendPlugins` | Управляемые настройки. Пользовательские настройки — только на машине без управляемых настроек, в сессии, учётные данные которой получены не через `/login` Team или Enterprise. | Списки id плагинов, например `acme-guard@acme-tools`. Моды из `prependPlugins` выполняются перед каждым модом, установленным пользователем, а моды из `appendPlugins` — после, в указанном порядке. См. [Порядок запуска модов](https://code.claude.com/docs/ru/plugins/mods/events.md#the-order-mods-run-in). |
379| `allowManagedModsOnly` | Управляемые настройки, как [опция встроенного стража](/docs/ru/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Свои хуки запускают только моды, которые [считаются модами вашей организации](/docs/ru/plugins/mods/admin.md#install-your-organizations-mods), и моды, встроенные в Claude Code. Хуки настроек пользователей продолжают работать. |387| `allowManagedModsOnly` | Управляемые настройки, как [опция встроенного стража](https://code.claude.com/docs/ru/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Свои хуки запускают только моды, которые [считаются модами вашей организации](https://code.claude.com/docs/ru/plugins/mods/admin.md#install-your-organizations-mods), и моды, встроенные в Claude Code. Хуки настроек пользователей продолжают работать. |
380| `allowModsToOverrideDenyRules` | Управляемые настройки, как [опция встроенного стража](/docs/ru/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Позволяет моду, установленному пользователем, одобрить вызов инструмента, который отклоняет правило `deny` |388| `allowModsToOverrideDenyRules` | Управляемые настройки, как [опция встроенного стража](https://code.claude.com/docs/ru/plugins/mods/admin.md#set-options-on-the-built-in-guard) | Позволяет моду, установленному пользователем, одобрить вызов инструмента, который отклоняет правило `deny` |
381| `allowManagedHooksOnly` | Управляемые настройки | Блокирует хуки и установленные моды, не принадлежащие вашей организации. См. [что продолжает работать](/docs/ru/settings-reference.md#what-runs-under-allowmanagedhooksonly). |389| `allowManagedHooksOnly` | Управляемые настройки | Блокирует хуки и установленные моды, не принадлежащие вашей организации. См. [что продолжает работать](https://code.claude.com/docs/ru/settings-reference.md#what-runs-under-allowmanagedhooksonly). |
382| `disableAllHooks` | Любой файл настроек | В управляемых настройках не выполняется ни один мод или хук из установленного плагина. В ваших собственных настройках то, чем управляет ваша организация, продолжает работать. См. [`disableAllHooks`](/docs/ru/settings-reference#disableallhooks). |390| `disableAllHooks` | Любой файл настроек | В управляемых настройках не выполняется ни один мод или хук из установленного плагина. В ваших собственных настройках то, чем управляет ваша организация, продолжает работать. См. [`disableAllHooks`](https://code.claude.com/docs/ru/settings-reference#disableallhooks). |
383| `disableSideloadFlags` | Управляемые настройки | Отклоняет `--plugin-dir` и `--plugin-url` при запуске |391| `disableSideloadFlags` | Управляемые настройки | Отклоняет `--plugin-dir` и `--plugin-url` при запуске |
384| `pluginConfigs` | Пользовательские или управляемые настройки | Содержит значения `userConfig` для мода с ключом по id плагина, например `acme-guard@acme-tools`, или по его имени и `@inline`, например `first-mod@inline`, для мода, загруженного с `--plugin-dir` |392| `pluginConfigs` | Пользовательские или управляемые настройки | Содержит значения `userConfig` для мода с ключом по id плагина, например `acme-guard@acme-tools`, или по его имени и `@inline`, например `first-mod@inline`, для мода, загруженного с `--plugin-dir` |
385 393
386`sec-default@builtin` — это страж, встроенный в Claude Code, который отображается как `cc-plugin-sec-default` в `/plugin` и в отладочном логе. Он загружается перед каждым модом, установленным человеком, на машине с управляемыми настройками или в сессии, учётные данные которой получены через [`/login`](/docs/ru/authentication#authentication-precedence) Team или Enterprise. Если задан управляемый `prependPlugins`, страж загружается, только если этот список его называет, на указанной позиции.394`sec-default@builtin` — это страж, встроенный в Claude Code, который отображается как `cc-plugin-sec-default` в `/plugin` и в отладочном логе. Он загружается перед каждым модом, установленным человеком, на машине с управляемыми настройками или в сессии, учётные данные которой получены через [`/login`](https://code.claude.com/docs/ru/authentication#authentication-precedence) Team или Enterprise. Если задан управляемый `prependPlugins`, страж загружается, только если этот список его называет, на указанной позиции.
387 395
388Его исходный код находится в [каталоге `mods/sec-default` репозитория Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).396Его исходный код находится в [каталоге `mods/sec-default` репозитория Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).
389 397
393 401
394| Команда | Что делает |402| Команда | Что делает |
395| :- | :- |403| :- | :- |
396| [`/plugin`](/docs/ru/plugins/mods/overview#see-which-mods-a-session-loaded) | Показывает под своими вкладками строку вида `1 mod active · first-mod`, когда загружен мод, не являющийся встроенным |404| [`/plugin`](https://code.claude.com/docs/ru/plugins/mods/overview#see-which-mods-a-session-loaded) | Показывает под своими вкладками строку вида `1 mod active · first-mod`, когда загружен мод, не являющийся встроенным |
397| [`claude plugin validate <directory>`](/docs/ru/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Читает манифест и модуль хуков плагина и сообщает об ошибках, обрабатываемых событиях и вызовах API модов. `--strict` считает предупреждения ошибками, а `--json` выводит машиночитаемый отчёт. |405| [`claude plugin validate <directory>`](https://code.claude.com/docs/ru/plugins/mods/create#check-what-claude-code-reads-from-your-mod) | Читает манифест и модуль хуков плагина и сообщает об ошибках, обрабатываемых событиях и вызовах API модов. `--strict` считает предупреждения ошибками, а `--json` выводит машиночитаемый отчёт. |
398| [`claude plugin test [directory]`](/docs/ru/plugins/mods/test#write-a-test) | Запускает все файлы в каталоге (или в текущем каталоге, если он не указан), имена которых заканчиваются на `.test.ts` или `.test.tsx`. Завершается с кодом 1, если тест не проходит. |406| [`claude plugin test [directory]`](https://code.claude.com/docs/ru/plugins/mods/test#write-a-test) | Запускает все файлы в каталоге (или в текущем каталоге, если он не указан), имена которых заканчиваются на `.test.ts` или `.test.tsx`. Завершается с кодом 1, если тест не проходит. |
399| [`claude --plugin-dir <directory>`](/docs/ru/plugins/mods/create#write-a-mod-yourself) | Загружает каталог плагина на одну сессию и перезагружает его модуль хуков при сохранении. Повторите флаг, чтобы загрузить несколько. |407| [`claude --plugin-dir <directory>`](https://code.claude.com/docs/ru/plugins/mods/create#write-a-mod-yourself) | Загружает каталог плагина на одну сессию и перезагружает его модуль хуков при сохранении. Повторите флаг, чтобы загрузить несколько. |
400| `/reload-plugins` | Перезагружает плагины при запуске |408| `/reload-plugins` | Перезагружает плагины при запуске |