SpyBara
Go Premium

plugins/mods/admin.md 2026-09-30 23:00 UTC to 2026-10-01 21:59 UTC

This page contains 375 additions and 0 deletions.

2026
Thu 1 23:02

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

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

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

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

Остановить загрузку установленных пользователем модов

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

{
  "pluginConfigs": {
    "cc-plugin-sec-default@builtin": {
      "options": {
        "allowManagedModsOnly": true
      }
    }
  }
}

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

  • Ни один мод, который приносит пользователь, не загружается: это охватывает мод в плагине, установленном пользователем, мод, загруженный с помощью --plugin-dir, и мод, который Claude написал во время сеанса
  • Моды вашей организации по-прежнему загружаются: мод, который считается модом вашей организации, не проверяется. Все остальные моды считаются модами пользователя и не загружаются. Это включает мод в плагине, который вы включаете из GitHub или другого удаленного маркетплейса, и мод, который ваша организация включает для своих членов на claude.ai. Если ни один не считается вашим, установленный мод не загружается.
  • Пользователи не могут это отменить: защита читает параметр только из управляемых параметров, поэтому та же запись в файле параметров пользователя, проекта или локальных параметров или в файле, переданном с помощью --settings, ничего не меняет
  • Файл или политика MDM охватывают каждого поставщика: когда вы доставляете параметр в виде файла или через MDM, он работает одинаково на Amazon Bedrock, Google Cloud's Agent Platform и Microsoft Foundry. Для доставки из консоли администратора claude.ai см. Доступность платформы
  • Другие настройки пользователей продолжают работать: их hooks в файлах параметров, строки состояния и /goal не затронуты
  • Встроенные моды продолжают работать: моды, встроенные в Claude Code, такие как поддержка AGENTS.md, имеют свой собственный переключатель

Чтобы подтвердить параметр на машине пользователя, запустите Claude Code там с --plugin-dir и путем к каталогу, который содержит мод, например claude --plugin-dir ./first-mod. Hooks мода не запускаются, и транскрипт и журнал отладки содержат сообщение защиты, которое называет мод и allowManagedModsOnly. Если мод загружается, см. Проверить, что политика действует и правила, которые определяют, вступает ли параметр в силу.

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

Узнать, что происходит по умолчанию

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

  • Моды включены. Пользователь может установить плагин, содержащий мод из любого маркетплейса, который разрешают ваши параметры плагинов, или загрузить его из каталога с помощью --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: с отказанным Read(.env), мод все еще может прочитать этот файл с помощью $.fs.read или запустить программу, которая это делает. Чтобы ограничить эти вызовы, не позволяйте моду загружаться или подключите вызов в политическом моде.

  • Другие проверки разрешений могут быть переопределены. Мод пользователя, который одобряет вызовы инструментов, может одобрить вызов, который правило ask потребовало бы подтверждения, или который hook PreToolUse вне управляемых параметров заблокировал. В автоматическом режиме вызов, одобренный модом, выполняется без проверки классификатора.

Исходный код защиты является общедоступным в каталоге mods/sec-default репозитория Claude Code.

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

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

  • Hooks параметров продолжают работать. Hooks команд, HTTP, запросов и агентов в файлах параметров и в hooks/hooks.json плагинов работают как раньше, наряду с модами. Ничего в них не устарело.
  • Правила отказа имеют приоритет, где загружается защита. Мод пользователя не может одобрить вызов, который правило deny отказывает, если вы не установите allowModsToOverrideDenyRules.
  • Управляемые hooks работают первыми. Hook PreToolUse в управляемых параметрах работает перед тем, как любой мод увидит вызов инструмента, и его блокировка окончательна. Если мод затем переписывает вызов, ваши управляемые hooks работают снова на переписанном вызове, поэтому блокировка по-прежнему применяется. Hooks PreToolUse из других файлов параметров и из плагинов работают после последнего мода, поэтому мод, который возвращает свой собственный результат вместо запуска инструмента, не позволяет им работать. См. Порядок, в котором работают моды.
  • Политика сети охватывает $.http.fetch. Если ваша организация отключает веб-выборку или отключен несущественный сетевой трафик для сеанса, Claude Code отказывает в сетевом запросе, который мод делает с помощью $.http.fetch. Политика не охватывает программу, которую мод запускает с помощью $.process.run. Эта программа достигает сети с собственным доступом пользователя.
  • Элементы управления плагинами охватывают моды. Мод — это плагин, поэтому параметры, которые ограничивают то, что пользователи могут установить, такие как strictKnownMarketplaces, определяют, может ли он быть установлен вообще.
  • Моды не могут изменить запрос разрешения. Мод может переделать большую часть интерфейса Claude Code, но не запрос разрешения, поэтому он не может изменить то, что показывает запрос. Мод все еще может одобрить или отказать в вызове инструмента перед появлением запроса, как описано в Узнать, что происходит по умолчанию.
  • Запросы доверия идут первыми. В интерактивном сеансе в каталоге, который пользователь еще не доверил, ни один мод не загружается, пока они не ответят на запрос доверия.
  • --safe-mode отключает установленные моды, включая ваши. Запустите сеанс с claude --safe-mode, чтобы проверить, вызвал ли мод проблему.

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

Решить, оставить ли моды включенными

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

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

Ваши элементы управления плагинами сегодня Что пользователь может загрузить как мод
Нет Мод из любого маркетплейса, из любого каталога с --plugin-dir или который Claude пишет во время сеанса
Список разрешений маркетплейса Мод из маркетплейсов, которые вы разрешаете, или из любого каталога с --plugin-dir. Мод, который Claude пишет во время сеанса, загружается только когда список разрешений включает skills-dir.
Список разрешений маркетплейса и disableSideloadFlags Мод из маркетплейсов, которые вы разрешаете

Управление плагинами для вашей организации перечисляет каждый способ загрузки плагина и параметр, который управляет каждым.

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

Просмотреть возможности мода

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

claude plugin validate ./some-mod

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

  ❯ ./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 модов, написанный $ в коде мода, — это то, как мод достигает файлов, процессов и сети. 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 и prompt.submit означают, что мод видит каждый вызов инструмента и каждый запрос и может их изменять. session.append означает, что мод может переписать каждую строку разговора перед ее сохранением. ui.render{component=AskUserQuestion} означает, что мод может переделать диалог, который Claude использует для вопроса пользователю. tool.check означает, что мод может одобрить или отказать в вызове инструмента перед появлением запроса разрешения. Узнать, что происходит по умолчанию перечисляет, какие из ваших правил и hooks имеют приоритет над его ответом.

Выбрать, сколько разрешить

Политики модов варьируются от отсутствия установленных модов вообще до любого мода, который выбирает пользователь, с вашим собственным модом, проверяющим остальные, и каждая из них — это несколько управляемых параметров. Найдите политику, которую вы хотите, в первом столбце и установите то, что называет второй столбец. Развертывание управляемых параметров охватывает, где находятся управляемые параметры.

Что вы хотите Параметры
Нет установленных модов, с hooks без изменений Установите allowManagedModsOnly и не развертывайте моды вашей организации
Нет установленных модов и вообще нет hooks, включая ваши управляемые hooks Установите disableAllHooks на true
Только моды вашей организации Установите параметр allowManagedModsOnly защиты и установите ваши моды, чтобы они считались вашими
Любой мод из маркетплейсов, которые вы одобряете Сохраните ваши ограничения маркетплейса и установите disableSideloadFlags на true
Любой мод, с вашим собственным модом, проверяющим остальные Установите ваш мод и перечислите его с sec-default@builtin в prependPlugins

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

  • allowManagedModsOnly: параметр встроенной защиты. Моды пользователей не загружаются, и их hooks параметров, строки состояния и /goal продолжают работать. Остановить загрузку установленных пользователем модов перечисляет, что он охватывает.
  • allowManagedHooksOnly: более широкий параметр. Загружаются только моды вашей организации и моды, встроенные в Claude Code. Мод, который пользователь установил сам, не загружается. Параметр также блокирует hooks в собственных файлах параметров пользователей. Прочитайте Что работает под allowManagedHooksOnly перед тем, как установить его.
  • disableAllHooks: самый широкий параметр. В управляемых параметрах он останавливает моды в каждом установленном плагине, включая ваши, и отключает каждый hook в файлах параметров, поэтому hook PreToolUse в ваших управляемых параметрах больше ничего не блокирует. Пользовательские строки состояния и /goal также перестают работать. Прочитайте disableAllHooks перед тем, как установить его.
  • disableSideloadFlags: отклоняет --plugin-dir и --plugin-url при запуске, поэтому никто не загружает мод из каталога и не позволяет модам, которые Claude пишет во время сеанса, загружаться. Параметр также отклоняет --agents и --mcp-config. Прочитайте disableSideloadFlags перед тем, как установить его.

Моды, встроенные в Claude Code, такие как поддержка AGENTS.md, не затронуты этими параметрами. Каждый имеет свой собственный переключатель.

Пользователь, чей мод не загрузился, найдет причину в своем журнале отладки. Сообщения об отказе перечисляет строки для allowManagedHooksOnly и disableAllHooks, и Сообщения от встроенной защиты содержит строку для allowManagedModsOnly.

Установить параметры на встроенной защите

Встроенная защита принимает два параметра. Установите их в управляемых параметрах под pluginConfigs, с ключом cc-plugin-sec-default@builtin, как это делает пример в Остановить загрузку установленных пользователем модов.

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

Параметр Не установлен true
allowManagedModsOnly Моды пользователей загружаются Загружаются только моды вашей организации и моды, встроенные в Claude Code. Claude Code отказывает каждому другому моду, включая мод, установленный пользователем или названный с помощью --plugin-dir.
allowModsToOverrideDenyRules Правила отказа имеют приоритет над модами пользователей Мод пользователя, который одобряет вызовы инструментов, может одобрить вызов, который правило deny отказывает

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

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

Сообщения от встроенной защиты — это то, что видят ваши пользователи, когда применяется любой параметр.

Развертывание собственных модов вашей организации

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

Установка модов вашей организации и установка порядка

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

  • Управляемый enabledPlugins устанавливает плагин мода в true
  • Управляемые параметры называют marketplace плагина как каталог на машине пользователя по абсолютному пути. Запись extraKnownMarketplaces делает это и также регистрирует marketplace для пользователя.
  • Marketplace указывает плагин по относительному пути, поэтому Claude Code загружает его на месте из этого каталога

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

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

/opt/acme/claude-plugins/
├── .claude-plugin/
│   └── marketplace.json
└── plugins/
    └── acme-guard/
        ├── .claude-plugin/
        │   └── plugin.json
        └── hooks/
            ├── hooks.json
            └── register.js

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

{
  "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 вызывает событие каждый раз, когда он собирается действовать, например запустить инструмент, и передает его каждому моду по очереди. Мод, который считается вашим, выполняется перед модами пользователей даже если вы его нигде не указываете. Чтобы установить его место, укажите его идентификатор в одном из двух параметров. Идентификатор — это имя плагина, @ и имя marketplace, например acme-guard@acme-tools.

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

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

{
  "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 следует порядку, который вы указываете.

Чтобы подтвердить, что машина пользователя получила параметры, см. Проверка того, что политика действует.

Чтобы подтвердить, где выполняется мод, запустите сеанс на этой машине с claude --debug и найдите в журнале отладки идентификатор мода:

  • 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 игнорирует оба ключа в параметрах пользователя. Список там ни не добавляет, ни не удаляет встроенную защиту.

Обеспечение политики с помощью собственного мода

Чтобы не допустить загрузку любого мода пользователя, вам не нужен собственный мод. Установите allowManagedModsOnly. Напишите мод политики, когда вы хотите допустить некоторые моды пользователей и отказать в других, или чтобы записать, что делают моды.

Каждый раз, когда другой мод собирается загрузиться, ваш мод получает список, который печатает claude plugin validate, в событии с именем plugin.register. Мод в prependPlugins может прочитать этот список и отказать в загрузке мода. Он также может перехватить любой вызов API модов по имени, чтобы записать или отказать в этом вызове для каждого другого мода. Имя — это метод без $., поэтому перехват на fs.write видит каждый вызов $.fs.write.

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

// 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: и ваша причина. Отказ также достигает стенограммы в сеансе, который горячо перезагружает каталог плагина. Чтобы заблокировать вызов без отказа всему моду, верните { deny: 'your reason' } из перехвата на имя этого вызова.

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

Сеанс может выполняться без вашего мода. Если рабочий поток, который запускает установленные моды, падает три раза, Claude Code выгружает каждый мод, который не встроен, включая ваш, пока пользователь не запустит /reload-plugins или не начнет новый сеанс. И пользователь, который запускает Claude Code с --safe-mode, выполняется без установленных модов, включая ваш.

Создание мода охватывает файлы, которые нужны моду. Тестирование мода, который судит другие моды содержит файл теста для этого мода политики.

Отказ в загрузке модов, когда ваша проверка не удается

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

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), поэтому неудачная проверка не останавливает моды, которые указывает ваша организация. Обработка перехвата, который не удается охватывает .catch для других событий.

Следующие шаги