> ## Documentation Index
> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Управление модами для вашей организации

> Контролируйте Claude Code mods с помощью управляемых параметров: остановите установленные пользователем моды, разрешите только свои, просмотрите возможности мода и обеспечьте политику с помощью собственного мода.

[Мод](/docs/ru/plugins/mods/overview) — это плагин, который выполняет код внутри Claude Code с разрешениями пользователя, который его установил. Моды не изолированы в песочнице. Через [управляемые параметры](/docs/ru/managed-settings) вы решаете, будут ли моды работать на машинах ваших пользователей, какие именно и в каком порядке. Вы также можете установить собственный мод, который отслеживает или отказывает в том, что делают другие моды.

Эта страница предназначена для человека, который развертывает управляемые параметры для Claude Code, будь то в виде файла, через MDM или из консоли администратора claude.ai. Моды включены по умолчанию в Claude Code v2.1.287 и более поздних версиях. Начните с раздела, который соответствует тому, что вы хотите сделать:

* **Исключить собственные моды пользователей, с модами вашей организации или без них**: [Остановить загрузку установленных пользователем модов](#stop-user-installed-mods-from-loading)
* **Узнать, что получат ваши пользователи, если вы ничего не измените**: [Узнать, что происходит по умолчанию](#know-what-happens-by-default)
* **Оставить моды включенными с другими ограничениями**: [Выбрать, сколько разрешить](#choose-how-much-to-allow)

<Note>
  Эти случаи рассматриваются на других страницах:

  * **Вы раньше не развертывали управляемые параметры**: начните с [Развертывание управляемых параметров](/docs/ru/managed-settings)
  * **Вы хотите контролировать, какие плагины могут устанавливать пользователи**: см. [Управление плагинами для вашей организации](/docs/ru/plugins/org)
</Note>

<h2 id="stop-user-installed-mods-from-loading">
  Остановить загрузку установленных пользователем модов
</h2>

Чтобы предотвратить загрузку каждого мода, который приносят ваши пользователи, установите параметр `allowManagedModsOnly` на [встроенной защите](#know-what-happens-by-default), политическом моде, который Claude Code загружает перед каждым модом, установленным пользователем. Параметр находится в управляемых параметрах под `pluginConfigs`, с ключом `cc-plugin-sec-default@builtin`:

```json managed-settings.json theme={null}
{
  "pluginConfigs": {
    "cc-plugin-sec-default@builtin": {
      "options": {
        "allowManagedModsOnly": true
      }
    }
  }
}
```

С установленным параметром в управляемых параметрах:

* **Ни один мод, который приносит пользователь, не загружается**: это охватывает мод в плагине, установленном пользователем, мод, загруженный с помощью `--plugin-dir`, и мод, [который Claude написал во время сеанса](/docs/ru/plugins/mods/create#ask-claude-for-a-mod)
* **Моды вашей организации по-прежнему загружаются**: мод, который [считается модом вашей организации](#install-your-organizations-mods), не проверяется. Все остальные моды считаются модами пользователя и не загружаются. Это включает мод в плагине, который вы включаете из GitHub или другого удаленного маркетплейса, и мод, который ваша организация включает для своих членов на claude.ai. Если ни один не считается вашим, установленный мод не загружается.
* **Пользователи не могут это отменить**: защита читает параметр только из управляемых параметров, поэтому та же запись в файле параметров пользователя, проекта или локальных параметров или в файле, переданном с помощью `--settings`, ничего не меняет
* **Файл или политика MDM охватывают каждого поставщика**: когда вы доставляете параметр в виде файла или через MDM, он работает одинаково на Amazon Bedrock, Google Cloud's Agent Platform и Microsoft Foundry. Для доставки из консоли администратора claude.ai см. [Доступность платформы](/docs/ru/server-managed-settings#platform-availability)
* **Другие настройки пользователей продолжают работать**: их [hooks в файлах параметров](/docs/ru/hooks), строки состояния и `/goal` не затронуты
* **Встроенные моды продолжают работать**: моды, встроенные в Claude Code, такие как поддержка `AGENTS.md`, имеют [свой собственный переключатель](/docs/ru/plugins/mods/overview#mods-built-into-claude-code)

Чтобы подтвердить параметр на машине пользователя, запустите Claude Code там с `--plugin-dir` и путем к каталогу, который содержит мод, например `claude --plugin-dir ./first-mod`. Hooks мода не запускаются, и транскрипт и журнал отладки содержат [сообщение защиты](/docs/ru/plugins/mods/troubleshoot#messages-from-the-built-in-guard), которое называет мод и `allowManagedModsOnly`. Если мод загружается, см. [Проверить, что политика действует](/docs/ru/managed-settings#check-that-a-policy-is-in-force) и [правила, которые определяют, вступает ли параметр в силу](#set-options-on-the-built-in-guard).

Если вы установили `CLAUDE_CODE_ENABLE_FUNCTION_HOOKS` на `0` во время раннего доступа, замените его этим параметром. Claude Code v2.1.287 и более поздние версии игнорируют переменную при любом значении, поэтому `0` там оставляет моды включенными.

<h2 id="know-what-happens-by-default">
  Узнать, что происходит по умолчанию
</h2>

Без собственных параметров модов вот что получают ваши пользователи:

* **Моды включены.** Пользователь может установить плагин, содержащий мод из любого маркетплейса, который разрешают ваши параметры плагинов, или загрузить его из каталога с помощью `--plugin-dir`.
* **Встроенная защита работает первой.** Claude Code загружает встроенный мод с именем `sec-default@builtin` перед каждым модом, установленным пользователем. Пользователи не могут его отключить. `/plugin` и журнал отладки указывают его как `cc-plugin-sec-default`. Защита загружается, когда верно одно из следующих условий:

  * На машине есть управляемые параметры
  * Пользователь вошел в Claude Code с планом Team или Enterprise

  Пользователь, который аутентифицируется с помощью ключа API или через Amazon Bedrock, Google Cloud's Agent Platform или Microsoft Foundry, получает защиту только на машине с управляемыми параметрами.
* **Защита защищает то, что вы управляете.** Мод пользователя не может изменить то, что получают или решают ваши управляемые hooks, системный запрос, ваши управляемые `CLAUDE.md` и другие управляемые инструкции, то, что любой мод читает как параметры, или инструменты и описания ваших управляемых MCP серверов.
* **Все остальное разрешено.** Защита не добавляет других ограничений. Мод пользователя по-прежнему может читать и писать файлы, запускать процессы, делать сетевые запросы, переписывать вызовы инструментов и запросы, отказывать в вызове инструмента, одобрять вызов, который иначе потребовал бы подтверждения, и рисовать в интерфейсе, все с разрешениями этого пользователя.
* **Правила отказа и ваши управляемые hooks имеют приоритет.** Где загружается защита, мод пользователя не может одобрить вызов, который правило `deny` отказывает, независимо от того, какой файл параметров содержит правило. Блокировка из hook `PreToolUse` в управляемых параметрах также окончательна. Оба применяются к вызовам инструментов Claude. Ни один не применяется к собственным вызовам мода [`$.fs` и `$.process`](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network): с отказанным `Read(.env)`, мод все еще может прочитать этот файл с помощью `$.fs.read` или запустить программу, которая это делает. Чтобы ограничить эти вызовы, не позволяйте моду загружаться или подключите вызов в [политическом моде](#enforce-a-policy-with-a-mod-of-your-own).
* **Другие проверки разрешений могут быть переопределены.** Мод пользователя, который одобряет вызовы инструментов, может одобрить вызов, который правило `ask` потребовало бы подтверждения, или который hook `PreToolUse` вне управляемых параметров заблокировал. В автоматическом режиме вызов, одобренный модом, выполняется без проверки классификатора.

Исходный код защиты является общедоступным в [каталоге `mods/sec-default` репозитория Claude Code](https://github.com/anthropics/claude-code/tree/main/mods/sec-default).

<h3 id="know-which-controls-still-apply">
  Узнать, какие элементы управления по-прежнему применяются
</h3>

Моды не заменяют элементы управления, которые у вас уже есть:

* **Hooks параметров продолжают работать.** Hooks команд, HTTP, запросов и агентов в файлах параметров и в `hooks/hooks.json` плагинов работают как раньше, наряду с модами. Ничего в них не устарело.
* **Правила отказа имеют приоритет, где загружается защита.** Мод пользователя не может одобрить вызов, который правило `deny` отказывает, если вы не установите [`allowModsToOverrideDenyRules`](#set-options-on-the-built-in-guard).
* **Управляемые hooks работают первыми.** Hook `PreToolUse` в управляемых параметрах работает перед тем, как любой мод увидит вызов инструмента, и его блокировка окончательна. Если мод затем переписывает вызов, ваши управляемые hooks работают снова на переписанном вызове, поэтому блокировка по-прежнему применяется. Hooks `PreToolUse` из других файлов параметров и из плагинов работают после последнего мода, поэтому мод, который возвращает свой собственный результат вместо запуска инструмента, не позволяет им работать. См. [Порядок, в котором работают моды](/docs/ru/plugins/mods/events#the-order-mods-run-in).
* **Политика сети охватывает `$.http.fetch`.** Если ваша организация отключает веб-выборку или отключен несущественный сетевой трафик для сеанса, Claude Code отказывает в сетевом запросе, который мод делает с помощью `$.http.fetch`. Политика не охватывает программу, которую мод запускает с помощью `$.process.run`. Эта программа достигает сети с собственным доступом пользователя.
* **Элементы управления плагинами охватывают моды.** Мод — это плагин, поэтому [параметры, которые ограничивают то, что пользователи могут установить](/docs/ru/plugins/org#restrict-what-users-can-install), такие как `strictKnownMarketplaces`, определяют, может ли он быть установлен вообще.
* **Моды не могут изменить запрос разрешения.** Мод может переделать большую часть интерфейса Claude Code, но не запрос разрешения, поэтому он не может изменить то, что показывает запрос. Мод все еще может одобрить или отказать в вызове инструмента перед появлением запроса, как описано в [Узнать, что происходит по умолчанию](#know-what-happens-by-default).
* **Запросы доверия идут первыми.** В интерактивном сеансе в каталоге, который пользователь еще не доверил, ни один мод не загружается, пока они не ответят на запрос доверия.
* **`--safe-mode` отключает установленные моды, включая ваши.** Запустите сеанс с `claude --safe-mode`, чтобы проверить, вызвал ли мод проблему.

Ни один из этих элементов управления не изолирует мод в песочнице. Мод, который вы разрешаете, работает как пользователь, с доступом пользователя к файлам, процессам и сети.

<h2 id="decide-whether-to-leave-mods-on">
  Решить, оставить ли моды включенными
</h2>

Мод может делать больше, чем другие части плагина, потому что он работает внутри Claude Code. Он видит каждый запрос и вызов инструмента, может их изменять и может разрешить или отказать в вызове инструмента перед появлением запроса разрешения.

То, что пользователь может загрузить как мод, зависит от элементов управления плагинами, которые у вас уже есть:

| Ваши элементы управления плагинами сегодня | Что пользователь может загрузить как мод |
| :- | :- |
| Нет | Мод из любого маркетплейса, из любого каталога с `--plugin-dir` или который Claude пишет во время сеанса |
| Список разрешений маркетплейса | Мод из маркетплейсов, которые вы разрешаете, или из любого каталога с `--plugin-dir`. Мод, который Claude пишет во время сеанса, загружается только когда список разрешений [включает `skills-dir`](/docs/ru/plugins/org#keep-skills-directory-plugins-loading). |
| Список разрешений маркетплейса и `disableSideloadFlags` | Мод из маркетплейсов, которые вы разрешаете |

[Управление плагинами для вашей организации](/docs/ru/plugins/org) перечисляет каждый способ загрузки плагина и параметр, который управляет каждым.

Чтобы проверить моды в маркетплейсе перед тем, как ваши пользователи их установят, см. [Просмотреть возможности мода](#review-what-a-mod-can-do). Чтобы исключить моды пользователей, пока вы это делаете, см. [Остановить загрузку установленных пользователем модов](#stop-user-installed-mods-from-loading).

<h3 id="review-what-a-mod-can-do">
  Просмотреть возможности мода
</h3>

Вы можете увидеть, что может делать мод, не запуская его. В вашей оболочке запустите `claude plugin validate` в каталоге плагина:

```bash theme={null}
claude plugin validate ./some-mod
```

Две строки в выводе описывают код мода:

```text theme={null}
  ❯ ./register.js hooks: session.start, tool.call, ui.render{component=Pane}
  ❯ ./register.js calls: $.fs.read, $.http.fetch, $.store.set, $.ui.open
```

Строка `hooks:` перечисляет события, которые получает мод. Строка `calls:` перечисляет методы API модов, которые вызывает его код. [API модов](/docs/ru/plugins/mods/api), написанный `$` в коде мода, — это то, как мод достигает файлов, процессов и сети. Claude Code отказывается загружать мод, который использует API модов способом, который эта команда не может прочитать.

Посмотрите на строку `calls:` для этих:

| Вызов | Что это означает |
| :- | :- |
| `$.fs.read`, `$.fs.write` | Читает или пишет файлы в любом месте, где может пользователь |
| `$.process.run`, `$.process.spawn` | Запускает программы как пользователь |
| `$.http.fetch` | Делает сетевые запросы |
| `$.env.get`, `$.settings.read` | Читает переменные окружения и параметры, которые могут содержать ключи API. Строка `env reads:` в выводе называет каждую переменную. |
| `$.env.set` | Устанавливает переменную окружения для Claude Code и для каждой команды и MCP сервера, который он запускает впоследствии, что может изменить то, что эти программы запускают. Строка `env writes:` называет каждую переменную. |
| `$.mcp.call` | Вызывает инструмент на подключенном MCP сервере в соответствии с правилами разрешений сеанса |
| `$.model.complete` | Использует план пользователя или ключ API для вызовов модели |
| `$.prompt.submit` | Отправляет запрос и может отправить его как собственные слова пользователя |
| `$.session.send` | Отправляет сообщение, которое читает Claude другого сеанса или подагента |

В строке `hooks:`, [`tool.call`](/docs/ru/plugins/mods/reference#tools) и [`prompt.submit`](/docs/ru/plugins/mods/reference#prompts-and-what-claude-reads) означают, что мод видит каждый вызов инструмента и каждый запрос и может их изменять. [`session.append`](/docs/ru/plugins/mods/reference#session) означает, что мод может переписать каждую строку разговора перед ее сохранением. [`ui.render{component=AskUserQuestion}`](/docs/ru/plugins/mods/interface#change-what-claude-code-already-draws) означает, что мод может переделать диалог, который Claude использует для вопроса пользователю. `tool.check` означает, что мод может одобрить или отказать в вызове инструмента перед появлением запроса разрешения. [Узнать, что происходит по умолчанию](#know-what-happens-by-default) перечисляет, какие из ваших правил и hooks имеют приоритет над его ответом.

<h2 id="choose-how-much-to-allow">
  Выбрать, сколько разрешить
</h2>

Политики модов варьируются от отсутствия установленных модов вообще до любого мода, который выбирает пользователь, с вашим собственным модом, проверяющим остальные, и каждая из них — это несколько управляемых параметров. Найдите политику, которую вы хотите, в первом столбце и установите то, что называет второй столбец. [Развертывание управляемых параметров](/docs/ru/managed-settings) охватывает, где находятся управляемые параметры.

| Что вы хотите | Параметры |
| :- | :- |
| Нет установленных модов, с hooks без изменений | Установите [`allowManagedModsOnly`](#set-options-on-the-built-in-guard) и не развертывайте моды вашей организации |
| Нет установленных модов и вообще нет hooks, включая ваши управляемые hooks | Установите `disableAllHooks` на `true` |
| Только моды вашей организации | Установите параметр [`allowManagedModsOnly`](#stop-user-installed-mods-from-loading) защиты и [установите ваши моды](#install-your-organizations-mods), чтобы они считались вашими |
| Любой мод из маркетплейсов, которые вы одобряете | Сохраните ваши [ограничения маркетплейса](/docs/ru/plugins/org#restrict-what-users-can-install) и установите `disableSideloadFlags` на `true` |
| Любой мод, с вашим собственным модом, проверяющим остальные | [Установите ваш мод](#install-your-organizations-mods) и перечислите его с `sec-default@builtin` в `prependPlugins` |

Что делает каждый параметр:

* **`allowManagedModsOnly`**: параметр встроенной защиты. Моды пользователей не загружаются, и их hooks параметров, строки состояния и `/goal` продолжают работать. [Остановить загрузку установленных пользователем модов](#stop-user-installed-mods-from-loading) перечисляет, что он охватывает.
* **`allowManagedHooksOnly`**: более широкий параметр. Загружаются только [моды вашей организации](#install-your-organizations-mods) и моды, встроенные в Claude Code. Мод, который пользователь установил сам, не загружается. Параметр также блокирует hooks в собственных файлах параметров пользователей. Прочитайте [Что работает под `allowManagedHooksOnly`](/docs/ru/settings-reference#what-runs-under-allowmanagedhooksonly) перед тем, как установить его.
* **`disableAllHooks`**: самый широкий параметр. В управляемых параметрах он останавливает моды в каждом установленном плагине, включая ваши, и отключает каждый hook в файлах параметров, поэтому hook `PreToolUse` в ваших управляемых параметрах больше ничего не блокирует. Пользовательские строки состояния и `/goal` также перестают работать. Прочитайте [`disableAllHooks`](/docs/ru/settings-reference#disableallhooks) перед тем, как установить его.
* **`disableSideloadFlags`**: отклоняет `--plugin-dir` и `--plugin-url` при запуске, поэтому никто не загружает мод из каталога и не позволяет модам, которые Claude пишет во время сеанса, загружаться. Параметр также отклоняет `--agents` и `--mcp-config`. Прочитайте [`disableSideloadFlags`](/docs/ru/settings-reference#disablesideloadflags) перед тем, как установить его.

Моды, встроенные в Claude Code, такие как поддержка `AGENTS.md`, не затронуты этими параметрами. Каждый имеет [свой собственный переключатель](/docs/ru/plugins/mods/overview#mods-built-into-claude-code).

Пользователь, чей мод не загрузился, найдет причину в своем журнале отладки. [Сообщения об отказе](/docs/ru/plugins/mods/troubleshoot#refusal-messages) перечисляет строки для `allowManagedHooksOnly` и `disableAllHooks`, и [Сообщения от встроенной защиты](/docs/ru/plugins/mods/troubleshoot#messages-from-the-built-in-guard) содержит строку для `allowManagedModsOnly`.

<h3 id="set-options-on-the-built-in-guard">
  Установить параметры на встроенной защите
</h3>

Встроенная защита принимает два параметра. Установите их в управляемых параметрах под `pluginConfigs`, с ключом `cc-plugin-sec-default@builtin`, как это делает пример в [Остановить загрузку установленных пользователем модов](#stop-user-installed-mods-from-loading).

Таблица показывает, что получают ваши пользователи с каждым параметром не установленным и установленным на `true`:

| Параметр | Не установлен | `true` |
| :- | :- | :- |
| `allowManagedModsOnly` | Моды пользователей загружаются | Загружаются только [моды вашей организации](#install-your-organizations-mods) и моды, встроенные в Claude Code. Claude Code отказывает каждому другому моду, включая мод, установленный пользователем или названный с помощью `--plugin-dir`. |
| `allowModsToOverrideDenyRules` | Правила отказа имеют приоритет над модами пользователей | Мод пользователя, который одобряет вызовы инструментов, может одобрить вызов, который правило `deny` отказывает |

Эти правила определяют, вступает ли параметр в силу:

* **Id имеет одно написание здесь**: Claude Code читает параметры только под `cc-plugin-sec-default@builtin`. `prependPlugins` также принимает `sec-default@builtin`, и `pluginConfigs` — нет.
* **Считаются только управляемые параметры**: та же запись в файле параметров пользователя, проекта или локальных параметров или в файле, переданном с помощью `--settings`, ни устанавливает параметр, ни ослабляет его
* **Защита должна загружаться**: если вы установите `prependPlugins`, [назовите защиту в списке](#install-your-organizations-mods). Где защита не загружается, ни один параметр не применяется.
* **Защита отказывает закрыто**: если защита не может прочитать управляемые параметры, она отказывает каждому моду пользователя при загрузке. Если она не может проверить правила отказа для вызова, который одобрил мод пользователя, она отказывает вызову.

[Сообщения от встроенной защиты](/docs/ru/plugins/mods/troubleshoot#messages-from-the-built-in-guard) — это то, что видят ваши пользователи, когда применяется любой параметр.

<h2 id="run-your-organization’s-own-mods">
  Развертывание собственных модов вашей организации
</h2>

Вы можете развертывать собственные моды для каждого пользователя, выбирать, где они выполняются относительно модов пользователей, и использовать один из них для обеспечения политики.

<h3 id="install-your-organizations-mods">
  Установка модов вашей организации и установка порядка
</h3>

Моды вашей организации загружаются там, где не загружаются моды пользователей, и могут выполняться перед ними, поэтому Claude Code должен иметь возможность определить, что мод поступил от вас. Он рассматривает мод как принадлежащий вашей организации только в том случае, если все следующие условия верны:

* Управляемый `enabledPlugins` устанавливает плагин мода в `true`
* Управляемые параметры называют [marketplace](/docs/ru/plugins/create-marketplace) плагина как каталог на машине пользователя по абсолютному пути. Запись `extraKnownMarketplaces` делает это и также регистрирует marketplace для пользователя.
* Marketplace указывает плагин по относительному пути, поэтому Claude Code [загружает его на месте](/docs/ru/plugins/loading#in-place-and-copied-plugins) из этого каталога

Чтобы выполнить эти условия, скопируйте каталог marketplace на одинаковый путь на каждой машине с помощью управления устройствами. Сделайте каталог и каждый каталог выше него доступными для записи только администратором, как и файл управляемых параметров. Любой, кто может писать туда, может переписать ваш мод. Управляемые параметры, которые вы доставляете из консоли администратора claude.ai, могут содержать ключи, но они не могут поместить каталог на машину.

Каталог содержит манифест marketplace и плагин:

```text theme={null}
/opt/acme/claude-plugins/
├── .claude-plugin/
│   └── marketplace.json
└── plugins/
    └── acme-guard/
        ├── .claude-plugin/
        │   └── plugin.json
        └── hooks/
            ├── hooks.json
            └── register.js
```

Манифест указывает плагин по его пути относительно этого каталога:

```json /opt/acme/claude-plugins/.claude-plugin/marketplace.json theme={null}
{
  "name": "acme-tools",
  "owner": { "name": "Acme" },
  "plugins": [
    { "name": "acme-guard", "source": "./plugins/acme-guard", "description": "Acme policy mod" }
  ]
}
```

Плагин, который Claude Code копирует в свой кэш, считается плагином пользователя, даже если управляемый `enabledPlugins` его включает. Это охватывает каждый плагин из источника GitHub, git, URL или npm. Его мод выполняется среди модов пользователей, `prependPlugins` и `appendPlugins` его пропускают, и он не загружается под `allowManagedModsOnly` или `allowManagedHooksOnly`. В журнале отладки пользователя есть строка, которая начинается с идентификатора плагина и `is enabled by managed settings, but`.

Claude Code вызывает событие каждый раз, когда он собирается действовать, например запустить инструмент, и передает его каждому моду по очереди. Мод, который считается вашим, [выполняется перед модами пользователей](/docs/ru/plugins/mods/events#the-order-mods-run-in) даже если вы его нигде не указываете. Чтобы установить его место, укажите его идентификатор в одном из двух параметров. Идентификатор — это имя плагина, `@` и имя marketplace, например `acme-guard@acme-tools`.

* **`prependPlugins`**: ваш мод видит каждое событие перед любым модом пользователя и каждый результат после. Он может изменить событие, отказать в нем или пропустить моды пользователей.
* **`appendPlugins`**: ваш мод выполняется после каждого мода пользователя, поэтому он видит только события, которые эти моды передают, в форме, в которой они их передают

Этот пример объявляет marketplace `acme-tools` в `/opt/acme/claude-plugins`, включает `acme-guard` из него и запускает этот мод первым, со встроенной защитой после него:

```json managed-settings.json theme={null}
{
  "extraKnownMarketplaces": {
    "acme-tools": {
      "source": { "source": "directory", "path": "/opt/acme/claude-plugins" }
    }
  },
  "enabledPlugins": { "acme-guard@acme-tools": true },
  "prependPlugins": ["acme-guard@acme-tools", "sec-default@builtin"]
}
```

Каждый ключ выполняет одну работу:

* **`extraKnownMarketplaces`**: называет каталог, который содержит marketplace `acme-tools`. `path` — это абсолютный путь каталога, который содержит `.claude-plugin/marketplace.json`.
* **`enabledPlugins`**: включает `acme-guard` для каждого пользователя, который получает эти управляемые параметры
* **`prependPlugins`**: ставит `acme-guard` первым и встроенную защиту второй, обе впереди любого мода, который устанавливает пользователь. Claude Code следует порядку, который вы указываете.

Чтобы подтвердить, что машина пользователя получила параметры, см. [Проверка того, что политика действует](/docs/ru/managed-settings#check-that-a-policy-is-in-force).

Чтобы подтвердить, где выполняется мод, запустите сеанс на этой машине с `claude --debug` и найдите в [журнале отладки](/docs/ru/plugins/mods/troubleshoot#read-the-debug-log) идентификатор мода:

* **`hooks module acme-guard@acme-tools loaded`, с `tier prepend`**: мод считается принадлежащим вашей организации и выполняется первым
* **Та же строка с `tier user`**: Claude Code рассматривает его как мод пользователя. Вторая строка, `prependPlugins names acme-guard@acme-tools, which is not an enabled managed plugin with a hooks module; skipped`, говорит, что список его пропустил.

Эти правила определяют, какие идентификаторы в двух списках вступают в силу:

* **Список заменяет значение по умолчанию**: когда вы устанавливаете `prependPlugins` в управляемых параметрах, назовите `sec-default@builtin` в нем, чтобы сохранить встроенную защиту. Защита встроена и не требует записи `enabledPlugins`.
* **Ваши собственные идентификаторы должны считаться вашими**: в управляемых параметрах Claude Code пропускает идентификатор, чей плагин не соответствует трем условиям для мода организации
* **Репозитории не могут их устанавливать**: Claude Code читает оба параметра из управляемых параметров и никогда из файла параметров репозитория. Пользователь может установить их в `~/.claude/settings.json`, чтобы упорядочить только свои моды на машине без управляемых параметров, и только если они не вошли в систему с планом Team или Enterprise. В любом другом месте Claude Code игнорирует оба ключа в параметрах пользователя. Список там ни не добавляет, ни не удаляет встроенную защиту.

<h3 id="enforce-a-policy-with-a-mod-of-your-own">
  Обеспечение политики с помощью собственного мода
</h3>

Чтобы не допустить загрузку любого мода пользователя, вам не нужен собственный мод. Установите [`allowManagedModsOnly`](#stop-user-installed-mods-from-loading). Напишите мод политики, когда вы хотите допустить некоторые моды пользователей и отказать в других, или чтобы записать, что делают моды.

Каждый раз, когда другой мод собирается загрузиться, ваш мод получает список, который печатает `claude plugin validate`, в событии с именем [`plugin.register`](/docs/ru/plugins/mods/reference#other-mods). Мод в `prependPlugins` может прочитать этот список и отказать в загрузке мода. Он также может [перехватить любой вызов API модов по имени](/docs/ru/plugins/mods/api#reach-files-processes-and-the-network), чтобы записать или отказать в этом вызове для каждого другого мода. Имя — это метод без `$.`, поэтому перехват на `fs.write` видит каждый вызов `$.fs.write`.

Этот мод политики отказывает любому моду пользователя, чей собственный код вызывает `$.process.run` или `$.process.spawn`. Он также ведет журнал аудита, записывая каждый вызов инструмента и каждый файл, который мод записывает, в журнал отладки. Поскольку он выполняется первым, журнал записывает то, что было запрошено, перед тем как любой мод пользователя его изменит. Сохраните его как `acme-guard/hooks/register.js`:

```javascript acme-guard/hooks/register.js theme={null}
// The methods no user's mod may call, each spelled namespace.method
const BLOCKED_CALLS = ['process.run', 'process.spawn']

export function register(on) {
  // Runs each time another mod is about to load
  on('plugin.register', async ($, e, next) => {
    // Keep the calls in that mod's code that are on the blocked list
    const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
    if (e.tier === 'user' && blocked.length > 0) {
      // Returning refuse keeps the mod from loading, and the text is the reason
      return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }
    }
    // Let every other mod load
    return next(e)
  })

  // Record each tool call, then let it go ahead unchanged
  on('tool.call', async ($, e, next) => {
    $.ui.log('audit tool.call ' + e.tool, { to: 'debug' })
    return next(e)
  })

  // Record which mod wrote a file, then the path, quoted because the mod chose it
  on('fs.write', async ($, e, next) => {
    $.ui.log('audit fs.write by ' + next.origin.plugin + ' ' + JSON.stringify(e.path), { to: 'debug' })
    return next(e)
  })
}
```

Файл регистрирует три перехвата:

* **`plugin.register`**: решает, загружается ли другой мод. Он отказывает моду пользователя, который вызывает заблокированный метод, и передает каждый другой мод дальше.
* **`tool.call`**: записывает строку, такую как `audit tool.call Bash`, в журнал отладки для каждого вызова инструмента и ничего не изменяет
* **`fs.write`**: записывает строку, такую как `audit fs.write by reader "/tmp/notes.md"`, для каждого вызова `$.fs.write`, который делает другой мод, и ничего не изменяет. Имя мода идет первым, а путь заключен в кавычки, поэтому путь, который выбирает мод, не может выдать себя за другое поле строки.

Перехват `plugin.register` читает два поля события:

* **`e.tier`**: где будет выполняться мод, один из `prepend`, `user`, `append` или `builtin`. Каждый мод, который устанавливает человек, — это `user`.
* **`e.uses.calls`**: методы API модов, которые вызывает мод, каждый написанный как `namespace.method`, например `process.run`, без `$.`, который печатает `claude plugin validate`

Когда пользователь устанавливает мод, который вызывает `$.process.run`, мод не загружается, и в его журнале отладки есть строка, которая заканчивается на `refused by acme-guard:` и ваша причина. Отказ также достигает стенограммы в [сеансе, который горячо перезагружает каталог плагина](/docs/ru/plugins/mods/troubleshoot#find-out-why-a-mod-does-nothing). Чтобы заблокировать вызов без отказа всему моду, верните `{ deny: 'your reason' }` из перехвата на имя этого вызова.

Чтобы отправить строки аудита куда-то, кроме журнала отладки, вызовите `$.http.fetch` из тех же перехватов.

Сеанс может выполняться без вашего мода. Если рабочий поток, который запускает установленные моды, [падает три раза](/docs/ru/plugins/mods/troubleshoot#mods-that-run-in-the-hooks-worker-are-off-for-this-session), Claude Code выгружает каждый мод, который не встроен, включая ваш, пока пользователь не запустит `/reload-plugins` или не начнет новый сеанс. И пользователь, который запускает Claude Code с `--safe-mode`, выполняется без установленных модов, включая ваш.

[Создание мода](/docs/ru/plugins/mods/create) охватывает файлы, которые нужны моду. [Тестирование мода, который судит другие моды](/docs/ru/plugins/mods/test#test-a-mod-that-judges-other-mods) содержит файл теста для этого мода политики.

<h4 id="refuse-mods-when-your-check-fails">
  Отказ в загрузке модов, когда ваша проверка не удается
</h4>

Если ваш перехват `plugin.register` выбросит исключение или превысит лимит времени, Claude Code пропускает перехват, поэтому проверка не удается открыто и мод, который он проверял, загружается. Чтобы не удалось закрыто и отказать в загрузке модов пользователей, переместите проверку в именованную функцию и добавьте обработчик `.catch`, который возвращает отказ. Эта версия файла показывает только перехват `plugin.register`, поэтому сохраните два перехвата аудита из первой версии в `register`:

```javascript acme-guard/hooks/register.js theme={null}
const BLOCKED_CALLS = ['process.run', 'process.spawn']

// The same check as before, moved into a function of its own
async function checkMod($, e, next) {
  const blocked = e.uses.calls.filter((call) => BLOCKED_CALLS.includes(call))
  if (e.tier === 'user' && blocked.length > 0) {
    return { refuse: 'Acme policy: mods may not call ' + blocked.join(', ') }
  }
  return next(e)
}

export function register(on) {
  // The handler runs only when checkMod throws or runs past its time limit
  on('plugin.register', checkMod).catch(async ($, e, next) => {
    // Let your organization's mods and built-in mods load
    if (e.tier !== 'user') return next(e)
    // Refuse the user's mod that couldn't be checked
    return { refuse: 'Acme policy check failed, so this mod was not loaded' }
  })
}
```

С обработчиком на месте мод, который проверялся, когда проверка выбросила исключение или истекло время, не загружается, и строка отказа содержит вторую причину, как в `refused by acme-guard: Acme policy check failed, so this mod was not loaded`. Обработчик передает каждый мод вне уровня `user` к `next(e)`, поэтому неудачная проверка не останавливает моды, которые указывает ваша организация. [Обработка перехвата, который не удается](/docs/ru/plugins/mods/events#handle-a-hook-that-fails) охватывает `.catch` для других событий.

<h2 id="next-steps">
  Следующие шаги
</h2>

* [Безопасность плагинов](/docs/ru/plugins/security): что может делать любой плагин на машине пользователя и как просмотреть один перед его установкой
* [Обзор модов](/docs/ru/plugins/mods/overview): что такое мод и как он сравнивается с hooks, skills и MCP серверами
* [Порядок, в котором работают моды](/docs/ru/plugins/mods/events#the-order-mods-run-in): как `prependPlugins` и `appendPlugins` подходят к модам пользователей
* [Параметры и переменные окружения](/docs/ru/plugins/mods/reference#settings-and-environment-variables): каждый параметр, названный на этой странице, в одной таблице
