10 Для краткого руководства с примерами см. [Автоматизация рабочих процессов с помощью hooks](/docs/ru/hooks-guide).10 Для краткого руководства с примерами см. [Автоматизация рабочих процессов с помощью hooks](/docs/ru/hooks-guide).
11</Tip>11</Tip>
12 12
13Hooks — это определяемые пользователем команды оболочки, конечные точки HTTP или подсказки LLM, которые выполняются автоматически в определённых точках жизненного цикла Claude Code. Используйте этот справочник для поиска схем событий, параметров конфигурации, форматов JSON входа/выхода и расширенных функций, таких как асинхронные hooks, HTTP hooks и MCP tool hooks. Если вы настраиваете hooks впервые, начните с [руководства](/docs/ru/hooks-guide).13Hooks — это определяемые пользователем команды оболочки, конечные точки HTTP, вызовы инструментов MCP, подсказки LLM или подагенты, которые выполняются автоматически в определённых точках жизненного цикла Claude Code. Claude Code запускает одни и те же события hook везде, где он работает: сеансы в терминале, расширения IDE, [приложение Desktop](/docs/ru/desktop-quickstart) и [облачные сеансы](/docs/ru/claude-code-on-the-web). Используйте этот справочник для поиска схем событий, параметров конфигурации, форматов JSON входа/выхода и расширенных функций, таких как асинхронные hooks, HTTP hooks и MCP tool hooks.
14 14
15<h2 id="hook-lifecycle">15<h2 id="hook-lifecycle">
16 Жизненный цикл hook16 Жизненный цикл hook
17</h2>17</h2>
18 18
19Hooks срабатывают в определённых точках во время сеанса Claude Code. Когда событие срабатывает и совпадает с фильтром, Claude Code передаёт JSON-контекст события вашему обработчику hook. Для command hooks входные данные поступают на stdin. Для HTTP hooks они поступают как тело POST-запроса. Ваш обработчик может затем проверить входные данные, выполнить действие и опционально вернуть решение.19Claude Code запускает hooks в определённых точках во время сеанса. Когда событие срабатывает и совпадает с фильтром, Claude Code передаёт JSON-контекст события вашему обработчику hook. Для command hooks входные данные поступают на stdin. Для HTTP hooks они поступают как тело POST-запроса. Ваш обработчик может затем проверить входные данные, выполнить действие и опционально вернуть решение.
20 20
21События срабатывают в трёх ритмах:21События срабатывают в трёх ритмах:
22 22
23* один раз за сеанс: `SessionStart` и `SessionEnd`23* один раз за сеанс: `SessionStart` и `SessionEnd`
24* один раз за ход: `UserPromptSubmit`, `Stop` и `StopFailure`24* один раз за ход: `UserPromptSubmit`, `Stop` и `StopFailure`
25* при каждом вызове инструмента внутри агентного цикла: `PreToolUse` и `PostToolUse`25* при каждом вызове инструмента внутри агентного цикла: `PreToolUse` и `PostToolUse`, за исключением вызовов [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior), которые пропускают оба
26 26
27<div style={{maxWidth: "500px", margin: "0 auto"}}>27<div style={{maxWidth: "500px", margin: "0 auto"}}>
28 <Frame>28 <Frame>
29 <img src="https://mintcdn.com/claude-code/x7pO8l4XcvAXCoVc/images/hooks-lifecycle.svg?fit=max&auto=format&n=x7pO8l4XcvAXCoVc&q=85&s=81b9256c1bbe8832553485f5d9e9c746" alt="Диаграмма жизненного цикла hook, показывающая опциональный Setup, переходящий в SessionStart, затем цикл за ход, содержащий UserPromptSubmit, UserPromptExpansion для slash commands, вложенный агентный цикл (PreToolUse, PermissionRequest, PostToolUse, PostToolUseFailure, PostToolBatch, SubagentStart/Stop, TaskCreated, TaskCompleted) и Stop или StopFailure, за которым следуют TeammateIdle, PreCompact, PostCompact и SessionEnd, с Elicitation и ElicitationResult вложенными внутри выполнения MCP tool, PermissionDenied как боковая ветвь от PermissionRequest для автоматических отказов, WorktreeCreate, WorktreeRemove, Notification, ConfigChange, InstructionsLoaded, CwdChanged и FileChanged как отдельные асинхронные события, и MessageDisplay как событие только для отображения, которое выполняется во время потоковой передачи текста сообщения помощника" width="520" height="1336" data-path="images/hooks-lifecycle.svg" />29 <img src="https://mintcdn.com/claude-code/x7pO8l4XcvAXCoVc/images/hooks-lifecycle.svg?fit=max&auto=format&n=x7pO8l4XcvAXCoVc&q=85&s=81b9256c1bbe8832553485f5d9e9c746" className="dark:hidden" alt="Диаграмма жизненного цикла hook, показывающая опциональный Setup, переходящий в SessionStart, затем цикл за ход, содержащий UserPromptSubmit, UserPromptExpansion для slash commands, вложенный агентный цикл (PreToolUse, PermissionRequest, PostToolUse, PostToolUseFailure, PostToolBatch, SubagentStart/Stop, TaskCreated, TaskCompleted) и Stop или StopFailure, за которым следуют TeammateIdle, PreCompact, PostCompact и SessionEnd, с Elicitation и ElicitationResult вложенными внутри выполнения MCP tool, PermissionDenied как боковая ветвь от PermissionRequest для автоматических отказов, WorktreeCreate, WorktreeRemove, Notification, ConfigChange, InstructionsLoaded, CwdChanged, FileChanged и DirectoryAdded как отдельные асинхронные события, PreModelSwitch как отдельное последовательное событие, которое запускается перед запрошенным переключением модели, PostModelSwitch как отдельное асинхронное событие, которое запускается после изменения модели сеанса, и MessageDisplay как событие только для отображения, которое запускается во время потоковой передачи текста сообщения помощника" width="520" height="1336" data-path="images/hooks-lifecycle.svg" />
30
31 <img src="https://mintcdn.com/claude-code/x7pO8l4XcvAXCoVc/images/hooks-lifecycle-dark.svg?fit=max&auto=format&n=x7pO8l4XcvAXCoVc&q=85&s=c9b3d88487335f58cce0b52e2f9e7531" className="hidden dark:block" alt="Диаграмма жизненного цикла hook, показывающая опциональный Setup, переходящий в SessionStart, затем цикл за ход, содержащий UserPromptSubmit, UserPromptExpansion для slash commands, вложенный агентный цикл (PreToolUse, PermissionRequest, PostToolUse, PostToolUseFailure, PostToolBatch, SubagentStart/Stop, TaskCreated, TaskCompleted) и Stop или StopFailure, за которым следуют TeammateIdle, PreCompact, PostCompact и SessionEnd, с Elicitation и ElicitationResult вложенными внутри выполнения MCP tool, PermissionDenied как боковая ветвь от PermissionRequest для автоматических отказов, WorktreeCreate, WorktreeRemove, Notification, ConfigChange, InstructionsLoaded, CwdChanged, FileChanged и DirectoryAdded как отдельные асинхронные события, PreModelSwitch как отдельное последовательное событие, которое запускается перед запрошенным переключением модели, PostModelSwitch как отдельное асинхронное событие, которое запускается после изменения модели сеанса, и MessageDisplay как событие только для отображения, которое запускается во время потоковой передачи текста сообщения помощника" width="520" height="1336" data-path="images/hooks-lifecycle-dark.svg" />
30 </Frame>32 </Frame>
31</div>33</div>
32 34
33Таблица ниже суммирует, когда срабатывает каждое событие. Раздел [Hook events](#hook-events) документирует полную схему входа и параметры управления решением для каждого события.35Таблица ниже суммирует, когда срабатывает каждое событие. Раздел [Hook events](#hook-events) документирует полную схему входа и параметры управления решением для каждого события.
34 36
35| Event | When it fires |37| Событие | Когда оно срабатывает |
36| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |38| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
37| `SessionStart` | When a session begins or resumes |39| `SessionStart` | Когда сеанс начинается или возобновляется |
38| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |40| `Setup` | Когда вы запускаете Claude Code с `--init-only`, или с `--init` или `--maintenance` в режиме `-p`. Для одноразовой подготовки в CI или скриптах |
39| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |41| `UserPromptSubmit` | Когда вы отправляете запрос, прежде чем Claude его обработает |
40| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |42| `UserPromptExpansion` | Когда команда, введённая пользователем, расширяется в запрос, прежде чем она достигнет Claude. Может заблокировать расширение |
41| `PreToolUse` | Before a tool call executes. Can block it |43| `PreToolUse` | Перед выполнением вызова инструмента. Может заблокировать его |
42| `PermissionRequest` | When a tool call needs a permission decision |44| `PermissionRequest` | Когда вызов инструмента требует решения о разрешении |
43| `PermissionDenied` | When auto mode denies a tool call, including denials without a classifier verdict. Use JSON `hookSpecificOutput.retry: true` to tell the model it may retry the denied tool call. Claude Code ignores `retry` when the classifier produced no verdict |45| `PermissionDenied` | Когда автоматический режим отклоняет вызов инструмента, включая отклонения без вердикта классификатора. Используйте JSON `hookSpecificOutput.retry: true`, чтобы сообщить модели, что она может повторить попытку отклонённого вызова инструмента. Claude Code игнорирует `retry`, когда классификатор не выдал вердикт |
44| `PostToolUse` | After a tool call succeeds |46| `PostToolUse` | После успешного выполнения вызова инструмента |
45| `PostToolUseFailure` | After a tool call fails |47| `PostToolUseFailure` | После неудачного выполнения вызова инструмента |
46| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |48| `PostToolBatch` | После разрешения полного пакета параллельных вызовов инструментов, перед следующим вызовом модели |
47| `Notification` | When Claude Code sends a notification |49| `Notification` | Когда Claude Code отправляет уведомление |
48| `MessageDisplay` | While assistant message text is displayed |50| `MessageDisplay` | Во время отображения текста сообщения помощника |
49| `SubagentStart` | When a subagent is spawned |51| `SubagentStart` | Когда порождается подагент |
50| `SubagentStop` | When a subagent finishes |52| `SubagentStop` | Когда подагент завершает работу |
51| `TaskCreated` | When a task is being created via `TaskCreate` |53| `TaskCreated` | Когда задача создаётся через `TaskCreate` |
52| `TaskCompleted` | When a task is being marked as completed |54| `TaskCompleted` | Когда задача отмечается как завершённая |
53| `Stop` | When Claude finishes responding |55| `Stop` | Когда Claude завершает ответ |
54| `StopFailure` | When the turn ends due to an API error |56| `StopFailure` | Когда ход завершается из-за ошибки API |
55| `TeammateIdle` | When an [agent team](/docs/en/agent-teams) teammate is about to go idle |57| `TeammateIdle` | Когда товарищ по команде [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания |
56| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |58| `InstructionsLoaded` | Когда файл CLAUDE.md или `.claude/rules/*.md` загружается в контекст. Срабатывает при запуске сеанса и когда файлы ленивой загрузки загружаются во время сеанса |
57| `ConfigChange` | When a configuration file changes during a session |59| `ConfigChange` | Когда файл конфигурации изменяется во время сеанса |
58| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |60| `CwdChanged` | Когда рабочий каталог изменяется, например когда Claude выполняет команду `cd`. Полезно для реактивного управления окружением с помощью инструментов, таких как direnv |
59| `DirectoryAdded` | When a working directory is added mid-session via `/add-dir` or the SDK `register_repo_root` control request |61| `DirectoryAdded` | Когда рабочий каталог добавляется в середине сеанса через `/add-dir` или запрос управления SDK `register_repo_root` |
60| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |62| `FileChanged` | Когда наблюдаемый файл изменяется на диске. Поле `matcher` указывает, какие имена файлов отслеживать |
61| `WorktreeCreate` | When a worktree is being created via `--worktree`, `isolation: "worktree"`, or for a background session. Replaces default git behavior |63| `WorktreeCreate` | Когда worktree создаётся через `--worktree`, `isolation: "worktree"`, или для фонового сеанса. Заменяет поведение git по умолчанию |
62| `WorktreeRemove` | When a worktree is being removed at session exit, when a subagent finishes, or when you delete a background session |64| `WorktreeRemove` | Когда worktree удаляется при выходе из сеанса, когда подагент завершает работу, или когда вы удаляете фоновый сеанс |
63| `PreCompact` | Before context compaction |65| `PreCompact` | Перед компактизацией контекста |
64| `PostCompact` | After context compaction completes |66| `PostCompact` | После завершения компактизации контекста |
65| `PreModelSwitch` | Before Claude Code applies a model switch that you or a client requested. Can block the switch |67| `PreModelSwitch` | Перед тем как Claude Code применяет переключение модели, которое вы или клиент запросили. Может заблокировать переключение |
66| `PostModelSwitch` | After the session's model changes, including changes Claude Code makes on its own, such as restoring the model when you resume a session |68| `PostModelSwitch` | После изменения модели сеанса, включая изменения, которые Claude Code делает самостоятельно, такие как восстановление модели при возобновлении сеанса |
67| `Elicitation` | When an MCP server requests user input during a tool call |69| `Elicitation` | Когда сервер MCP запрашивает ввод пользователя во время вызова инструмента |
68| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |70| `ElicitationResult` | После того как пользователь отвечает на запрос MCP, перед отправкой ответа обратно на сервер |
69| `SessionEnd` | When a session terminates |71| `SessionEnd` | Когда сеанс завершается |
70 72
71<h3 id="how-a-hook-resolves">73<h3 id="how-a-hook-resolves">
72 Как разрешается hook74 Как разрешается hook
73</h3>75</h3>
74 76
75Чтобы увидеть, как эти части работают вместе, рассмотрим этот hook `PreToolUse`, который блокирует деструктивные команды оболочки. Фильтр `matcher` сужает область до вызовов инструмента Bash, а условие `if` сужает её дальше до команд Bash, совпадающих с `rm *`, поэтому `block-rm.sh` запускается только когда оба фильтра совпадают:77Чтобы увидеть, как событие, фильтр и обработчик работают вместе, рассмотрим этот hook `PreToolUse`, который блокирует деструктивные команды оболочки.
76 78
77```json theme={null}79<Tabs>
78{80 <Tab title="macOS/Linux">
81 Фильтр `matcher` сужает область до вызовов инструмента Bash, а условие `if` сужает её дальше до команд Bash, совпадающих с `rm *`, поэтому `block-rm.sh` запускается только когда оба фильтра совпадают:
82
83 ```json theme={null}
84 {
79 "hooks": {85 "hooks": {
80 "PreToolUse": [86 "PreToolUse": [
81 {87 {
91 }97 }
92 ]98 ]
93 }99 }
94}100 }
95```101 ```
96 102
97Скрипт читает JSON входные данные из stdin, извлекает команду и возвращает `permissionDecision` со значением `"deny"`, если она содержит `rm -rf`:103 Скрипт читает JSON входные данные из stdin, извлекает команду и возвращает `permissionDecision` со значением `"deny"`, если она содержит `rm -rf`. Сохраните его в `.claude/hooks/block-rm.sh` в вашем проекте и сделайте его исполняемым с помощью `chmod +x .claude/hooks/block-rm.sh`, чтобы Claude Code мог его запустить:
98 104
99```bash theme={null}105 ```bash theme={null}
100#!/bin/bash106 #!/bin/bash
101# .claude/hooks/block-rm.sh107 # .claude/hooks/block-rm.sh
102COMMAND=$(jq -r '.tool_input.command')108 COMMAND=$(jq -r '.tool_input.command')
103 109
104if echo "$COMMAND" | grep -q 'rm -rf'; then110 if echo "$COMMAND" | grep -q 'rm -rf'; then
105 jq -n '{111 jq -n '{
106 hookSpecificOutput: {112 hookSpecificOutput: {
107 hookEventName: "PreToolUse",113 hookEventName: "PreToolUse",
109 permissionDecisionReason: "Destructive command blocked by hook"115 permissionDecisionReason: "Destructive command blocked by hook"
110 }116 }
111 }'117 }'
112else118 else
113 exit 0 # no decision; normal permission flow applies119 exit 0 # no decision; normal permission flow applies
114fi120 fi
115```121 ```
122
123 Этот скрипт, как и другие примеры Bash на этой странице, которые анализируют JSON входные данные, использует `jq`, поэтому установите `jq` и убедитесь, что он находится в вашем `PATH` перед попыткой их использования.
124 </Tab>
125
126 <Tab title="Windows (PowerShell)">
127 Фильтр `Bash|PowerShell` охватывает [инструмент PowerShell](#powershell) а также Bash. Одно правило `if` совпадает только с вызовами одного инструмента, поэтому каждый инструмент получает свой обработчик: первый сужает область до команд Bash, совпадающих с `rm *`, второй — до команд PowerShell, совпадающих с `Remove-Item *`. Оба запускают один и тот же скрипт через `powershell.exe`:
128
129 ```json theme={null}
130 {
131 "hooks": {
132 "PreToolUse": [
133 {
134 "matcher": "Bash|PowerShell",
135 "hooks": [
136 {
137 "type": "command",
138 "if": "Bash(rm *)",
139 "command": "powershell.exe",
140 "args": [
141 "-NoProfile",
142 "-ExecutionPolicy",
143 "Bypass",
144 "-File",
145 "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.ps1"
146 ]
147 },
148 {
149 "type": "command",
150 "if": "PowerShell(Remove-Item *)",
151 "command": "powershell.exe",
152 "args": [
153 "-NoProfile",
154 "-ExecutionPolicy",
155 "Bypass",
156 "-File",
157 "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.ps1"
158 ]
159 }
160 ]
161 }
162 ]
163 }
164 }
165 ```
166
167 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы hook запустился быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.
168
169 Скрипт читает JSON входные данные из stdin, извлекает команду и возвращает `permissionDecision` со значением `"deny"`, если она содержит `rm -rf` или `Remove-Item` с последующим `-Recurse`. Сохраните его в `.claude/hooks/block-rm.ps1` в вашем проекте:
170
171 ```powershell theme={null}
172 # .claude/hooks/block-rm.ps1
173 $callInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
174 $command = $callInput.tool_input.command
175
176 if ($command -match 'rm -rf|Remove-Item.*-Recurse') {
177 @{
178 hookSpecificOutput = @{
179 hookEventName = "PreToolUse"
180 permissionDecision = "deny"
181 permissionDecisionReason = "Destructive command blocked by hook"
182 }
183 } | ConvertTo-Json
184 } else {
185 exit 0 # no decision; normal permission flow applies
186 }
187 ```
188 </Tab>
189</Tabs>
116 190
117Теперь предположим, что Claude Code решает запустить `Bash "rm -rf /tmp/build"`. Вот что происходит:191Теперь предположим, что Claude Code решает запустить `Bash "rm -rf /tmp/build"` с конфигурацией macOS/Linux. Вот что происходит:
118 192
119<Frame>193<Frame>
120 <img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/hook-resolution.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=be0bf3053550c26de5f54cd64674c197" alt="Диаграмма разрешения hook: срабатывает событие PreToolUse, фильтр проверяет совпадение Bash, затем условие if проверяет совпадение Bash(rm *). Если оба совпадают, команда hook запускается и возвращает permissionDecision deny, поэтому вызов инструмента блокируется и Claude Code продолжает работу. Если одна из проверок не совпадает, hook пропускается и вызов инструмента может продолжить работу." width="930" height="270" data-path="images/hook-resolution.svg" />194 <img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/hook-resolution.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=be0bf3053550c26de5f54cd64674c197" className="dark:hidden" alt="Диаграмма разрешения hook: срабатывает событие PreToolUse, фильтр проверяет совпадение Bash, затем условие if проверяет совпадение Bash(rm *). Если оба совпадают, команда hook запускается и возвращает permissionDecision deny, поэтому вызов инструмента блокируется и Claude Code продолжает работу. Если одна из проверок не совпадает, hook пропускается и вызов инструмента может продолжить работу." width="930" height="270" data-path="images/hook-resolution.svg" />
195
196 <img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/hook-resolution-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=e80af91f8507cee6bd51ac3c2dd92f63" className="hidden dark:block" alt="Диаграмма разрешения hook: срабатывает событие PreToolUse, фильтр проверяет совпадение Bash, затем условие if проверяет совпадение Bash(rm *). Если оба совпадают, команда hook запускается и возвращает permissionDecision deny, поэтому вызов инструмента блокируется и Claude Code продолжает работу. Если одна из проверок не совпадает, hook пропускается и вызов инструмента может продолжить работу." width="930" height="270" data-path="images/hook-resolution-dark.svg" />
121</Frame>197</Frame>
122 198
123<Steps>199<Steps>
183Место, где вы определяете hook, определяет его область действия:259Место, где вы определяете hook, определяет его область действия:
184 260
185| Расположение | Область действия | Общий доступ |261| Расположение | Область действия | Общий доступ |
186| :---------------------------------------------------------- | :--------------------- | :-------------------------------------------------- |262| :--------------------------------------- | :----------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |
187| `~/.claude/settings.json` | Все ваши проекты | Нет, локально на вашей машине |263| `~/.claude/settings.json` | Все ваши проекты | Нет, локально на вашей машине |
188| `.claude/settings.json` | Один проект | Да, можно зафиксировать в репозитории |264| `.claude/settings.json` | Один проект | Да, можно зафиксировать в репозитории |
189| `.claude/settings.local.json` | Один проект | Нет, игнорируется git когда Claude Code создаёт его |265| `.claude/settings.local.json` | Один проект | Нет, игнорируется git когда Claude Code сохраняет параметр в него |
190| Управляемые параметры политики | Организация | Да, контролируется администратором |266| Управляемые параметры политики | Организация | Да, контролируется администратором |
191| [Plugin](/docs/ru/plugins) `hooks/hooks.json` | Когда плагин включен | Да, поставляется с плагином |267| [Plugin](/docs/ru/plugins) `hooks/hooks.json` | Когда плагин включен | Да, поставляется с плагином |
192| [Skill](/docs/ru/skills) или [agent](/docs/ru/sub-agents) frontmatter | Пока компонент активен | Да, определено в файле компонента |268| [Skill](/docs/ru/skills) frontmatter | Остаток сеанса после вызова skill. См. [Hooks in skills and agents](#hooks-in-skills-and-agents) | Да, определено в файле skill |
269| [Subagent](/docs/ru/sub-agents) frontmatter | Пока этот subagent работает | Да, определено в файле subagent |
270
271Облачные сеансы на [Claude Code в веб-версии](/docs/ru/claude-code-on-the-web) не читают ваш локальный `~/.claude/settings.json`; hooks там поступают из репозитория, что означает его `.claude/settings.json` в сеансе с одним репозиторием и плагины, которые он объявляет в любом сеансе, и из управляемых на сервере параметров вашей организации. В [самостоятельно размещённой среде](/docs/ru/self-hosted-environments-configuration#permissions-and-tool-approval), Claude Code также запускает hooks, которые оператор инициализировал из `~/.claude/` хоста runner, и запускает hooks в файле управляемых параметров образа runner, когда этот файл находится среди [управляемых источников, которые применяет Claude Code](/docs/ru/managed-settings#how-claude-code-combines-managed-sources), что по умолчанию означает только когда ни управляемые на сервере параметры, ни доставленная MDM политика Claude Code не предоставляют управляемый уровень. См. [что переносится из вашей установки](/docs/ru/cloud-environments#what-carries-over-from-your-setup) для того, какие файлы достигают облачного сеанса.
272
273Для получения подробной информации о разрешении файлов настроек см. [settings](/docs/ru/settings).
274
275Hooks из файлов настроек, управляемых параметров политики и плагинов также запускаются внутри [subagents](/docs/ru/sub-agents). Когда subagent вызывает инструмент, события инструмента, такие как `PreToolUse` и `PostToolUse`, запускают те же настроенные hooks, что и в основном разговоре, и входные данные содержат поля `agent_id` и `agent_type` [общих входных полей](#common-input-fields), которые идентифицируют subagent.
276
277Администраторы предприятия могут использовать `allowManagedHooksOnly` для ограничения того, какие hooks запускаются:
193 278
194Для получения подробной информации о разрешении файлов настроек см. [settings](/docs/ru/settings). Администраторы предприятия могут использовать `allowManagedHooksOnly` для блокировки пользовательских, проектных и плагинных hooks. Hooks из плагинов, принудительно включённых в управляемых параметрах `enabledPlugins`, исключены, поэтому администраторы могут распространять проверенные hooks через организационный marketplace. См. [Hook configuration](/docs/ru/settings#hook-configuration).279* Ваши пользовательские, проектные, локальные и плагинные hooks блокируются. Hooks из плагинов, принудительно включённых в управляемых параметрах `enabledPlugins`, исключены
280* Claude Code также сужает ваши параметры [`statusLine`](/docs/ru/statusline), [`fileSuggestion`](/docs/ru/settings-reference#filesuggestion) и [`subagentStatusLine`](/docs/ru/statusline#subagent-status-lines) до управляемых параметров
281* Claude Code также отключает плагины с источником [`command`](/docs/ru/plugin-marketplaces#command-sources), включая плагины, принудительно включённые в управляемых параметрах `enabledPlugins`, если только [`disableCommandPluginSources`](/docs/ru/settings-reference#disablecommandpluginsources) явно не установлен на `false`. Источники `command` требуют Claude Code v2.1.229 или позже
282* Claude Code также блокирует команды marketplace [`headersHelper`](/docs/ru/plugin-marketplaces#authenticate-archive-downloads) если только [`disableCommandPluginSources`](/docs/ru/settings-reference#disablecommandpluginsources) явно не установлен на `false`, за исключением marketplace, которые сами управляемые параметры объявляют
283
284См. [что запускается под `allowManagedHooksOnly`](/docs/ru/settings-reference#what-runs-under-allowmanagedhooksonly).
285
286Hook записи объединяются на уровнях параметров, а не заменяют друг друга: пользовательские, проектные и локальные параметры добавляют свои собственные hooks без удаления управляемых, и параметр [`disableAllHooks`](#disable-or-remove-hooks) не может отключить управляемые hooks извне управляемых параметров.
287
288[HTTP hook allowlists](/docs/ru/settings-reference#hook-and-skill-settings) применяются к hooks из каждого источника, включая управляемые параметры политики:
289
290* `allowedHttpHookUrls`: когда определено на любом уровне параметров, Claude Code запускает обработчик HTTP hook только если его URL совпадает с объединённым allowlist
291* `httpHookAllowedEnvVars`: когда определено, Claude Code интерполирует только переменные окружения из этого списка в заголовки hook
195 292
196<h3 id="matcher-patterns">293<h3 id="matcher-patterns">
197 Matcher patterns294 Matcher patterns
218Каждый тип события совпадает с другим полем:315Каждый тип события совпадает с другим полем:
219 316
220| Событие | На что фильтр влияет | Примеры значений фильтра |317| Событие | На что фильтр влияет | Примеры значений фильтра |
221| :------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |318| :------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
222| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | имя инструмента | `Bash`, `Edit\|Write`, `mcp__.*` |319| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `PermissionDenied` | имя инструмента | `Bash`, `Edit\|Write`, `mcp__.*` |
223| `SessionStart` | как сеанс начался | `startup`, `resume`, `clear`, `compact` |320| `SessionStart` | как сеанс начался | `startup`, `resume`, `clear`, `compact`, `fork` |
224| `Setup` | какой флаг CLI запустил setup | `init`, `maintenance` |321| `Setup` | какой флаг CLI запустил setup | `init`, `maintenance` |
225| `SessionEnd` | почему сеанс закончился | `clear`, `resume`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |322| `SessionEnd` | почему сеанс закончился | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |
226| `Notification` | тип уведомления | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed` |323| `Notification` | тип уведомления | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled` |
227| `SubagentStart` | тип агента | `general-purpose`, `Explore`, `Plan`, пользовательские имена агентов или имена с областью плагина, такие как `^my-plugin:reviewer$` |324| `SubagentStart` | тип агента | `general-purpose`, `Explore`, `Plan`, пользовательские имена агентов или имена с областью плагина, такие как `^my-plugin:reviewer$` |
228| `PreCompact`, `PostCompact` | что вызвало компактирование | `manual`, `auto` |325| `PreCompact`, `PostCompact` | что вызвало компактирование | `manual`, `auto` |
326| `PreModelSwitch`, `PostModelSwitch` | каноническое имя модели, на которую переключается сеанс, как описано в [PreModelSwitch](#premodelswitch) | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |
229| `SubagentStop` | тип агента | те же значения, что и `SubagentStart` |327| `SubagentStop` | тип агента | те же значения, что и `SubagentStart` |
230| `ConfigChange` | источник конфигурации | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |328| `ConfigChange` | источник конфигурации | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |
231| `CwdChanged` | поддержка фильтра отсутствует | всегда срабатывает при каждом изменении каталога |329| `CwdChanged` | поддержка фильтра отсутствует | всегда срабатывает при каждом возникновении |
330| `DirectoryAdded` | как был добавлен каталог | `slash_command`, `register_repo_root` |
232| `FileChanged` | буквальные имена файлов для наблюдения (см. [FileChanged](#filechanged)) | `.envrc\|.env` |331| `FileChanged` | буквальные имена файлов для наблюдения (см. [FileChanged](#filechanged)) | `.envrc\|.env` |
233| `StopFailure` | тип ошибки | `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `unknown` |332| `StopFailure` | тип ошибки | `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, `unknown` |
234| `InstructionsLoaded` | причина загрузки | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |333| `InstructionsLoaded` | причина загрузки | `session_start`, `nested_traversal`, `path_glob_match`, `include`, `compact` |
235| `UserPromptExpansion` | имя команды | ваши имена skills или команд |334| `UserPromptExpansion` | имя команды | ваши имена skill или команд |
236| `Elicitation` | имя MCP сервера | ваши настроенные имена MCP серверов |335| `Elicitation` | имя MCP сервера | ваши настроенные имена MCP серверов |
237| `ElicitationResult` | имя MCP сервера | те же значения, что и `Elicitation` |336| `ElicitationResult` | имя MCP сервера | те же значения, что и `Elicitation` |
238| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | поддержка фильтра отсутствует | всегда срабатывает при каждом вхождении |337| `UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` | поддержка фильтра отсутствует | всегда срабатывает при каждом вхождении |
239 338
240Фильтр запускается против поля из [JSON входа](#hook-input-and-output), который Claude Code отправляет вашему hook на stdin. Для событий инструмента это поле — `tool_name`. Каждый раздел [hook event](#hook-events) перечисляет полный набор значений фильтра и схему входа для этого события.339Совпадение `StopFailure` на `cloud_credential_error` требует Claude Code v2.1.267 или позже, первой версии, которая сообщает об ошибках загрузки учётных данных под этим значением вместо `server_error` или `unknown`.
340
341Для большинства событий Claude Code оценивает фильтр против поля из [JSON входа](#hook-input-and-output), который он отправляет вашему hook на stdin. Для событий инструмента это поле — `tool_name`. Для `PreModelSwitch` и `PostModelSwitch`, Claude Code оценивает фильтр против канонического имени, которое он выводит из `to_model`, как описано в [PreModelSwitch](#premodelswitch). Каждый раздел [hook event](#hook-events) перечисляет полный набор значений фильтра и схему входа для этого события.
241 342
242Этот пример запускает скрипт линтинга только когда Claude пишет или редактирует файл:343Этот пример запускает скрипт линтинга только когда Claude пишет или редактирует файл:
243 344
259}360}
260```361```
261 362
262`UserPromptSubmit`, `PostToolBatch`, `Stop`, `TeammateIdle`, `TaskCreated`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove`, `MessageDisplay` и `CwdChanged` не поддерживают фильтры и всегда срабатывают при каждом вхождении. Если вы добавите поле `matcher` к этим событиям, оно будет молча проигнорировано.363Если вы добавите поле `matcher` к событию без поддержки фильтра, оно будет молча проигнорировано.
263 364
264Для событий инструмента вы можете фильтровать более узко, установив поле [`if`](#common-fields) на отдельных обработчиках hook. `if` использует [синтаксис правила разрешения](/docs/ru/permissions) для совпадения с именем инструмента и аргументами вместе, поэтому `"Bash(git *)"` запускается когда любая подкоманда входа Bash совпадает с `git *` и `"Edit(*.ts)"` запускается только для файлов TypeScript.365Для событий инструмента вы можете фильтровать более узко, установив поле [`if`](#common-fields) на отдельных обработчиках hook. `if` использует [синтаксис правила разрешения](/docs/ru/permissions) для совпадения с именем инструмента и аргументами вместе, поэтому `"Bash(git *)"` запускается когда любая подкоманда входа Bash совпадает с `git *` и `"Edit(*.ts)"` запускается только для файлов TypeScript.
265 366
323* **[Command hooks](#command-hook-fields)** (`type: "command"`): запускают команду оболочки. Ваш скрипт получает [JSON входные данные](#hook-input-and-output) события на stdin и передаёт результаты обратно через коды выхода и stdout.424* **[Command hooks](#command-hook-fields)** (`type: "command"`): запускают команду оболочки. Ваш скрипт получает [JSON входные данные](#hook-input-and-output) события на stdin и передаёт результаты обратно через коды выхода и stdout.
324* **[HTTP hooks](#http-hook-fields)** (`type: "http"`): отправляют JSON входные данные события как HTTP POST запрос на URL. Конечная точка передаёт результаты обратно через тело ответа, используя тот же [JSON формат выхода](#json-output), что и command hooks.425* **[HTTP hooks](#http-hook-fields)** (`type: "http"`): отправляют JSON входные данные события как HTTP POST запрос на URL. Конечная точка передаёт результаты обратно через тело ответа, используя тот же [JSON формат выхода](#json-output), что и command hooks.
325* **[MCP tool hooks](#mcp-tool-hook-fields)** (`type: "mcp_tool"`): вызывают инструмент на уже подключённом [MCP сервере](/docs/ru/mcp). Текстовый вывод инструмента обрабатывается как stdout command hook.426* **[MCP tool hooks](#mcp-tool-hook-fields)** (`type: "mcp_tool"`): вызывают инструмент на уже подключённом [MCP сервере](/docs/ru/mcp). Текстовый вывод инструмента обрабатывается как stdout command hook.
326* **[Prompt hooks](#prompt-and-agent-hook-fields)** (`type: "prompt"`): отправляют подсказку модели Claude для однооборотной оценки. Модель возвращает решение да/нет как JSON. См. [Prompt-based hooks](#prompt-based-hooks).427* **[Prompt hooks](#prompt-and-agent-hook-fields)** (`type: "prompt"`): отправляют подсказку модели Claude для однооборотной оценки. Модель возвращает решение как JSON. См. [Prompt-based hooks](#prompt-based-hooks).
327* **[Agent hooks](#prompt-and-agent-hook-fields)** (`type: "agent"`): порождают subagent, который может использовать инструменты, такие как Read, Grep и Glob, для проверки условий перед возвратом решения. Agent hooks являются экспериментальными и могут измениться. См. [Agent-based hooks](#agent-based-hooks).428* **[Agent hooks](#prompt-and-agent-hook-fields)** (`type: "agent"`): порождают subagent, который может использовать инструменты, такие как Read, Grep и Glob, для проверки условий перед возвратом решения. Agent hooks являются экспериментальными и могут измениться. См. [Agent-based hooks](#agent-based-hooks).
328 429
329Все совпадающие hooks запускаются параллельно, и идентичные обработчики автоматически дедублируются. Command hooks дедублируются по строке команды и `args`, а HTTP hooks дедублируются по URL.430Все совпадающие hooks запускаются параллельно. Если вы определите один и тот же обработчик в более чем одном файле настроек, он запускается один раз. Копия плагина или skill одного и того же обработчика остаётся отдельной.
431
432Обработчики запускаются в текущем каталоге с окружением Claude Code. Если текущий каталог больше не существует, например worktree или временный каталог, который другая оболочка удалила в середине сеанса, Claude Code запускает command hooks из первого из них, который всё ещё существует: каталог, в котором сеанс начался, корень проекта, ваш домашний каталог или системный временный каталог. Claude Code записывает предупреждение, называющее резервный каталог, в [debug log](#debug-hooks).
330 433
331Обработчики запускаются в текущем каталоге с окружением Claude Code. Переменная окружения `$CLAUDE_CODE_REMOTE` устанавливается на `"true"` в удалённых веб-окружениях и не устанавливается в локальном CLI. Начиная с v2.1.199, [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/ru/env-vars) устанавливается на ID сеанса [Remote Control](/docs/ru/remote-control) пока локальный сеанс имеет активное соединение Remote Control.434Переменная окружения `$CLAUDE_CODE_REMOTE` устанавливается на `"true"` в удалённых веб-окружениях и не устанавливается в локальном CLI. Claude Code v2.1.199 и позже устанавливает [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/docs/ru/env-vars) на ID сеанса [Remote Control](/docs/ru/remote-control) пока локальный сеанс имеет активное соединение Remote Control.
332 435
333<h4 id="common-fields">436<h4 id="common-fields">
334 Common fields437 Common fields
337Эти поля применяются ко всем типам hooks:440Эти поля применяются ко всем типам hooks:
338 441
339| Поле | Обязательно | Описание |442| Поле | Обязательно | Описание |
340| :-------------- | :---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |443| :-------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
341| `type` | да | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` или `"agent"` |444| `type` | да | `"command"`, `"http"`, `"mcp_tool"`, `"prompt"` или `"agent"` |
342| `if` | нет | Синтаксис правила разрешения для фильтрации срабатывания этого hook, такой как `"Bash(git *)"` или `"Edit(*.ts)"`. Hook запускается только если вызов инструмента совпадает с шаблоном. См. таблицу [Bash matching table](#bash-if-matching) ниже для того, как Bash шаблоны оцениваются против подкоманд, `$()` и обратных кавычек. Оценивается только на событиях инструмента: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` и `PermissionDenied`. На других событиях hook с установленным `if` никогда не запускается. Использует тот же синтаксис, что и [правила разрешения](/docs/ru/permissions) |445| `if` | нет | Синтаксис правила разрешения для фильтрации срабатывания этого hook, такой как `"Bash(git *)"` или `"Edit(*.ts)"`. Hook запускается только если вызов инструмента совпадает с шаблоном. См. таблицу [Bash matching table](#bash-if-matching) ниже для того, как Bash шаблоны оцениваются против подкоманд, `$()` и обратных кавычек. Оценивается только на событиях инструмента: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` и `PermissionDenied`. На других событиях hook с установленным `if` никогда не запускается. Использует тот же синтаксис, что и [правила разрешения](/docs/ru/permissions) |
343| `timeout` | нет | Секунды перед отменой. Значения по умолчанию: 600 для `command`, `http` и `mcp_tool`; 30 для `prompt`; 60 для `agent`. [`UserPromptSubmit`](#userpromptsubmit) снижает значение по умолчанию для `command`, `http` и `mcp_tool` до 30, и [`MessageDisplay`](#messagedisplay) снижает его до 10 |446| `timeout` | нет | Секунды перед отменой. Claude Code не применяет его на command hook, который вы запускаете с [`async: true`](#run-hooks-in-the-background). Значения по умолчанию: 600 для `command`, `http` и `mcp_tool`; 30 для `prompt`; 60 для `agent`. Claude Code снижает значение по умолчанию для `command`, `http` и `mcp_tool` до 30 на [`UserPromptSubmit`](#userpromptsubmit), [`PreModelSwitch`](#premodelswitch) и [`PostModelSwitch`](#postmodelswitch), и до 10 на [`MessageDisplay`](#messagedisplay). Hooks [`SessionEnd`](#sessionend) делят бюджет 1.5 секунды; если ваши параметры устанавливают более длительный `timeout` для каждого hook, Claude Code повышает бюджет, чтобы совпадать, до 60 секунд |
344| `statusMessage` | нет | Пользовательское сообщение спиннера, отображаемое во время выполнения hook |447| `statusMessage` | нет | Пользовательское сообщение спиннера, отображаемое во время выполнения hook |
345| `once` | нет | Если `true`, запускается один раз за сеанс затем удаляется. Только для hooks, объявленных в [skill frontmatter](#hooks-in-skills-and-agents); игнорируется в файлах настроек и agent frontmatter |448| `once` | нет | Если `true`, Claude Code удаляет hook после его первого успешного запуска. Запуск, который не удаётся, блокирует с кодом выхода 2 или истекает по времени, оставляет hook на месте, поэтому он запускается снова при следующем совпадающем событии. Только для hooks, объявленных в [skill frontmatter](#hooks-in-skills-and-agents); игнорируется в файлах настроек и agent frontmatter |
346 449
347Поле `if` содержит ровно одно правило разрешения. Нет синтаксиса `&&`, `||` или списка для объединения правил; чтобы применить несколько условий, определите отдельный обработчик hook для каждого.450Поле `if` содержит ровно одно правило разрешения. Нет синтаксиса `&&`, `||` или списка для объединения правил; чтобы применить несколько условий, определите отдельный обработчик hook для каждого.
348 451
452В условии `if` для инструмента файла, шаблон каталога с одним сегментом, такой как `"Edit(src/**)"`, совпадает только с каталогом `src` в рабочем каталоге и файлами под ним. Чтобы совпадать с каталогом с именем `src` на любой глубине, напишите `"Edit(**/src/**)"`. До v2.1.214, `"Edit(src/**)"` совпадал с каталогом с именем `src` на любой глубине под рабочим каталогом.
453
349<span id="bash-if-matching" />Для Bash шаблонов, запускается ли ваша команда hook зависит от формы шаблона и команды Bash, которую вызывает Claude. Ведущие присваивания `VAR=value` удаляются перед совпадением.454<span id="bash-if-matching" />Для Bash шаблонов, запускается ли ваша команда hook зависит от формы шаблона и команды Bash, которую вызывает Claude. Ведущие присваивания `VAR=value` удаляются перед совпадением.
350 455
351| `if` шаблон | Bash команда | Hook запускается? | Почему |456| `if` шаблон | Bash команда | Hook запускается? | Почему |
352| :----------------- | :--------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------- |457| :----------------- | :-------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------- |
353| `Bash(git *)` | `FOO=bar git push` | да | ведущие присваивания удаляются; `git push` совпадает |458| `Bash(git *)` | `FOO=bar git push` | да | ведущие присваивания удаляются; `git push` совпадает |
354| `Bash(git *)` | `npm test && git push` | да | каждая подкоманда проверяется; `git push` совпадает |459| `Bash(git *)` | `npm test && git push` | да | каждая подкоманда проверяется; `git push` совпадает |
355| `Bash(rm *)` | `echo $(rm -rf /)` | да | команды внутри `$()` и обратных кавычек проверяются; `rm -rf /` совпадает |460| `Bash(rm *)` | `echo $(rm -rf /)` | да | команды внутри `$()` и обратных кавычек проверяются; `rm -rf /` совпадает |
356| `Bash(rm *)` | `echo $(date)` | нет | ни одна подкоманда не совпадает с `rm *` |461| `Bash(rm *)` | `echo $(date)` | нет | ни одна подкоманда не совпадает с `rm *` |
462| `Bash(cat *)` | `echo before $(date) after` | нет | подстановка может находиться в любой позиции аргумента, поэтому проверяются полная команда и `date`; ни одна не совпадает с `cat *` |
463| `Bash(git *)` | `$TOOL git push` | да | Claude Code не может определить, на что расширяется имя команды, поэтому он запускает hook |
357| `Bash(git push *)` | `echo $(date)` | да | шаблоны, которые указывают больше чем имя команды, запускают hook в любом случае на `$()`, обратных кавычках или `$VAR` |464| `Bash(git push *)` | `echo $(date)` | да | шаблоны, которые указывают больше чем имя команды, запускают hook в любом случае на `$()`, обратных кавычках или `$VAR` |
358 465
359Фильтр также открывается с ошибкой, запуская ваш hook независимо от шаблона, когда команда Bash не может быть проанализирована. Поскольку фильтр `if` является лучшим усилием, используйте [систему разрешений](/docs/ru/permissions) вместо hook для обеспечения жёсткого разрешения или отказа.466Когда Claude Code не может определить, какие команды запускает входные данные Bash, он запускает ваш hook независимо от шаблона. Поскольку фильтр `if` является лучшим усилием, используйте [систему разрешений](/docs/ru/permissions) вместо hook для обеспечения жёсткого разрешения или отказа.
360 467
361<h4 id="command-hook-fields">468<h4 id="command-hook-fields">
362 Command hook fields469 Command hook fields
369| `command` | да | Команда оболочки для выполнения. С `args`, исполняемый файл для прямого запуска. См. [Exec form and shell form](#exec-form-and-shell-form) |476| `command` | да | Команда оболочки для выполнения. С `args`, исполняемый файл для прямого запуска. См. [Exec form and shell form](#exec-form-and-shell-form) |
370| `args` | нет | Список аргументов. Когда присутствует, `command` разрешается как исполняемый файл и запускается напрямую с `args` как вектор аргументов, без участия оболочки. См. [Exec form and shell form](#exec-form-and-shell-form) |477| `args` | нет | Список аргументов. Когда присутствует, `command` разрешается как исполняемый файл и запускается напрямую с `args` как вектор аргументов, без участия оболочки. См. [Exec form and shell form](#exec-form-and-shell-form) |
371| `async` | нет | Если `true`, запускается в фоне без блокировки. См. [Run hooks in the background](#run-hooks-in-the-background) |478| `async` | нет | Если `true`, запускается в фоне без блокировки. См. [Run hooks in the background](#run-hooks-in-the-background) |
372| `asyncRewake` | нет | Если `true`, запускается в фоне и пробуждает Claude при коде выхода 2. Подразумевает `async`. Stderr hook или stdout, если stderr пусто, показывается Claude как системное напоминание, чтобы он мог реагировать на долгоживущий фоновый сбой |479| `asyncRewake` | нет | Если `true`, запускается в фоне и пробуждает Claude при коде выхода 2. Hook stderr или stdout, если stderr пусто, показывается Claude как системное напоминание, чтобы он мог реагировать на долгоживущий фоновый сбой |
373| `shell` | нет | Оболочка для использования для этого hook. Принимает `"bash"` или `"powershell"`. По умолчанию `"bash"`, или `"powershell"` на Windows когда Git Bash не установлен. Установка `"powershell"` запускает команду через PowerShell на Windows. Не требует `CLAUDE_CODE_USE_POWERSHELL_TOOL`, так как hooks порождают PowerShell напрямую. Игнорируется когда установлен `args` |480| `shell` | нет | Оболочка для использования для этого hook. Принимает `"bash"` или `"powershell"`. По умолчанию `"bash"`, или `"powershell"` на Windows когда Git Bash не установлен. Установка `"powershell"` запускает команду через PowerShell на Windows. Не требует `CLAUDE_CODE_USE_POWERSHELL_TOOL`, так как hooks порождают PowerShell напрямую. Игнорируется когда установлен `args` |
374 481
375<a id="exec-form-and-shell-form" />482<a id="exec-form-and-shell-form" />
431 538
432Claude Code отправляет [JSON входные данные](#hook-input-and-output) hook как тело POST запроса с `Content-Type: application/json`. Тело ответа использует тот же [JSON формат выхода](#json-output), что и command hooks.539Claude Code отправляет [JSON входные данные](#hook-input-and-output) hook как тело POST запроса с `Content-Type: application/json`. Тело ответа использует тот же [JSON формат выхода](#json-output), что и command hooks.
433 540
434Обработка ошибок отличается от command hooks: ответы не 2xx, сбои соединения и таймауты все производят неблокирующие ошибки, которые позволяют выполнению продолжаться. Чтобы заблокировать вызов инструмента или отклонить разрешение, верните ответ 2xx с JSON телом, содержащим `decision: "block"` или `hookSpecificOutput` с `permissionDecision: "deny"`.541Обработка ошибок отличается от command hooks; см. [HTTP response handling](#http-response-handling).
435 542
436Этот пример отправляет события `PreToolUse` на локальный сервис валидации, аутентифицируясь с токеном из переменной окружения `MY_TOKEN`:543Этот пример отправляет события `PreToolUse` на локальный сервис валидации, аутентифицируясь с токеном из переменной окружения `MY_TOKEN`:
437 544
470| `tool` | да | Имя инструмента для вызова на этом сервере |577| `tool` | да | Имя инструмента для вызова на этом сервере |
471| `input` | нет | Аргументы, передаваемые инструменту. Строковые значения поддерживают подстановку `${path}` из [JSON входа](#hook-input-and-output) hook, такую как `"${tool_input.file_path}"` |578| `input` | нет | Аргументы, передаваемые инструменту. Строковые значения поддерживают подстановку `${path}` из [JSON входа](#hook-input-and-output) hook, такую как `"${tool_input.file_path}"` |
472 579
473Текстовое содержимое инструмента обрабатывается как stdout command hook: если оно анализируется как действительный [JSON выход](#json-output), оно обрабатывается как решение, в противном случае оно показывается как простой текст. Если названный сервер не подключён или инструмент возвращает `isError: true`, hook производит неблокирующую ошибку и выполнение продолжается.580Claude Code читает текстовое содержимое инструмента так же, как читает command-hook stdout, следуя [правилу разбора под кодом выхода 0](#exit-code-0). Если названный сервер не подключён или инструмент возвращает `isError: true`, hook производит неблокирующую ошибку и выполнение продолжается.
474
475MCP tool hooks доступны на каждом hook событии после того, как Claude Code подключился к вашим MCP серверам. `SessionStart` и `Setup` обычно срабатывают до завершения подключения серверов, поэтому hooks на этих событиях должны ожидать ошибку "не подключено" при первом запуске.
476 581
477Этот пример вызывает инструмент `security_scan` на MCP сервере `my_server` после каждого `Write` или `Edit`, передавая путь отредактированного файла:582Этот пример вызывает инструмент `security_scan` на MCP сервере `my_server` после каждого `Write` или `Edit`, передавая путь отредактированного файла:
478 583
496}601}
497```602```
498 603
604MCP tool hook может запускаться только после того, как Claude Code сделал MCP серверы сеанса доступными для hooks. `SessionStart` и `Setup` могут срабатывать до этого момента:
605
606* **При запуске**: `SessionStart` срабатывает перед доступностью серверов, включая когда вы запускаете с `--continue` или `--resume`. Claude Code пропускает `mcp_tool` hooks события без вызова их инструментов, и [debug log](#debug-hooks) записывает `mcp_tool hooks are not available for the 'SessionStart' hook event (no MCP client context)`.
607* **Позже в работающем сеансе**: после `/clear` или компактирования, `SessionStart` срабатывает снова с серверами уже доступными, и его `mcp_tool` hooks запускаются.
608* **На `Setup`**: `Setup` всегда срабатывает перед доступностью серверов, поэтому Claude Code пропускает его `mcp_tool` hooks каждый раз и записывает то же сообщение, называющее `Setup`.
609
610Например, эта конфигурация вызывает инструмент `load_context` на MCP сервере `my_server` из hook `SessionStart` без фильтра, поэтому она применяется к каждому источнику `SessionStart`:
611
612```json theme={null}
613{
614 "hooks": {
615 "SessionStart": [
616 {
617 "hooks": [
618 {
619 "type": "mcp_tool",
620 "server": "my_server",
621 "tool": "load_context"
622 }
623 ]
624 }
625 ]
626 }
627}
628```
629
630Когда вы запускаете `claude`, Claude Code пропускает этот hook, никогда не вызывает `load_context` и записывает сообщение `no MCP client context` в debug log. Запустите `/clear` в том же сеансе и hook запустится и вызовет `load_context`. Hook `type: "command"` на `SessionStart` запускается при запуске, поэтому используйте один для всего, что сеансу нужно с его первого хода.
631
499<h4 id="prompt-and-agent-hook-fields">632<h4 id="prompt-and-agent-hook-fields">
500 Prompt and agent hook fields633 Prompt and agent hook fields
501</h4>634</h4>
513 646
514Используйте эти заполнители для ссылки на скрипты hook относительно корня проекта или плагина, независимо от рабочего каталога при запуске hook:647Используйте эти заполнители для ссылки на скрипты hook относительно корня проекта или плагина, независимо от рабочего каталога при запуске hook:
515 648
516* `${CLAUDE_PROJECT_DIR}`: корень проекта. Claude Code также устанавливает эту переменную в окружении [stdio MCP серверов](/docs/ru/mcp#option-3-add-a-local-stdio-server) и plugin LSP серверов.649* `${CLAUDE_PROJECT_DIR}`: корень проекта, где сеанс начался. Claude Code также устанавливает эту переменную в окружении [stdio MCP серверов](/docs/ru/mcp#option-3-add-a-local-stdio-server) и plugin LSP серверов.
517* `${CLAUDE_PLUGIN_ROOT}`: каталог установки плагина, для скриптов, поставляемых с [плагином](/docs/ru/plugins). Изменяется при каждом обновлении плагина.650* `${CLAUDE_PLUGIN_ROOT}`: каталог установки плагина, для скриптов, поставляемых с [плагином](/docs/ru/plugins). См. [plugin environment variables](/docs/ru/plugins-reference#environment-variables) для того, как путь ведёт себя при обновлениях.
518* `${CLAUDE_PLUGIN_DATA}`: [каталог постоянных данных](/docs/ru/plugins-reference#persistent-data-directory) плагина, для зависимостей и состояния, которые должны пережить обновления плагина.651* `${CLAUDE_PLUGIN_DATA}`: [каталог постоянных данных](/docs/ru/plugins-reference#persistent-data-directory) плагина, для зависимостей и состояния, которые должны пережить обновления плагина.
519 652
520Предпочитайте [exec form](#exec-form-and-shell-form) для любого hook, который ссылается на path placeholder. Exec form передаёт каждый элемент `args` как один аргумент без токенизации оболочки, поэтому пути с пробелами или специальными символами не нуждаются в кавычках. В shell form оберните каждый заполнитель в двойные кавычки.653<Note>
654 **Worktrees отличаются.** Если Claude входит в [worktree](/docs/ru/worktrees) во время сеанса, Claude Code держит `${CLAUDE_PROJECT_DIR}` там, где он был, и передаёт путь worktree вашим hooks другим способом:
655
656 * **`${CLAUDE_PROJECT_DIR}` остаётся на месте**: он всё ещё указывает на корень проекта, где сеанс начался, поэтому команда, такая как `${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh`, всё ещё запускает скрипт в основной checkout.
657 * **`cwd` следует за Claude**: поле `cwd` в [входных JSON](#common-input-fields) hook — это корень worktree после того, как Claude входит в worktree, и новый каталог после того, как Claude запускает `cd`. Прочитайте его, когда hook нужно знать, в каком каталоге Claude работает.
658</Note>
659
660Предпочитайте [exec form](#exec-form-and-shell-form) для любого hook, который ссылается на path placeholder. В shell form оберните каждый заполнитель в двойные кавычки.
521 661
522<Tabs>662<Tabs>
523 <Tab title="Project scripts">663 <Tab title="Project scripts">
577 Hooks in skills and agents717 Hooks in skills and agents
578</h3>718</h3>
579 719
580В дополнение к файлам настроек и плагинам, hooks могут быть определены непосредственно в [skills](/docs/ru/skills) и [subagents](/docs/ru/sub-agents) с использованием frontmatter. Эти hooks ограничены жизненным циклом компонента и запускаются только когда этот компонент активен.720В дополнение к файлам настроек и плагинам, hooks могут быть определены непосредственно в [skills](/docs/ru/skills) и [subagents](/docs/ru/sub-agents) с использованием frontmatter, в том же формате конфигурации, что и hooks на основе настроек. Как долго Claude Code их регистрирует, зависит от компонента:
581
582Поддерживаются все hook события. Для subagents, `Stop` hooks автоматически преобразуются в `SubagentStop`, так как это событие, которое срабатывает при завершении subagent.
583 721
584Hooks используют тот же формат конфигурации, что и hooks на основе настроек, но ограничены жизненным циклом компонента и очищаются при его завершении.722* **Subagent hooks**: Claude Code запускает их только пока этот subagent работает и удаляет их, когда он завершается. Claude Code преобразует hook `Stop` здесь в `SubagentStop`, событие, которое срабатывает при завершении subagent.
723* **Skill hooks**: Claude Code регистрирует их, когда вы или Claude вызываете skill, и продолжает запускать их для остатка сеанса, на ходах после собственного хода skill. Чтобы Claude Code удалил hook после его первого успешного запуска вместо этого, установите [`once: true`](#common-fields) на нём.
585 724
586Этот skill определяет hook `PreToolUse`, который запускает скрипт проверки безопасности перед каждой командой `Bash`:725Этот skill определяет hook `PreToolUse`, который запускает скрипт проверки безопасности перед каждой командой `Bash`:
587 726
598---737---
599```738```
600 739
601Agents используют тот же формат в своём YAML frontmatter.740Subagents используют тот же формат в своём YAML frontmatter.
741
742Frontmatter hooks в project skill следуют тому же [правилу доверия рабочей области, что и hooks в файлах настроек](#workspace-trust). Claude Code регистрирует их, когда вы или Claude вызываете skill, включая в запуск `-p` в папке, которую вы не доверяли.
743
744Frontmatter hooks в project subagent запускаются только после того, как вы примете [диалог доверия рабочей области](/docs/ru/permissions#project-allow-rules-and-workspace-trust) для папки, из которой пришёл файл агента. Сеанс `-p` не считается принятием. [Что запускается перед тем, как вы доверяете папке](/docs/ru/permissions#what-runs-before-you-trust-a-folder) сравнивает это с правилом файла настроек, и страница subagents перечисляет [какие области исключены](/docs/ru/sub-agents#hooks-in-subagent-frontmatter). До v2.1.218, эти hooks могли запускаться из папок, которым вы не доверяли.
602 745
603<h3 id="the-/hooks-menu">746<h3 id="the-/hooks-menu">
604 Меню `/hooks`747 Меню `/hooks`
608 751
609Меню отображает все пять типов hook: `command`, `prompt`, `agent`, `http` и `mcp_tool`. Каждый hook помечен префиксом `[type]` и источником, указывающим, где он был определён:752Меню отображает все пять типов hook: `command`, `prompt`, `agent`, `http` и `mcp_tool`. Каждый hook помечен префиксом `[type]` и источником, указывающим, где он был определён:
610 753
611* `User`: из `~/.claude/settings.json`754* `User Settings`: из `~/.claude/settings.json`
612* `Project`: из `.claude/settings.json`755* `Project Settings`: из `.claude/settings.json`
613* `Local`: из `.claude/settings.local.json`756* `Local Settings`: из `.claude/settings.local.json`
614* `Plugin`: из `hooks/hooks.json` плагина757* `Plugin Hooks`: из `hooks/hooks.json` плагина
615* `Session`: зарегистрирован в памяти для текущего сеанса758* `Session Hooks`: зарегистрирован в памяти для текущего сеанса
616* `Built-in`: зарегистрирован внутри Claude Code
617 759
618Выбор hook открывает представление деталей, показывающее его событие, фильтр, тип, исходный файл и полную команду, подсказку или URL. Меню только для чтения: чтобы добавить, изменить или удалить hooks, отредактируйте JSON настроек напрямую или попросите Claude сделать изменение.760Выбор hook открывает представление деталей, показывающее его событие, фильтр, тип, исходный файл и полную команду, подсказку или URL. Меню только для чтения: чтобы добавить, изменить или удалить hooks, отредактируйте JSON настроек напрямую или попросите Claude сделать изменение.
619 761
623 765
624Чтобы удалить hook, удалите его запись из JSON файла настроек.766Чтобы удалить hook, удалите его запись из JSON файла настроек.
625 767
626Чтобы временно отключить все hooks без их удаления, установите `"disableAllHooks": true` в файле настроек. Нет способа отключить отдельный hook, сохраняя его в конфигурации.768Чтобы временно отключить все hooks без их удаления, установите `"disableAllHooks": true` в файле настроек. Claude Code читает значение, оставшееся после применения [приоритета параметров](/docs/ru/settings#settings-precedence), поэтому `"disableAllHooks": false` в `.claude/settings.json` проекта переопределяет `true` в ваших пользовательских параметрах. Чтобы отключить hooks для одного запуска, независимо от того, что говорят параметры проекта, передайте `--settings '{"disableAllHooks": true}'`, что имеет приоритет над параметрами проекта и локальными параметрами. Нет способа отключить отдельный hook, сохраняя его в конфигурации.
627 769
628Параметр `disableAllHooks` соблюдает иерархию управляемых настроек. Если администратор настроил hooks через управляемые параметры политики, `disableAllHooks`, установленный в пользовательских, проектных или локальных настройках, не может отключить эти управляемые hooks. Только `disableAllHooks`, установленный на уровне управляемых настроек, может отключить управляемые hooks.770Параметр `disableAllHooks` соблюдает иерархию управляемых параметров. Если администратор настроил hooks через управляемые параметры политики, `disableAllHooks`, установленный в пользовательских, проектных или локальных параметрах, не может отключить эти управляемые hooks. Только `disableAllHooks`, установленный на уровне управляемых параметров, может отключить управляемые hooks. Для полного охвата каждого уровня см. [`disableAllHooks`](/docs/ru/settings-reference#disableallhooks).
629 771
630Прямые редактирования hooks в файлах настроек обычно захватываются автоматически наблюдателем файлов.772Прямые редактирования hooks в файлах настроек обычно захватываются автоматически наблюдателем файлов.
631 773
633 Входные и выходные данные Hook775 Входные и выходные данные Hook
634</h2>776</h2>
635 777
636Command hooks получают JSON данные через stdin и передают результаты через коды выхода, stdout и stderr. HTTP hooks получают тот же JSON как тело POST запроса и передают результаты через тело HTTP ответа. Этот раздел охватывает поля и поведение, общие для всех событий. Каждый раздел события под [Hook events](#hook-events) включает его специфическую схему входа и параметры управления решением.778Hooks команд получают JSON-данные через stdin и передают результаты через коды выхода, stdout и stderr. HTTP hooks получают тот же JSON, что и тело POST-запроса, и передают результаты через тело HTTP-ответа. В этом разделе рассматриваются поля и поведение, общие для всех событий. Каждый раздел события в разделе [Hook events](#hook-events) включает его конкретную схему входных данных и параметры управления решением.
637 779
638На macOS и Linux command hooks запускаются в своём собственном сеансе без управляющего терминала начиная с v2.1.139. Процесс hook и любые дочерние процессы не могут открыть `/dev/tty` или отправлять escape последовательности непосредственно в интерфейс Claude Code. Windows не имеет `/dev/tty`. Чтобы вывести сообщение пользователю на любой платформе, верните [`systemMessage`](#json-output) в JSON выходе. Чтобы вызвать уведомление рабочего стола, установить заголовок окна или издать звуковой сигнал, верните [`terminalSequence`](#emit-terminal-notifications) вместо этого.780На macOS и Linux hooks команд запускаются в собственном сеансе без управляющего терминала. Процесс hook и любые дочерние процессы не могут открыть `/dev/tty` или отправлять последовательности escape непосредственно в интерфейс Claude Code. Windows не имеет `/dev/tty`.
781
782Чтобы вывести сообщение пользователю на любой платформе, верните [`systemMessage`](#json-output) в JSON-выводе. Некоторые события игнорируют его или доставляют его в другое место, и в каждом [разделе события](#hook-events) указано, как это происходит. Чтобы вызвать уведомление рабочего стола, установить заголовок окна или издать звуковой сигнал, верните [`terminalSequence`](#emit-terminal-notifications) вместо этого.
639 783
640<h3 id="common-input-fields">784<h3 id="common-input-fields">
641 Общие входные поля785 Общие входные поля
642</h3>786</h3>
643 787
644Hook события получают эти поля как JSON, в дополнение к полям, специфичным для события, документированным в каждом разделе [hook event](#hook-events). Для command hooks этот JSON поступает через stdin. Для HTTP hooks он поступает как тело POST запроса.788Hook события получают эти поля в виде JSON в дополнение к полям, специфичным для события, задокументированным в каждом разделе [hook event](#hook-events). Для hooks команд этот JSON поступает через stdin. Для HTTP hooks он поступает как тело POST-запроса.
645 789
646| Поле | Описание |790| Поле | Описание |
647| :---------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |791| :---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
648| `session_id` | Текущий идентификатор сеанса |792| `session_id` | Текущий идентификатор сеанса |
649| `prompt_id` | UUID, идентифицирующий пользовательский запрос, который в настоящее время обрабатывается. Совпадает с атрибутом [`prompt.id` на событиях OpenTelemetry](/docs/ru/monitoring-usage#event-correlation-attributes), поэтому вы можете коррелировать выход hook с телеметрией для одного запроса. Отсутствует до первого пользовательского ввода. Требует Claude Code v2.1.196 или позже |793| `prompt_id` | UUID, идентифицирующий пользовательский запрос, который в настоящее время обрабатывается. Совпадает с атрибутом [`prompt.id` на событиях OpenTelemetry](/docs/ru/monitoring-usage#event-correlation-attributes), поэтому вы можете коррелировать выход hook с телеметрией для одного запроса. Отсутствует до первого ввода пользователя. Требуется Claude Code v2.1.196 или позже |
650| `transcript_path` | Путь к JSON разговора. Файл транскрипта записывается асинхронно и может отставать от разговора в памяти, поэтому он может ещё не включать самые последние сообщения текущего хода, когда срабатывает hook. Hooks, которым нужен финальный текст ассистента текущего хода, должны использовать `last_assistant_message` на [Stop](#stop) и [SubagentStop](#subagentstop) вместо чтения транскрипта |794| `transcript_path` | Путь к файлу JSON разговора. Файл транскрипта записывается асинхронно и может отставать от разговора в памяти, поэтому он может еще не включать самые последние сообщения текущего хода, когда срабатывает hook. Hooks, которым нужен финальный текст ассистента текущего хода, должны использовать `last_assistant_message` на [Stop](#stop) и [SubagentStop](#subagentstop) вместо чтения транскрипта |
651| `cwd` | Текущий рабочий каталог при вызове hook |795| `cwd` | Текущий рабочий каталог при вызове hook |
652| `permission_mode` | Текущий [режим разрешения](/docs/ru/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` или `"bypassPermissions"`. Режим, обозначенный как **Manual**, поступает как `"default"`, никогда не как `"manual"`, поэтому скрипты, которые совпадают с `"default"`, продолжают работать. Не все события получают это поле. Проверьте пример JSON в каждом разделе [hook event](#hook-events) |796| `scratchpad_dir` | Путь к каталогу scratchpad сеанса, где Claude хранит временные рабочие файлы. Отсутствует, когда сеанс не имеет scratchpad или временный каталог недоступен. Требуется Claude Code v2.1.257 или позже |
653| `effort` | Объект с полем `level`, содержащим активный [уровень усилий](/docs/ru/model-config#adjust-effort-level) для хода: `"low"`, `"medium"`, `"high"`, `"xhigh"` или `"max"`. Если запрошенный уровень усилий модели превышает то, что поддерживает текущая модель, это понижающий уровень, который модель фактически использовала. Ultracode не является отдельным уровнем и сообщается как `"xhigh"`. Объект соответствует полю `effort` [строки статуса](/docs/ru/statusline#available-data). Присутствует для событий, которые срабатывают в контексте использования инструмента, таких как `PreToolUse`, `PostToolUse`, `Stop` и `SubagentStop`, когда текущая модель поддерживает параметр усилий. Уровень также доступен для команд hook и инструмента Bash как переменная окружения `$CLAUDE_EFFORT`. |797| `permission_mode` | Текущий [режим разрешений](/docs/ru/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"auto"`, `"dontAsk"` или `"bypassPermissions"`. Режим, обозначенный как **Manual**, поступает как `"default"`, никогда не как `"manual"`, поэтому скрипты, которые совпадают с `"default"`, продолжают работать. Не все события получают это поле. Проверьте пример JSON в каждом разделе [hook event](#hook-events) |
798| `effort` | Объект с полем `level`, содержащим [уровень усилий](/docs/ru/model-config#adjust-effort-level), действующий при запуске hook: `"low"`, `"medium"`, `"high"`, `"xhigh"` или `"max"`. Если вы установите уровень, который активная модель не поддерживает, `level` сообщает уровень, который вместо этого запустил Claude Code; [Adjust effort level](/docs/ru/model-config#adjust-effort-level) говорит, как он выбирает этот уровень. Ultracode не является отдельным уровнем и сообщается как `"xhigh"`. Объект совпадает с полем `effort` [строки состояния](/docs/ru/statusline#available-data). Присутствует для событий, которые срабатывают в контексте использования инструмента, таких как `PreToolUse`, `PostToolUse`, `Stop` и `SubagentStop`, когда текущая модель поддерживает параметр усилий. Уровень также доступен для команд hook и инструмента Bash как переменная окружения `$CLAUDE_EFFORT`. |
654| `hook_event_name` | Имя события, которое сработало |799| `hook_event_name` | Имя события, которое сработало |
655 800
656При запуске с `--agent` или внутри subagent включаются два дополнительных поля:801При запуске с `--agent` или внутри subagent включаются два дополнительных поля:
657 802
658| Поле | Описание |803| Поле | Описание |
659| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |804| :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
660| `agent_id` | Уникальный идентификатор для subagent. Присутствует только когда hook срабатывает внутри вызова subagent. Используйте это для различения вызовов hook subagent от вызовов основного потока. |805| `agent_id` | Уникальный идентификатор для subagent. Присутствует только когда hook срабатывает внутри вызова subagent. Используйте это для различения вызовов hook subagent от вызовов основного потока. |
661| `agent_type` | Имя агента (например, `"Explore"` или `"security-reviewer"`). Присутствует когда сеанс использует `--agent` или hook срабатывает внутри subagent. Для subagents тип subagent имеет приоритет над значением `--agent` сеанса. Для [пользовательских subagents](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла. Для subagents, поставляемых [plugin](/docs/ru/plugins), это идентификатор с областью видимости плагина, такой как `my-plugin:reviewer`, а не простое имя frontmatter. См. [SubagentStart](#subagentstart) для того, как написать matcher для имени с областью видимости плагина. |806| `agent_type` | Имя агента (например, `"Explore"` или `"security-reviewer"`). Присутствует, когда сеанс использует `--agent` или hook срабатывает внутри subagent. Для subagents тип subagent имеет приоритет над значением `--agent` сеанса. См. [SubagentStart](#subagentstart) для значений, которые сообщают пользовательские и plugin subagents, и как написать matcher для имени с областью plugin. |
807
808Только hooks [`SessionStart`](#sessionstart) могут получить поле `model`, и Claude Code не всегда его включает. Hooks [`PreModelSwitch`](#premodelswitch) и [`PostModelSwitch`](#postmodelswitch) получают `from_model` и `to_model` вместо этого, поэтому используйте hook PostModelSwitch для отслеживания модели по мере ее изменения во время сеанса.
662 809
663Только hooks [`SessionStart`](#sessionstart) могут получать поле `model`, и его присутствие не гарантировано. Нет переменной окружения `$CLAUDE_MODEL`. Процесс hook наследует родительское окружение, поэтому он может читать `$ANTHROPIC_MODEL`, если вы установили её в вашей оболочке, но это значение не меняется при переключении моделей с `/model` во время сеанса. Один набор переменных не наследуется: Claude Code [удаляет переменные экспортера `OTEL_*` из каждого подпроцесса, который он порождает](/docs/ru/monitoring-usage#administrator-configuration), включая hooks.810Нет переменной окружения `$CLAUDE_MODEL`. Hook может читать `$ANTHROPIC_MODEL`, если вы установили ее в своей оболочке, но это значение не изменяется при переключении моделей с помощью `/model` во время сеанса.
811
812Процесс hook наследует родительское окружение, за исключением переменных экспортера `OTEL_*`, которые Claude Code [удаляет из каждого подпроцесса, который он порождает](/docs/ru/monitoring-usage#administrator-configuration), и, когда установлена [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/docs/ru/env-vars#variables) в `1`, переменные, которые он удаляет.
664 813
665Например, hook `PreToolUse` для команды Bash получает это на stdin:814Например, hook `PreToolUse` для команды Bash получает это на stdin:
666 815
670 "prompt_id": "550e8400-e29b-41d4-a716-446655440000",819 "prompt_id": "550e8400-e29b-41d4-a716-446655440000",
671 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",820 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",
672 "cwd": "/home/user/my-project",821 "cwd": "/home/user/my-project",
822 "scratchpad_dir": "/tmp/claude-1000/-home-user-my-project/abc123/scratchpad",
673 "permission_mode": "default",823 "permission_mode": "default",
674 "hook_event_name": "PreToolUse",824 "hook_event_name": "PreToolUse",
675 "tool_name": "Bash",825 "tool_name": "Bash",
676 "tool_input": {826 "tool_input": {
677 "command": "npm test"827 "command": "npm test",
678 }828 "description": "Run test suite",
829 "timeout": 120000,
830 "run_in_background": false
831 },
832 "tool_use_id": "toolu_01ABC123..."
679}833}
680```834```
681 835
682Поля `tool_name` и `tool_input` специфичны для события. Каждый раздел [hook event](#hook-events) документирует дополнительные поля для этого события.836Поля `tool_name`, `tool_input` и `tool_use_id` специфичны для события. Каждый раздел [hook event](#hook-events) документирует дополнительные поля для этого события.
683 837
684<h3 id="exit-code-output">838<h3 id="exit-code-output">
685 Выходные коды выхода839 Выходные коды выхода
686</h3>840</h3>
687 841
688Код выхода из вашей команды hook говорит Claude Code, должно ли действие продолжаться, быть заблокировано или быть проигнорировано.842Код выхода из вашей команды hook сообщает Claude Code, должно ли действие продолжаться, быть заблокировано или игнорироваться. Код выхода не действует в одиночку. Claude Code читает поля [JSON output](#json-output) из stdout при каждом коде выхода, не только 0, и для событий, которые используют стандартную модель решения, проанализированный объект, который проходит валидацию схемы, вступает в силу наряду с кодом. Блокировка Exit 2 — это единственный результат, который JSON не может переопределить.
843
844Две таблицы владеют исключениями для каждого события: [Exit code 2 behavior per event](#exit-code-2-behavior-per-event) говорит, что коды выхода делают для каждого события, и [Decision control](#decision-control) говорит, какие поля решения каждое событие учитывает. Универсальные поля, такие как `systemMessage`, работают на большинстве событий и перечислены в таблице [JSON output](#json-output).
845
846<h4 id="exit-code-0">
847 Exit code 0
848</h4>
849
850Exit 0 означает успех и является предполагаемым кодом выхода, когда вы печатаете JSON для структурированного управления.
851
852Для большинства событий Claude Code записывает stdout в журнал отладки и не показывает его в транскрипте. Исключения — это `UserPromptSubmit`, `UserPromptExpansion`, `SessionStart` и `PostModelSwitch`, где Claude Code добавляет простой текст stdout как контекст, который Claude может видеть и действовать.
689 853
690**Exit 0** означает успех. Claude Code анализирует stdout для [JSON полей выхода](#json-output). JSON выход обрабатывается только при exit 0. Для большинства событий stdout записывается в журнал отладки, но не показывается в транскрипте. Исключения — `UserPromptSubmit`, `UserPromptExpansion` и `SessionStart`, где stdout добавляется как контекст, который Claude может видеть и действовать.854Читает ли Claude Code ваш stdout как [JSON output](#json-output) или как простой текст, зависит от того, как он начинается и заканчивается, игнорируя окружающие пробелы:
691 855
692**Exit 2** означает блокирующую ошибку. Claude Code игнорирует stdout и любой JSON в нём. Вместо этого текст stderr передаётся обратно Claude как сообщение об ошибке. Эффект зависит от события: `PreToolUse` блокирует вызов инструмента, `UserPromptSubmit` отклоняет подсказку и так далее. См. [exit code 2 behavior](#exit-code-2-behavior-per-event) для полного списка.856* **Начинается с `{` и заканчивается на `}`**: Claude Code анализирует его как JSON. Когда выход состоит из двух или более строк, которые каждая анализируются как JSON самостоятельно, и ни одна строка не является объектом [JSON output](#json-output), который устанавливает поле, Claude Code рассматривает весь выход как простой текст. Когда одна из этих строк устанавливает поле, весь выход является ошибкой анализа, описанной ниже.
857* **Начинается с `{` но не заканчивается на `}`**: Claude Code рассматривает это как простой текст.
858* **Начинается с чего-либо еще**: Claude Code рассматривает это как простой текст, JSON массив или включенную строку JSON в кавычках.
693 859
694**Любой другой код выхода** — это неблокирующая ошибка для большинства событий hook. Транскрипт показывает уведомление об ошибке `<hook name> hook error`, за которым следует первая строка stderr, поэтому вы можете определить причину без `--debug`. Выполнение продолжается и полный stderr записывается в журнал отладки.860Для событий, которые используют стандартную модель решения, exit 0 с проанализированным объектом, который не проходит валидацию схемы, является неблокирующей ошибкой: действие продолжается, и транскрипт показывает уведомление об ошибке `<hook name> hook error` с сообщением валидации. То же самое происходит при любом коде выхода, отличном от 2, в то время как [exit 2 все еще блокирует](#exit-code-2).
695 861
696Например, скрипт команды hook, который блокирует опасные команды Bash:862Для событий, которые используют стандартную модель решения, когда Claude Code пытается анализировать ваш stdout как JSON и не может, он сообщает о неблокирующей ошибке при каждом коде выхода, отличном от 2. Транскрипт показывает уведомление об ошибке `<hook name> hook error` с сообщением анализа. На событиях, которые добавляют простой текст stdout как контекст, Claude Code не добавляет текст. До v2.1.248 Claude Code рассматривал этот stdout как простой текст.
863
864Stderr из hook, который выходит с 0, идет только в журнал отладки, никогда в транскрипт, и Claude его не видит. Чтобы прочитать его самостоятельно, включите [debug logging](#debug-hooks). Чтобы вывести предупреждение Claude из hook `PostToolUse` или `PostToolUseFailure`, выйдите с 2 вместо этого, чтобы [Claude видел stderr](#exit-code-2-behavior-per-event), даже если инструмент уже запустился.
865
866<h4 id="exit-code-2">
867 Exit code 2
868</h4>
869
870Exit 2 означает блокирующую ошибку. На [событиях, которые могут блокировать](#exit-code-2-behavior-per-event), exit 2 блокирует независимо от того, печатаете ли вы JSON: даже JSON `permissionDecision` из `"allow"` не может его переопределить. Claude Code все еще читает любой действительный [JSON output](#json-output) на stdout. На `Elicitation` и `ElicitationResult`, `hookSpecificOutput` hook с exit-2 игнорируется.
871
872Сообщение блокировки — это причина из решения блокировки вашего JSON, когда оно его делает, и ваш текст stderr в противном случае. Что делает блокировка, варьируется в зависимости от события: `PreToolUse` блокирует вызов инструмента, `UserPromptSubmit` отклоняет запрос и так далее. [Exit code 2 behavior per event](#exit-code-2-behavior-per-event) перечисляет эффект для каждого события, и каждый раздел события говорит, куда идет сообщение.
873
874Hook, который выходит с 2 при печати JSON, который не проходит валидацию схемы [JSON output](#json-output), все еще блокирует: Claude Code использует stderr как причину блокировки и записывает ошибку валидации в журнал отладки. До v2.1.214 Claude Code рассматривал эту комбинацию как неблокирующую ошибку и действие продолжалось.
875
876Этот скрипт блокирует команды `rm`, выходя с 2 и оставляет каждую другую команду нормальному потоку разрешений:
697 877
698```bash theme={null}878```bash theme={null}
699#!/bin/bash879#!/bin/bash
700# Читает JSON входные данные из stdin, проверяет команду880# Reads JSON input from stdin, checks the command
701command=$(jq -r '.tool_input.command' < /dev/stdin)881input=$(cat)
882command=$(jq -r '.tool_input.command' <<<"$input")
702 883
703if [[ "$command" == rm* ]]; then884if [[ "$command" == rm* ]]; then
704 echo "Blocked: rm commands are not allowed" >&2885 echo "Blocked: rm commands are not allowed" >&2
708exit 0 # No decision: the normal permission flow applies889exit 0 # No decision: the normal permission flow applies
709```890```
710 891
892<h4 id="other-exit-codes">
893 Другие коды выхода
894</h4>
895
896Любой другой код выхода не блокирует сам по себе для большинства hook событий. Что происходит, зависит от вашего stdout:
897
898* С проанализированным объектом, который проходит валидацию схемы, для событий, которые используют стандартную модель решения, Claude Code игнорирует код выхода и только JSON решает результат:
899 * Каждое поле, которое событие поддерживает, учитывается, включая `permissionDecision`, `additionalContext`, `updatedInput` и `systemMessage`, и hook не сообщается как ошибка.
900 * [Decision control](#decision-control) перечисляет поля решения для каждого события; универсальные поля, такие как `systemMessage`, следуют таблице [JSON output](#json-output).
901* С проанализированным объектом, который не проходит валидацию схемы, для событий, которые используют стандартную модель решения, это то же самое неблокирующее ошибка, что и [на exit 0](#exit-code-0): действие продолжается, и уведомление `<hook name> hook error` содержит сообщение валидации.
902* С stdout, который Claude Code [пытается анализировать как JSON](#exit-code-0) и не может, Claude Code сообщает о той же неблокирующей ошибке, что и на exit 0 для событий, которые используют стандартную модель решения. Действие продолжается, и уведомление содержит сообщение анализа.
903* С stdout, который Claude Code [рассматривает как простой текст](#exit-code-0), или с пустым stdout, это неблокирующая ошибка для большинства hook событий: действие продолжается, и транскрипт показывает уведомление об ошибке `<hook name> hook error`, за которым следует первая строка stderr, с префиксом `Failed with non-blocking status code:`. Чтобы захватить полный stderr, включите [debug logging](#debug-hooks).
904
905События вне стандартной модели решения сохраняют свои собственные строки в [таблице для каждого события](#exit-code-2-behavior-per-event): `WorktreeCreate` не создает при любом ненулевом выходе, независимо от того, что говорит ваш JSON, и события, которые полностью игнорируют выход hook, такие как `StopFailure`, игнорируют ваш JSON при каждом коде выхода, кроме полей побочных эффектов, таких как `terminalSequence`, которые все еще срабатывают.
906
907Hook, который не может запуститься, попадает в ту же неблокирующую корзину. Когда путь скрипта не существует или не исполняемый, оболочка выходит с кодом, например 127, и вы видите то же уведомление с сообщением интерпретатора, например `Failed with non-blocking status code: /bin/sh: /path/to/hook.sh: No such file or directory`. Для большинства hook событий действие продолжается. Когда вы устанавливаете hook политики, следите за этим уведомлением при его первом запуске: неправильно введенный путь в `settings.json` оставляет ворота молча отключенными.
908
711<Warning>909<Warning>
712 Для большинства событий hook только exit code 2 блокирует действие. Claude Code рассматривает exit code 1 как неблокирующую ошибку и продолжает действие, даже хотя 1 — это обычный код отказа Unix. Если ваш hook предназначен для обеспечения политики, используйте `exit 2`. Исключение — `WorktreeCreate`, где любой ненулевой код выхода прерывает создание worktree.910 Для большинства hook событий exit code 2 — это единственный код выхода, который блокирует только через код. Без действительного JSON на stdout Claude Code рассматривает exit code 1 как неблокирующую ошибку и продолжает действие, даже хотя 1 — это обычный код отказа Unix. Если ваш hook предназначен для обеспечения политики, используйте `exit 2`. События worktree отличаются: любой ненулевой код выхода из `WorktreeCreate` прерывает создание worktree, и любой ненулевой код выхода из `WorktreeRemove` делает удаление worktree неудачным, если каталог все еще существует после этого.
713</Warning>911</Warning>
714 912
913<h4 id="timeouts">
914 Timeouts
915</h4>
916
917Кроме hook команды, который вы запускаете с [`async: true`](#run-hooks-in-the-background), Claude Code отменяет hook `command`, `http` или `mcp_tool`, который достигает своего [`timeout`](#common-fields), отбрасывая выход hook, поэтому на большинстве событий истекший по времени hook не отображает решение.
918
919На [`PreModelSwitch`](#premodelswitch), hook, отмененный при его timeout, блокирует переключение модели. На `PreToolUse` две семьи hook отличаются:
920
921* Истекший по времени hook `command`, `http` или `mcp_tool` не блокирует вызов инструмента. Вызов продолжается через нормальный [поток разрешений](/docs/ru/permissions), поэтому не рассчитывайте на зависший hook, чтобы действовать как ворота.
922* [Agent SDK callback hook](/docs/ru/agent-sdk/hooks), который превышает свой timeout, [блокирует вызов инструмента](#pretooluse).
923
715<h4 id="exit-code-2-behavior-per-event">924<h4 id="exit-code-2-behavior-per-event">
716 Поведение exit code 2 для каждого события925 Exit code 2 behavior per event
717</h4>926</h4>
718 927
719Exit code 2 — это способ hook сигнализировать "стоп, не делай этого". Эффект зависит от события, потому что некоторые события представляют действия, которые могут быть заблокированы (например, вызов инструмента, который ещё не произошёл), а другие представляют вещи, которые уже произошли или не могут быть предотвращены.928Exit code 2 — это способ, которым hook сигнализирует "стоп, не делай этого". Эффект зависит от события, потому что некоторые события представляют действия, которые могут быть заблокированы (например, вызов инструмента, который еще не произошел), а другие представляют вещи, которые уже произошли или не могут быть предотвращены.
720 929
721| Hook событие | Может блокировать? | Что происходит при exit 2 |930| Hook event | Может блокировать? | Что происходит на exit 2 |
722| :-------------------- | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |931| :-------------------- | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
723| `PreToolUse` | Да | Блокирует вызов инструмента |932| `PreToolUse` | Да | Блокирует вызов инструмента |
724| `PermissionRequest` | Да | Отклоняет разрешение |933| `PermissionRequest` | Нет | Exit code 2 не учитывается для этого события и поток разрешений продолжается без изменений. Отклоните через объект [`decision`](#permissionrequest-decision-control) вместо этого |
725| `UserPromptSubmit` | Да | Блокирует обработку подсказки и стирает подсказку |934| `UserPromptSubmit` | Да | Блокирует обработку запроса и стирает запрос |
726| `UserPromptExpansion` | Да | Блокирует расширение |935| `UserPromptExpansion` | Да | Блокирует расширение |
727| `Stop` | Да | Предотвращает остановку Claude, продолжает разговор |936| `Stop` | Да | Предотвращает остановку Claude, продолжает разговор |
728| `SubagentStop` | Да | Предотвращает остановку subagent |937| `SubagentStop` | Да | Предотвращает остановку subagent |
729| `TeammateIdle` | Да | Предотвращает переход товарища в режим ожидания, так что он продолжает работать |938| `TeammateIdle` | Да | Предотвращает переход товарища в режим ожидания, поэтому он продолжает работать |
730| `TaskCreated` | Да | Откатывает создание задачи |939| `TaskCreated` | Да | Откатывает создание задачи |
731| `TaskCompleted` | Да | Предотвращает отметку задачи как завершённой |940| `TaskCompleted` | Да | Предотвращает отметку задачи как завершенной |
732| `ConfigChange` | Да | Блокирует применение изменения конфигурации (кроме `policy_settings`) |941| `ConfigChange` | Да | Блокирует вступление изменения конфигурации в силу (кроме `policy_settings`) |
733| `StopFailure` | Нет | Выход и код выхода игнорируются |942| `StopFailure` | Нет | Выход и код выхода игнорируются, кроме `terminalSequence` |
734| `PostToolUse` | Нет | Показывает stderr Claude; инструмент уже запустился |943| `PostToolUse` | Нет | Показывает stderr Claude; инструмент уже запустился |
735| `PostToolUseFailure` | Нет | Показывает stderr Claude; инструмент уже не удался |944| `PostToolUseFailure` | Нет | Показывает stderr Claude; инструмент уже не удался |
736| `PostToolBatch` | Да | Останавливает цикл агента перед следующим вызовом модели |945| `PostToolBatch` | Да | Останавливает агентный цикл перед следующим вызовом модели |
737| `PermissionDenied` | Нет | Код выхода и stderr игнорируются, потому что отказ уже произошёл. Используйте JSON `hookSpecificOutput.retry: true` для сообщения модели, что она может повторить попытку |946| `PermissionDenied` | Нет | Выход и stderr игнорируются, потому что отказ уже произошел. Используйте JSON `hookSpecificOutput.retry: true`, чтобы сказать модели, что она может повторить попытку; Claude Code игнорирует `retry: true` для [отказов без вердикта](#permissiondenied-decision-control) |
738| `Notification` | Нет | Показывает stderr только пользователю |947| `Notification` | Нет | Выход и stderr игнорируются |
739| `SubagentStart` | Нет | Показывает stderr только пользователю |948| `SubagentStart` | Нет | Показывает stderr только пользователю |
740| `SessionStart` | Нет | Показывает stderr только пользователю |949| `SessionStart` | Нет | Показывает stderr только пользователю |
741| `Setup` | Нет | Показывает stderr только пользователю |950| `Setup` | Нет | Выход и stderr игнорируются |
742| `SessionEnd` | Нет | Показывает stderr только пользователю |951| `SessionEnd` | Нет | Показывает stderr только пользователю |
743| `CwdChanged` | Нет | Показывает stderr только пользователю |952| `CwdChanged` | Нет | Показывает stderr только пользователю |
953| `DirectoryAdded` | Нет | Stderr идет в журнал отладки; каталог уже добавлен |
744| `FileChanged` | Нет | Показывает stderr только пользователю |954| `FileChanged` | Нет | Показывает stderr только пользователю |
745| `PreCompact` | Да | Блокирует компактирование |955| `PreCompact` | Да | Блокирует компактирование |
746| `PostCompact` | Нет | Показывает stderr только пользователю |956| `PostCompact` | Нет | Показывает stderr только пользователю |
747| `Elicitation` | Да | Отклоняет elicitation |957| `PreModelSwitch` | Да | Блокирует переключение модели и показывает stderr пользователю |
748| `ElicitationResult` | Да | Блокирует ответ (действие становится decline) |958| `PostModelSwitch` | Нет | Показывает stderr только пользователю; модель уже переключилась |
749| `WorktreeCreate` | Да | Любой ненулевой код выхода вызывает сбой создания worktree |959| `Elicitation` | Да | Отклоняет запрос информации |
750| `WorktreeRemove` | Нет | Сбои логируются только в режиме отладки |960| `ElicitationResult` | Да | Блокирует ответ (действие становится отклонением) |
961| `WorktreeCreate` | Да | Любой ненулевой код выхода вызывает ошибку создания worktree |
962| `WorktreeRemove` | Да | Любой ненулевой код выхода вызывает ошибку удаления worktree, если каталог все еще существует после этого. См. [WorktreeRemove](#worktreeremove) для того, что происходит с каталогом |
751| `InstructionsLoaded` | Нет | Код выхода игнорируется |963| `InstructionsLoaded` | Нет | Код выхода игнорируется |
752| `MessageDisplay` | Нет | Исходный текст отображается |964| `MessageDisplay` | Нет | Отображается исходный текст |
753
754Для `SessionStart`, `Setup` и `SubagentStart` stderr exit code 2 отображается в транскрипте как уведомление об ошибке `<hook name> hook error`, так же как [неблокирующая ошибка](#exit-code-output). Claude не видит это, и сеанс или subagent продолжается. Для `SubagentStart` уведомление появляется в собственном транскрипте subagent, а не в родительском разговоре.
755 965
756Начиная с Claude Code v2.1.199, `SessionStart`, `Setup` и `SubagentStart` показывают stderr exit code 2 в транскрипте. Более ранние версии записывали это только в журнал отладки.966Для `SessionStart`, `SubagentStart` и `PostModelSwitch`, Claude Code отображает stderr exit code 2 в транскрипте как уведомление об ошибке `<hook name> hook error`, так же как оно отображает [неблокирующую ошибку](#exit-code-output). Claude его не видит, и сеанс или subagent продолжается. Для `SubagentStart` уведомление появляется в собственном транскрипте subagent, а не в родительском разговоре.
757 967
758<h3 id="http-response-handling">968<h3 id="http-response-handling">
759 Обработка HTTP ответа969 HTTP response handling
760</h3>970</h3>
761 971
762HTTP hooks используют коды статуса HTTP и тела ответов вместо кодов выхода и stdout:972HTTP hooks используют коды состояния HTTP и тела ответов вместо кодов выхода и stdout. Результаты ниже применяются к большинству событий; событие с его собственным контрактом отказа в [таблице для каждого события](#exit-code-2-behavior-per-event), такое как `WorktreeCreate`, применяет этот контракт к неудачному HTTP hook также:
763 973
764* **2xx с пустым телом**: успех, эквивалентно exit code 0 без выхода974* **2xx с пустым телом**: успех, эквивалентно exit code 0 без выхода
765* **2xx с телом простого текста**: успех, текст добавляется как контекст975* **2xx с телом объекта JSON**: анализируется с использованием той же схемы [JSON output](#json-output), что и hooks команд. Тело, которое не проходит валидацию схемы, является неблокирующей ошибкой
766* **2xx с JSON телом**: успех, анализируется с использованием той же [JSON выхода](#json-output) схемы, что и command hooks976* **2xx с любым другим телом, таким как простой текст**: неблокирующая ошибка, обрабатывается так же, как статус non-2xx. Claude Code не добавляет текст в контекст Claude
767* **Статус не 2xx**: неблокирующая ошибка, выполнение продолжается977* **Статус non-2xx**: неблокирующая ошибка, выполнение продолжается
768* **Сбой соединения или таймаут**: неблокирующая ошибка, выполнение продолжается978* **Ошибка соединения**: неблокирующая ошибка, выполнение продолжается
979* **Timeout**: hook отменяется, как описано в разделе [Timeouts](#timeouts)
769 980
770В отличие от command hooks, HTTP hooks не могут сигнализировать блокирующую ошибку только через коды статуса. Чтобы заблокировать вызов инструмента или отклонить разрешение, верните ответ 2xx с JSON телом, содержащим соответствующие поля решения.981В отличие от hooks команд, HTTP hooks не могут сигнализировать блокирующую ошибку только через коды состояния. Чтобы заблокировать вызов инструмента или отклонить разрешение, верните ответ 2xx с телом JSON, содержащим соответствующие поля решения.
771 982
772<h3 id="json-output">983<h3 id="json-output">
773 JSON выход984 JSON output
774</h3>985</h3>
775 986
776Коды выхода позволяют вам разрешить или заблокировать, но JSON выход даёт вам более точное управление. Вместо выхода с кодом 2 для блокировки, выйдите с 0 и выведите JSON объект на stdout. Claude Code читает специфические поля из этого JSON для управления поведением, включая [decision control](#decision-control) для блокировки, разрешения или эскалации пользователю.987Коды выхода позволяют вам только блокировать или молчать, но JSON output дает вам более точное управление. Вместо выхода с кодом 2 для блокировки, выйдите с 0 и напечатайте объект JSON на stdout. Claude Code читает конкретные поля из этого JSON для управления поведением, включая [decision control](#decision-control) для блокировки, разрешения или эскалации пользователю.
777 988
778<Note>989<Note>
779 Вы должны выбрать один подход на hook, не оба: либо используйте коды выхода отдельно для сигнализации, либо выйдите с 0 и выведите JSON для структурированного управления. Claude Code обрабатывает JSON только при exit 0. Если вы выйдете с 2, любой JSON игнорируется.990 Выберите один подход для каждого hook: либо используйте коды выхода только для сигнализации, либо выйдите с 0 и напечатайте JSON для структурированного управления. Если вы их смешиваете, exit 2 сохраняет свой [блокирующий эффект](#exit-code-2-behavior-per-event), и Claude Code все еще читает поля JSON, с единственным исключением elicitation, отмеченным в разделе [Exit code 2](#exit-code-2).
780</Note>991</Note>
781 992
782Stdout вашего hook должен содержать только JSON объект. Если ваш профиль оболочки выводит текст при запуске, это может помешать анализу JSON. См. [JSON validation failed](/docs/ru/hooks-guide#json-validation-failed) в руководстве по устранению неполадок.993Stdout вашего hook должен содержать только объект JSON. Если ваш профиль оболочки печатает текст при запуске, это может помешать анализу JSON. См. [Hook JSON has no effect](/docs/ru/hooks-guide#hook-json-has-no-effect) в руководстве по устранению неполадок.
783 994
784Выходные строки hook, включая `additionalContext`, `systemMessage` и простой stdout, ограничены 10 000 символами. Выход, превышающий этот лимит, сохраняется в файл и заменяется предпросмотром и путём к файлу, так же как обрабатываются большие результаты инструментов.995Строки `additionalContext`, `systemMessage` и `initialUserMessage` hook, а также его простой stdout, ограничены 10 000 символов:
785 996
786JSON объект поддерживает три вида полей:997* **Область**: Claude Code измеряет каждую строку отдельно, даже когда несколько hooks запускаются для одного события. Для JSON output каждое поле измеряется отдельно; простой stdout измеряется целиком.
998* **Превышение лимита**: Claude Code сохраняет выход в файл в каталоге сеанса и заменяет его путем к файлу и предпросмотром до первых 2000 символов. Большой действительный результат Bash обрабатывается так же, как описано в разделе [Output limits](/docs/ru/tools-reference#output-limits). В отличие от этого потолка Bash, эта крышка не имеет параметра или переменной окружения для ее повышения.
999* **Чтение файла**: Claude Code не просит Claude прочитать файл, поэтому держите все, что Claude должен всегда видеть, в пределах крышки.
787 1000
788* **Универсальные поля** как `continue` работают во всех событиях. Они перечислены в таблице ниже.1001Объект JSON поддерживает три вида полей:
789* **Верхнеуровневые `decision` и `reason`** используются некоторыми событиями для блокировки или предоставления обратной связи.1002
1003* **Универсальные поля**, такие как `continue`, перечислены в таблице ниже. Каждое событие их принимает, но некоторые события игнорируют их или доставляют `systemMessage` в другое место, чем транскрипт. Каждый раздел события говорит об этом. `terminalSequence` работает на этих событиях также, с исключениями, перечисленными в разделе [Emit terminal notifications](#emit-terminal-notifications).
1004* **Top-level `decision` и `reason`** используются некоторыми событиями для блокировки или предоставления обратной связи.
790* **`hookSpecificOutput`** — это вложенный объект для событий, которым нужно более богатое управление. Он требует поле `hookEventName`, установленное на имя события.1005* **`hookSpecificOutput`** — это вложенный объект для событий, которым нужно более богатое управление. Он требует поле `hookEventName`, установленное на имя события.
791 1006
792| Поле | По умолчанию | Описание |1007| Поле | По умолчанию | Описание |
793| :----------------- | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1008| :----------------- | :----------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
794| `continue` | `true` | Если `false`, Claude полностью прекращает обработку после запуска hook. Имеет приоритет над любыми полями решения, специфичными для события |1009| `continue` | `true` | Если `false`, Claude полностью прекращает обработку после запуска hook. Имеет приоритет над любыми полями решения, специфичными для события |
795| `stopReason` | нет | Сообщение, показываемое пользователю при `continue` равном `false`. Не показывается Claude |1010| `stopReason` | нет | Сообщение, показанное пользователю, когда `continue` равно `false`. Оно остается в разговоре, поэтому Claude видит его, если разговор продолжается |
796| `suppressOutput` | `false` | Если `true`, скрывает stdout hook из транскрипта. Stdout всё ещё появляется в журнале отладки |1011| `suppressOutput` | `false` | Не имеет эффекта: Claude Code принимает поле, но не действует на него. Stdout успешного hook никогда не показывается в транскрипте и записывается в журнал отладки |
797| `systemMessage` | нет | Предупреждающее сообщение, показываемое пользователю |1012| `systemMessage` | нет | Предупреждающее сообщение, показанное пользователю. В выводе [Agent SDK](/docs/ru/agent-sdk/overview) и [`--output-format stream-json`](/docs/ru/headless), оно может поступить как [`SDKInformationalMessage`](/docs/ru/agent-sdk/typescript#sdkinformationalmessage) |
798| `terminalSequence` | нет | Escape последовательность терминала для Claude Code, которую нужно выдать от вашего имени, такая как уведомление рабочего стола, заголовок окна или звуковой сигнал. Ограничено OSC `0`/`1`/`2`/`9`/`99`/`777` и BEL. Если значение содержит что-либо вне списка разрешённых, поле игнорируется. Используйте это вместо записи в `/dev/tty`, которая недоступна для hooks |1013| `terminalSequence` | нет | Последовательность escape терминала для Claude Code для выпуска от вашего имени, такая как уведомление рабочего стола, заголовок окна или звонок. Ограничено OSC `0`/`1`/`2`/`9`/`99`/`777` и BEL. Если значение содержит что-либо вне списка разрешений, поле игнорируется. Используйте это вместо записи в `/dev/tty`, которая недоступна для hooks |
799 1014
800Чтобы полностью остановить Claude независимо от типа события:1015Чтобы полностью остановить Claude:
801 1016
802```json theme={null}1017```json theme={null}
803{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }1018{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }
804```1019```
805 1020
1021Для hooks `PreToolUse` и `PostToolUse` остановка применяется даже когда вызов инструмента не удается или завершается, пока Claude все еще потоком ответ.
1022
806<h4 id="emit-terminal-notifications">1023<h4 id="emit-terminal-notifications">
807 Выдача уведомлений терминала1024 Emit terminal notifications
808</h4>1025</h4>
809 1026
810Поле `terminalSequence` требует Claude Code v2.1.141 или позже.1027Hooks запускаются без управляющего терминала, поэтому запись последовательностей escape непосредственно в `/dev/tty` не удается. Вместо этого верните последовательность escape в поле `terminalSequence` и Claude Code выпустит ее от вашего имени через свой собственный путь записи терминала. Это свободно от гонок, работает внутри tmux и GNU screen, и работает на Windows, где нет `/dev/tty`.
811 1028
812Hooks запускаются без управляющего терминала, поэтому запись escape последовательностей непосредственно в `/dev/tty` не удаётся. Вместо этого верните escape последовательность в поле `terminalSequence` и Claude Code выдаст её от вашего имени через собственный путь записи терминала. Это свободно от гонок, работает внутри tmux и GNU screen, и работает на Windows, где нет `/dev/tty`.1029Поле принимает строку из одной или нескольких последовательностей escape в списке разрешений:
813
814Поле принимает строку из одной или нескольких разрешённых escape последовательностей:
815 1030
816* OSC `0`, `1`, `2`: заголовки окна и значков1031* OSC `0`, `1`, `2`: заголовки окна и значков
817* OSC `9`: уведомления iTerm2, ConEmu, Windows Terminal и WezTerm, включая `9;4` прогресс панели задач1032* OSC `9`: уведомления iTerm2, ConEmu, Windows Terminal и WezTerm, включая прогресс панели задач `9;4`
818* OSC `99`: уведомления Kitty1033* OSC `99`: уведомления Kitty
819* OSC `777`: уведомления urxvt, Ghostty и Warp1034* OSC `777`: уведомления urxvt, Ghostty и Warp
820* Bare BEL1035* Bare BEL
821 1036
822Последовательности могут быть завершены BEL или ST. Что-либо вне списка разрешённых, включая CSI курсор и цветовые последовательности, OSC палитру последовательности, OSC 8 гиперссылки, OSC 52 записи буфера обмена и OSC 1337, отклоняется и поле игнорируется.1037Последовательности могут быть завершены BEL или ST. Все, что находится вне списка разрешений, включая последовательности курсора CSI и цвета, последовательности палитры OSC, гиперссылки OSC 8, записи буфера обмена OSC 52 и OSC 1337, отклоняется и поле игнорируется.
1038
1039Claude Code выпускает саму последовательность, когда обрабатывает выход вашего hook, поэтому поле работает на событиях, которые игнорируют `systemMessage` и `continue`, такие как `Notification` и `StopFailure`. Оно имеет два ограничения:
823 1040
824Пример ниже срабатывает уведомление рабочего стола из hook `Notification`. Escape последовательность строится с `printf` восьмеричными экранами, поэтому управляющие байты никогда не появляются в командной строке оболочки, и `jq -n --arg` строит JSON выход, поэтому кавычки, обратные слэши и новые строки в сообщении уведомления правильно экранируются:1041* Claude Code выпускает последовательность только в интерактивном сеансе и только пока его интерфейс находится на экране. В неинтерактивном режиме с флагом `-p` и в Agent SDK он игнорирует поле.
1042* Hook команды `WorktreeCreate` не может вернуть JSON, потому что Claude Code читает его stdout как путь worktree. HTTP hook `WorktreeCreate` возвращает JSON и может включать поле.
1043
1044Пример ниже срабатывает уведомление рабочего стола из hook `Notification`. Последовательность escape строится с помощью `printf` восьмеричных escape, поэтому управляющие байты никогда не появляются в командной строке оболочки, и `jq -n --arg` строит выход JSON, поэтому кавычки, обратные слэши и новые строки в сообщении уведомления правильно экранируются:
825 1045
826```bash theme={null}1046```bash theme={null}
827#!/bin/bash1047#!/bin/bash
828# Notification hook: ping the desktop when Claude Code needs attention.1048# Notification hook: ping the desktop when Claude Code needs attention.
829input=$(cat)1049input=$(cat)
830title="Claude Code'1050title="Claude Code"
831body=$(jq -r '.message // 'Needs your attention"' <<<"$input")1051body=$(jq -r '.message // "Needs your attention"' <<<"$input")
832seq=$(printf '\033]777;notify;%s;%s\007' "$title" "$body")1052seq=$(printf '\033]777;notify;%s;%s\007' "$title" "$body")
833jq -nc --arg seq "$seq" '{terminalSequence: $seq}'1053jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
834```1054```
835 1055
836Форма `{ "terminalSequence": "..." }` одинакова из любой оболочки или языка. На Windows постройте escape строку в PowerShell или скрипте и выдайте тот же JSON объект.1056Форма `{ "terminalSequence": "..." }` одинакова из любой оболочки или языка.
837
838<Note>
839 `terminalSequence` — это поддерживаемая замена для hooks, которые ранее писали escape последовательности непосредственно в `/dev/tty`. Список разрешённых ограничен последовательностями, которые не могут перемещать курсор или изменять цвета, поэтому hook никогда не может повредить подсказку на экране.
840</Note>
841 1057
842<h4 id="add-context-for-claude">1058<h4 id="add-context-for-claude">
843 Добавить контекст для Claude1059 Add context for Claude
844</h4>1060</h4>
845 1061
846Поле `additionalContext` передаёт строку из вашего hook в контекстное окно Claude. Claude Code оборачивает строку в системное напоминание и вставляет её в разговор в точке, где сработал hook. Claude читает напоминание при следующем запросе модели, но оно не появляется как сообщение чата в интерфейсе.1062Поле `additionalContext` передает строку из вашего hook в контекстное окно Claude. Claude Code оборачивает строку в напоминание системы и вставляет ее в разговор в точке, где сработал hook. Claude читает напоминание при следующем запросе модели, но оно не появляется как сообщение чата в интерфейсе.
847 1063
848Верните `additionalContext` внутри `hookSpecificOutput` рядом с именем события:1064Верните `additionalContext` внутри `hookSpecificOutput` рядом с именем события:
849 1065
858 1074
859Где появляется напоминание, зависит от события:1075Где появляется напоминание, зависит от события:
860 1076
861* [SessionStart](#sessionstart), [Setup](#setup) и [SubagentStart](#subagentstart): в начале разговора, перед первой подсказкой1077* [SessionStart](#sessionstart) и [SubagentStart](#subagentstart): в начале разговора, перед первым запросом
862* [UserPromptSubmit](#userpromptsubmit) и [UserPromptExpansion](#userpromptexpansion): рядом с отправленной подсказкой1078* [UserPromptSubmit](#userpromptsubmit) и [UserPromptExpansion](#userpromptexpansion): рядом с отправленным запросом
863* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) и [PostToolBatch](#posttoolbatch): рядом с результатом инструмента1079* [PreToolUse](#pretooluse), [PostToolUse](#posttooluse), [PostToolUseFailure](#posttoolusefailure) и [PostToolBatch](#posttoolbatch): рядом с результатом инструмента
864* [Stop](#stop) и [SubagentStop](#subagentstop): в конце хода. Разговор продолжается, поэтому Claude может действовать на основе обратной связи. См. [Stop decision control](#stop-decision-control)1080* [Stop](#stop) и [SubagentStop](#subagentstop): в конце хода. Разговор продолжается, поэтому Claude может действовать на обратную связь. См. [Stop decision control](#stop-decision-control)
1081* [PostModelSwitch](#postmodelswitch): со следующим запросом после переключения. См. [PostModelSwitch decision control](#postmodelswitch-decision-control) для синхронизации
865 1082
866Когда несколько hooks возвращают `additionalContext` для одного события, Claude получает все значения. Если значение превышает 10 000 символов, Claude Code записывает полный текст в файл в каталоге сеанса и передаёт Claude путь к файлу с кратким предпросмотром вместо этого.1083Когда несколько hooks возвращают `additionalContext` для одного события, Claude получает все значения.
1084
1085Если значение превышает 10 000 символов, Claude Code записывает текст в файл в каталоге сеанса и передает Claude путь к файлу с предпросмотром до первых 2000 символов вместо этого. Claude может прочитать файл, но Claude Code не просит его.
867 1086
868Используйте `additionalContext` для информации, которую Claude должен знать о текущем состоянии вашей среды или операции, которая только что запустилась:1087Используйте `additionalContext` для информации, которую Claude должен знать о текущем состоянии вашей среды или операции, которая только что запустилась:
869 1088
870* **Состояние среды**: текущая ветка, цель развёртывания или активные флаги функций1089* **Состояние среды**: текущая ветвь, цель развертывания или активные флаги функций
871* **Условные правила проекта**: какая команда тестирования применяется к только что отредактированному файлу, какие каталоги доступны только для чтения в этом worktree1090* **Условные правила проекта**: какая команда теста применяется к только что отредактированному файлу, какие каталоги доступны только для чтения в этом worktree
872* **Внешние данные**: открытые проблемы, назначенные вам, недавние результаты CI, содержимое, полученное из внутреннего сервиса1091* **Внешние данные**: открытые проблемы, назначенные вам, недавние результаты CI, контент, полученный из внутреннего сервиса
873 1092
874Для инструкций, которые никогда не меняются, предпочитайте [CLAUDE.md](/docs/ru/memory). Он загружается без запуска скрипта и является стандартным местом для статических соглашений проекта.1093Для инструкций, которые никогда не изменяются, предпочитайте [CLAUDE.md](/docs/ru/memory). Он загружается без запуска скрипта и является стандартным местом для статических соглашений проекта.
875 1094
876Напишите текст как фактические утверждения, а не как императивные системные инструкции. Формулировки такие как "Цель развёртывания — production" или "Этот репозиторий использует `bun test`" читаются как информация о проекте. Текст, сформулированный как внеполосные системные команды, может активировать защиту Claude от внедрения подсказок, что заставляет Claude вывести текст вам вместо того, чтобы рассматривать его как контекст.1095Напишите текст как фактические утверждения, а не как императивные системные инструкции. Фразировка, такая как "Цель развертывания — production" или "Этот репо использует `bun test`", читается как информация о проекте. Текст, сформулированный как внеполосные системные команды, может вызвать защиту Claude от инъекций подсказок, что заставляет Claude вывести текст вам вместо того, чтобы рассматривать его как контекст.
877 1096
878После внедрения текст сохраняется в транскрипте сеанса. Для событий в середине сеанса, таких как `PostToolUse` или `UserPromptSubmit`, возобновление с `--continue` или `--resume` воспроизводит сохранённый текст вместо повторного запуска hook для прошлых ходов, поэтому значения, такие как временные метки или SHA коммитов, становятся устаревшими при возобновлении. Hooks `SessionStart` запускаются снова при возобновлении с `source` установленным на `"resume"`, поэтому они могут обновить свой контекст.1097Claude Code сохраняет введенный текст в транскрипте сеанса. Для событий середины сеанса, таких как `PostToolUse` или `UserPromptSubmit`, когда вы возобновляете с `--continue` или `--resume`, Claude Code воспроизводит сохраненный текст, а не повторно запускает hook для прошлых ходов, поэтому значения, такие как временные метки или SHA коммитов, становятся устаревшими. Hooks `SessionStart` запускаются снова при возобновлении с `source`, установленным на `"resume"`, или `"fork"`, если вы добавили `--fork-session`, поэтому они могут обновить свой контекст.
879 1098
880<h4 id="decision-control">1099<h4 id="decision-control">
881 Управление решением1100 Decision control
882</h4>1101</h4>
883 1102
884Не каждое событие поддерживает блокировку или управление поведением через JSON. События, которые это делают, каждое использует другой набор полей для выражения этого решения. Используйте эту таблицу как быструю ссылку перед написанием hook:1103Не каждое событие поддерживает блокировку или управление поведением через JSON. События, которые это делают, каждое использует другой набор полей для выражения этого решения. Используйте эту таблицу как быструю ссылку перед написанием hook:
885 1104
886| События | Шаблон решения | Ключевые поля |1105| События | Паттерн решения | Ключевые поля |
887| :---------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1106| :---------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
888| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Верхнеуровневое `decision` | `decision: "block"`, `reason`. Stop и SubagentStop также принимают `hookSpecificOutput.additionalContext` для [неошибочной обратной связи, которая продолжает разговор](#stop-decision-control) |1107| UserPromptSubmit, UserPromptExpansion, PostToolUse, PostToolUseFailure, PostToolBatch, Stop, SubagentStop, ConfigChange, PreCompact | Top-level `decision` | `decision: "block"`, `reason`. Stop и SubagentStop также принимают `hookSpecificOutput.additionalContext` для [неошибочной обратной связи, которая продолжает разговор](#stop-decision-control) |
889| TeammateIdle, TaskCreated, TaskCompleted | Exit code или `continue: false` | Exit code 2 блокирует действие с обратной связью stderr. JSON `{"continue": false, "stopReason": "..."}` также полностью останавливает товарища, соответствуя поведению hook `Stop` |1108| TeammateIdle, TaskCompleted | Exit code или `continue: false` | Exit code 2 блокирует действие с обратной связью stderr. JSON `{"continue": false, "stopReason": "..."}` также полностью останавливает товарища, совпадая с поведением hook `Stop`; [TaskCompleted игнорирует это, когда инструмент `TaskUpdate` вызвал событие](#taskcompleted-decision-control) |
1109| TaskCreated | Exit code или top-level `decision` | Exit code 2 или `decision: "block"` [отменяет задачу](#taskcreated-decision-control) и возвращает сообщение Claude. `continue: false` игнорируется |
890| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask/defer), `permissionDecisionReason` |1110| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask/defer), `permissionDecisionReason` |
1111| PreModelSwitch | `hookSpecificOutput` или top-level `decision` | `permissionDecision` (allow/deny/ask), `permissionDecisionReason`. `decision: "block"` также [отменяет переключение](#premodelswitch-decision-control) |
891| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |1112| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |
892| PermissionDenied | `hookSpecificOutput` | `retry: true` говорит модели, что она может повторить попытку отклонённого вызова инструмента |1113| PermissionDenied | `hookSpecificOutput` | `retry: true` сообщает модели, что она может повторить попытку отклоненного вызова инструмента; Claude Code игнорирует это для [отказов без вердикта](#permissiondenied-decision-control) |
893| WorktreeCreate | path return | Command hook выводит путь на stdout; HTTP hook возвращает `hookSpecificOutput.worktreePath`. Сбой hook или отсутствие пути вызывает сбой создания |1114| WorktreeCreate | path return | Hook команды печатает путь на stdout; HTTP hook возвращает `hookSpecificOutput.worktreePath`. Ошибка hook или отсутствующий путь не создает |
1115| WorktreeRemove | Exit code | Любой ненулевой код выхода делает удаление неудачным, если каталог все еще существует после этого. Выход JSON отбрасывается |
894| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (значения полей формы для accept) |1116| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (значения полей формы для accept) |
895| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (переопределение значений полей формы) |1117| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (значения полей формы переопределяют) |
896| MessageDisplay | `hookSpecificOutput` | `displayContent` заменяет отображаемый текст на экране. Только отображение: транскрипт и то, что видит Claude, сохраняют исходный |1118| MessageDisplay | `hookSpecificOutput` | `displayContent` заменяет отображаемый текст на экране. Только отображение: транскрипт и то, что видит Claude, сохраняют оригинал |
897| SessionStart, Setup, SubagentStart | Только контекст | `hookSpecificOutput.additionalContext` добавляет контекст для Claude. SessionStart также принимает [`initialUserMessage`, `watchPaths`, `sessionTitle` и `reloadSkills`](#sessionstart-decision-control). Нет блокировки или управления решением |1119| SessionStart, SubagentStart, PostModelSwitch | Только контекст | `hookSpecificOutput.additionalContext` добавляет контекст для Claude. SessionStart также принимает [`initialUserMessage`, `watchPaths`, `sessionTitle` и `reloadSkills`](#sessionstart-decision-control). Нет блокировки или управления решением |
898| WorktreeRemove, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, FileChanged | Нет | Нет управления решением. Используется для побочных эффектов, таких как логирование или очистка |1120| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Нет | Нет управления решением. Используется для побочных эффектов, таких как логирование или очистка |
899 1121
900Несколько событий также могут переписывать содержимое, а не только разрешать или блокировать его:1122Несколько событий также могут переписывать контент, а не только разрешать или блокировать его:
901 1123
902* `PreToolUse`: `updatedInput` непосредственно под `hookSpecificOutput` заменяет аргументы инструмента перед его запуском. См. [PreToolUse decision control](#pretooluse-decision-control)1124* `PreToolUse`: `updatedInput` непосредственно под `hookSpecificOutput` заменяет аргументы инструмента перед его запуском. См. [PreToolUse decision control](#pretooluse-decision-control)
903* `PermissionRequest`: `updatedInput` внутри объекта `decision`. См. [PermissionRequest decision control](#permissionrequest-decision-control)1125* `PermissionRequest`: `updatedInput` внутри объекта `decision`. См. [PermissionRequest decision control](#permissionrequest-decision-control)
904* `PostToolUse`: `updatedToolOutput` заменяет результат инструмента. См. [PostToolUse decision control](#posttooluse-decision-control)1126* `PostToolUse`: `updatedToolOutput` заменяет результат инструмента. См. [PostToolUse decision control](#posttooluse-decision-control)
905* `UserPromptSubmit`: не может заменить подсказку; только внедряет `additionalContext` рядом с ней1127* `UserPromptSubmit`: не может переписать запрос; он только вводит `additionalContext` рядом с ним
906 1128
907Для редактирования или трансформации используйте перехват на `PreToolUse` для исходящих входных данных инструмента и `PostToolUse` для входящих результатов инструмента.1129Для случаев использования редакции или трансформации перехватите на `PreToolUse` для исходящих входов инструмента и `PostToolUse` для входящих результатов инструмента.
908 1130
909Вот примеры каждого шаблона в действии:1131Вот примеры каждого паттерна в действии:
910 1132
911<Tabs>1133<Tabs>
912 <Tab title="Top-level decision">1134 <Tab title="Top-level decision">
913 Используется `UserPromptSubmit`, `UserPromptExpansion`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`, `Stop`, `SubagentStop`, `ConfigChange` и `PreCompact`. Единственное значение — `"block"`. Чтобы разрешить действию продолжаться, опустите `decision` из вашего JSON или выйдите с 0 без какого-либо JSON вообще:1135 Единственное значение для `decision` — это `"block"`. Чтобы разрешить действию продолжаться, опустите `decision` из вашего JSON или выйдите с 0 без какого-либо JSON вообще:
914 1136
915 ```json theme={null}1137 ```json theme={null}
916 {1138 {
921 </Tab>1143 </Tab>
922 1144
923 <Tab title="PreToolUse">1145 <Tab title="PreToolUse">
924 Использует `hookSpecificOutput` для более богатого управления: разрешить, отклонить или отложить. Вы также можете изменить входные данные инструмента перед его запуском или внедрить дополнительный контекст для Claude. См. [PreToolUse decision control](#pretooluse-decision-control) для полного набора параметров.1146 Использует `hookSpecificOutput` для более богатого управления: разрешить, отклонить или эскалировать пользователю. Вы также можете изменить входные данные инструмента перед его запуском или вводить дополнительный контекст для Claude. См. [PreToolUse decision control](#pretooluse-decision-control) для полного набора опций.
925 1147
926 ```json theme={null}1148 ```json theme={null}
927 {1149 {
935 </Tab>1157 </Tab>
936 1158
937 <Tab title="PermissionRequest">1159 <Tab title="PermissionRequest">
938 Использует `hookSpecificOutput` для разрешения или отклонения запроса разрешения от имени пользователя. При разрешении вы также можете изменить входные данные инструмента или применить правила разрешения, чтобы пользователю не было предложено снова. См. [PermissionRequest decision control](#permissionrequest-decision-control) для полного набора параметров.1160 Использует `hookSpecificOutput` для разрешения или отклонения запроса разрешения от имени пользователя. При разрешении вы также можете изменить входные данные инструмента или применить правила разрешений, чтобы пользователь не был запрошен снова. См. [PermissionRequest decision control](#permissionrequest-decision-control) для полного набора опций.
939 1161
940 ```json theme={null}1162 ```json theme={null}
941 {1163 {
953 </Tab>1175 </Tab>
954</Tabs>1176</Tabs>
955 1177
956Для расширенных примеров, включая валидацию команд Bash, фильтрацию подсказок и скрипты автоматического одобрения, см. [What you can automate](/docs/ru/hooks-guide#what-you-can-automate) в руководстве и [Bash command validator reference implementation](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).1178Для расширенных примеров, включая валидацию команд Bash, фильтрацию запросов и скрипты автоматического одобрения, см. [What you can automate](/docs/ru/hooks-guide#what-you-can-automate) в руководстве и [Bash command validator reference implementation](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).
957 1179
958<h2 id="hook-events">1180<h2 id="hook-events">
959 Hook events1181 События hooks
960</h2>1182</h2>
961 1183
962Каждое событие соответствует точке в жизненном цикле Claude Code, где могут запускаться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентный цикл к концу сеанса. Каждый раздел описывает, когда срабатывает событие, какие фильтры оно поддерживает, JSON входные данные, которые оно получает, и как управлять поведением через выход.1184Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл до завершения сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.
963 1185
964<h3 id="sessionstart">1186<h3 id="sessionstart">
965 SessionStart1187 SessionStart
966</h3>1188</h3>
967 1189
968Запускается при запуске Claude Code нового сеанса или возобновлении существующего сеанса. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или установки переменных окружения. Для статического контекста, который не требует скрипта, используйте [CLAUDE.md](/docs/ru/memory) вместо этого.1190Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте [CLAUDE.md](/docs/ru/memory) вместо этого.
969 1191
970SessionStart запускается при каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`.1192SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.
971 1193
972Значение фильтра соответствует тому, как был инициирован сеанс:1194Значение matcher соответствует тому, как был инициирован сеанс:
973 1195
974| Фильтр | Когда он срабатывает |1196| Matcher | Когда срабатывает |
975| :-------- | :---------------------------------------- |1197| :-------- | :------------------------------------------------------------------------------------------------------------------------------- |
976| `startup` | Новый сеанс |1198| `startup` | Новый сеанс |
977| `resume` | `--resume`, `--continue` или `/resume` |1199| `resume` | `--resume`, `--continue` или `/resume` |
978| `clear` | `/clear` |1200| `clear` | `/clear` |
979| `compact` | Автоматическое или ручное компактирование |1201| `compact` | Автоматическое или ручное сжатие |
1202| `fork` | Новый сеанс, разветвленный из существующего: `--fork-session` с `--resume` или `--continue`, фоновая копия `/fork` или `/branch` |
1203
1204До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.
1205
1206Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоне. Вы можете сразу же печатать, и возобновленный разговор появляется без ожидания завершения hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.
1207
1208Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.
1209
1210То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока SessionStart hooks все еще выполняются, не достигает Claude до их завершения.
1211
1212Во время ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.
980 1213
981<h4 id="sessionstart-input">1214<h4 id="sessionstart-input">
982 SessionStart input1215 SessionStart input
983</h4>1216</h4>
984 1217
985В дополнение к [общим полям входа](#common-input-fields), SessionStart hooks получают `source` и опционально `model`, `agent_type` и `session_title`:1218Помимо [common input fields](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:
986 1219
987| Поле | Описание |1220| Field | Description |
988| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1221| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
989| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновлённых сеансов, `"clear"` после `/clear` или `"compact"` после компактирования |1222| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |
990| `model` | Идентификатор активной модели. Может быть опущено, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте поле перед его чтением |1223| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |
991| `agent_type` | Имя агента, присутствует при запуске Claude Code с `claude --agent <name>` |1224| `agent_type` | Имя агента, присутствует при запуске Claude Code с `claude --agent <name>` |
992| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name` или `/rename`. Hook, который выдаёт `sessionTitle`, может сначала проверить `session_title`, чтобы избежать перезаписи названия, которое пользователь установил явно |1225| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name` или `/rename`. Hook, который выдает `sessionTitle`, может сначала проверить `session_title`, чтобы избежать перезаписи названия, которое пользователь установил явно |
1226
1227Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о стоимости возобновления устаревшего разговора перед первым запросом, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.
1228
1229| Field | Description |
1230| :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1231| `seconds_since_last_response` | Настоящее время в секундах с момента последнего ответа в возобновленном транскрипте |
1232| `context_tokens` | Токены, которые первый запрос возобновленного сеанса повторно отправляет как его подсказка |
1233| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [lifetime кэша подсказок](/docs/ru/prompt-caching#cache-lifetime) сеанса или более позднее сжатие заменило кэшированный разговор |
1234| `estimated_cache_write_usd` | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на модели сеанса, исключая ответ |
1235
1236Этот пример показывает ввод для сеанса, возобновленного через 90 минут после его последнего ответа:
993 1237
994```json theme={null}1238```json theme={null}
995{1239{
997 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1241 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
998 "cwd": "/Users/...",1242 "cwd": "/Users/...",
999 "hook_event_name": "SessionStart",1243 "hook_event_name": "SessionStart",
1000 "source": "startup",1244 "source": "resume",
1001 "model": "claude-sonnet-5"1245 "model": "claude-opus-5",
1246 "seconds_since_last_response": 5400,
1247 "context_tokens": 182340,
1248 "prompt_cache_likely_expired": true,
1249 "estimated_cache_write_usd": 1.1396
1002}1250}
1003```1251```
1004 1252
1006 SessionStart decision control1254 SessionStart decision control
1007</h4>1255</h4>
1008 1256
1009Любой текст, который ваш скрипт hook выводит на stdout, добавляется как контекст для Claude. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, вы можете вернуть эти поля, специфичные для события:1257Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:
1010 1258
1011| Поле | Описание |1259| Field | Description |
1012| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1260| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1013| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для того, как текст доставляется и что в него поместить |1261| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |
1014| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где оно становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создаёт ход |1262| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [non-interactive mode](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |
1015| `sessionTitle` | Устанавливает название сеанса, с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется только когда `source` равен `"startup"` или `"resume"`; игнорируется на `"clear"` и `"compact"` |1263| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |
1016| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) во время этого сеанса |1264| `watchPaths` | Массив абсолютных путей для наблюдения за событиями [FileChanged](#filechanged) во время этого сеанса |
1017| `reloadSkills` | Логическое значение. Когда `true`, Claude Code повторно сканирует каталоги [skill](/docs/ru/skills) и команд после завершения SessionStart hooks, поэтому skills, которые установил hook, доступны в том же сеансе, начиная с первой подсказки |1265| `reloadSkills` | Boolean. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и командные директории после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |
1018 1266
1019```json theme={null}1267```json theme={null}
1020{1268{
1026}1274}
1027```1275```
1028 1276
1029Поскольку простой stdout уже достигает Claude для этого события, hook, который только загружает контекст, может выводить на stdout напрямую без построения JSON. Используйте форму JSON, когда вам нужно объединить контекст с другими полями, такими как `suppressOutput` или `sessionTitle`.1277Поскольку простой stdout уже достигает Claude для этого события, hook, который только загружает контекст, может печатать в stdout напрямую без построения JSON. Используйте форму JSON, когда вам нужно объединить контекст с другими полями, такими как `sessionTitle`.
1030 1278
1031Используйте `reloadSkills`, когда hook SessionStart устанавливает или обновляет skills. Обнаружение skills обычно запускается перед завершением SessionStart hooks, поэтому файлы, которые hook записывает в `~/.claude/skills/` или `.claude/skills/`, в противном случае появились бы только в следующем сеансе. Этот пример синхронизирует репозиторий общих skills и запрашивает повторное сканирование:1279Используйте `reloadSkills`, когда hook SessionStart устанавливает или обновляет skills. Обнаружение skills обычно выполняется до завершения hooks SessionStart, поэтому файлы, которые hook записывает в `~/.claude/skills/` или `.claude/skills/`, в противном случае появятся только в следующем сеансе. Этот пример синхронизирует репозиторий общих skills и запрашивает повторное сканирование:
1032 1280
1033```bash theme={null}1281```bash theme={null}
1034#!/bin/bash1282#!/bin/bash
1039echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1287echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1040```1288```
1041 1289
1290URL репозитория является заполнителем; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.
1291
1042<h4 id="persist-environment-variables">1292<h4 id="persist-environment-variables">
1043 Persist environment variables1293 Persist environment variables
1044</h4>1294</h4>
1045 1295
1046SessionStart hooks имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранять переменные окружения для последующих команд Bash.1296Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранить переменные окружения для последующих команд Bash.
1047 1297
1048Чтобы установить отдельные переменные окружения, напишите операторы `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`) для сохранения переменных, установленных другими hooks:1298Чтобы установить отдельные переменные окружения, напишите операторы `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`) для сохранения переменных, установленных другими hooks:
1049 1299
1078exit 01328exit 0
1079```1329```
1080 1330
1081Любые переменные, написанные в этот файл, будут доступны во всех последующих командах Bash, которые Claude Code выполняет во время сеанса.
1082
1083<Note>1331<Note>
1084 `CLAUDE_ENV_FILE` доступен для SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged) hooks. Другие типы hooks не имеют доступа к этой переменной.1332 `CLAUDE_ENV_FILE` доступен для hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged). Другие типы hooks не имеют доступа к этой переменной.
1085</Note>1333</Note>
1086 1334
1087<h3 id="setup">1335<h3 id="setup">
1088 Setup1336 Setup
1089</h3>1337</h3>
1090 1338
1091Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте это для одноразовой установки зависимостей или запланированной очистки, которую вы запускаете явно из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте [SessionStart](#sessionstart) вместо этого.1339Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [non-interactive mode](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте [SessionStart](#sessionstart) вместо этого.
1092 1340
1093Значение фильтра соответствует флагу CLI, который запустил hook:1341Значение matcher соответствует флагу CLI, который запустил hook:
1094 1342
1095| Фильтр | Когда он срабатывает |1343| Matcher | Когда срабатывает |
1096| :------------ | :------------------------------------------ |1344| :------------ | :------------------------------------------ |
1097| `init` | `claude --init-only` или `claude -p --init` |1345| `init` | `claude --init-only` или `claude -p --init` |
1098| `maintenance` | `claude -p --maintenance` |1346| `maintenance` | `claude -p --maintenance` |
1099 1347
1100`--init-only` запускает Setup hooks и SessionStart hooks с фильтром `startup`, затем выходит без запуска разговора. `--init` и `--maintenance` срабатывают Setup hooks только при объединении с `-p`; в интерактивном сеансе эти два флага в настоящее время не срабатывают Setup hooks.1348Когда вы запускаете `claude --init-only`, Claude Code запускает hooks Setup и hooks `SessionStart` с matcher `startup`, затем выходит без запуска разговора.
1349
1350Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [deferred tool call](#defer-a-tool-call-for-later).
1351
1352При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, запустите с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.
1101 1353
1102Поскольку Setup не срабатывает при каждом запуске, плагин, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который проверяет `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install` при отсутствии. См. [persistent data directory](/docs/ru/plugins-reference#persistent-data-directory) для того, где хранить установленные зависимости.1354Поскольку Setup не срабатывает при каждом запуске, plugin, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins-reference#persistent-data-directory) для информации о том, где хранить установленные зависимости. Если вы распространяете свой plugin через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins-reference#node-js-package-dependencies) при кэшировании plugin.
1103 1355
1104<h4 id="setup-input">1356<h4 id="setup-input">
1105 Setup input1357 Setup input
1106</h4>1358</h4>
1107 1359
1108В дополнение к [общим полям входа](#common-input-fields), Setup hooks получают поле `trigger`, установленное на `"init"` или `"maintenance"`:1360Помимо [common input fields](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:
1109 1361
1110```json theme={null}1362```json theme={null}
1111{1363{
1121 Setup decision control1373 Setup decision control
1122</h4>1374</h4>
1123 1375
1124Setup hooks не могут блокировать. При exit code 2 stderr показывается пользователю как уведомление об ошибке hook, и выполнение продолжается. В [неинтерактивном режиме](/docs/ru/headless) выход hook появляется только при запуске с `--verbose`. Чтобы передать информацию в контекст Claude, верните `additionalContext` в JSON выходе; простой stdout записывается только в журнал отладки. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, вы можете вернуть эти поля, специфичные для события:1376Hooks Setup не могут блокировать; выполнение продолжается при любом коде выхода. При каждом коде выхода Claude Code отбрасывает [JSON output fields](#json-output) hook Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода hook Setup появляются в выводе запуска только как [`hook_response` events](/docs/ru/headless#read-session-metadata) при запуске с `--output-format stream-json --verbose`.
1125 1377
1126| Поле | Описание |1378Hooks Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются в последующих командах Bash для сеанса, как в [SessionStart hooks](#persist-environment-variables). Только hooks `type: "command"` выполняются на `Setup`. Hook `type: "mcp_tool"` на `Setup` всегда пропускается, как описано в [MCP tool hook fields](#mcp-tool-hook-fields).
1127| :------------------ | :---------------------------------------------------------------------------- |
1128| `additionalContext` | Строка, добавленная в контекст Claude. Значения нескольких hooks объединяются |
1129
1130```json theme={null}
1131{
1132 "hookSpecificOutput": {
1133 "hookEventName": "Setup",
1134 "additionalContext": "Dependencies installed: node_modules, .venv"
1135 }
1136}
1137```
1138
1139Setup hooks имеют доступ к `CLAUDE_ENV_FILE`. Переменные, написанные в этот файл, сохраняются в последующих командах Bash для сеанса, как и в [SessionStart hooks](#persist-environment-variables). Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`.
1140 1379
1141<h3 id="instructionsloaded">1380<h3 id="instructionsloaded">
1142 InstructionsLoaded1381 InstructionsLoaded
1143</h3>1382</h3>
1144 1383
1145Срабатывает при загрузке файла `CLAUDE.md` или `.claude/rules/*.md` в контекст. Это событие срабатывает при запуске сеанса для нетерпеливо загруженных файлов и снова позже при ленивой загрузке, например когда Claude получает доступ к подкаталогу, содержащему вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокировку или управление решением. Он запускается асинхронно в целях наблюдаемости.1384Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для нетерпеливо загруженных файлов и снова позже, когда файлы загружаются лениво, например когда Claude получает доступ к подпапке, которая содержит вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокирование или управление решением. Он выполняется асинхронно в целях наблюдаемости.
1385
1386Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md`, с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является symlink на него, как обычная загрузка `CLAUDE.md`.
1146 1387
1147Фильтр запускается против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.1388Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.
1148 1389
1149<h4 id="instructionsloaded-input">1390<h4 id="instructionsloaded-input">
1150 InstructionsLoaded input1391 InstructionsLoaded input
1151</h4>1392</h4>
1152 1393
1153В дополнение к [общим полям входа](#common-input-fields), InstructionsLoaded hooks получают эти поля:1394Помимо [common input fields](#common-input-fields), hooks InstructionsLoaded получают эти поля:
1154 1395
1155| Поле | Описание |1396| Field | Description |
1156| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1397| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1157| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |1398| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |
1158| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |1399| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |
1159| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает при перезагрузке файлов инструкций после события компактирования |1400| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |
1160| `globs` | Шаблоны glob пути из frontmatter `paths:` файла, если есть. Присутствует только для загрузок `path_glob_match` |1401| `globs` | Шаблоны glob пути из frontmatter `paths:` файла, если есть. Присутствует только для загрузок `path_glob_match` |
1161| `trigger_file_path` | Путь к файлу, доступ к которому вызвал эту загрузку, для ленивых загрузок |1402| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |
1162| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |1403| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |
1163 1404
1164```json theme={null}1405```json theme={null}
1177 InstructionsLoaded decision control1418 InstructionsLoaded decision control
1178</h4>1419</h4>
1179 1420
1180InstructionsLoaded hooks не имеют управления решением. Они не могут блокировать или изменять загрузку инструкций. Используйте это событие для аудита логирования, отслеживания соответствия или наблюдаемости.1421Hooks InstructionsLoaded не имеют управления решением. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [JSON output fields](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита логирования, отслеживания соответствия или наблюдаемости.
1181 1422
1182<h3 id="userpromptsubmit">1423<h3 id="userpromptsubmit">
1183 UserPromptSubmit1424 UserPromptSubmit
1184</h3>1425</h3>
1185 1426
1186Запускается при отправке пользователем подсказки, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определённые типы подсказок.1427Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определенные типы подсказок.
1187 1428
1188Hooks `UserPromptSubmit` имеют таймаут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool`, что короче, чем таймаут по умолчанию 600 секунд для этих типов на других событиях. Поскольку этот hook запускается перед каждой подсказкой и блокирует обработку модели до его завершения, застрявший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1429Hooks `UserPromptSubmit` имеют стандартный timeout 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем стандартный 600-секундный timeout для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, зависший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1189 1430
1190Hook `UserPromptSubmit`, который достигает своего таймаута, отменяется и его выход, включая любой `additionalContext`, отбрасывается. Подсказка всё ещё достигает Claude без этого контекста. Начиная с v2.1.196, транскрипт показывает уведомление, называющее hook, таймаут, который сработал, и что выход был отброшен. Более ранние версии отменяют hook без уведомления.1431Помимо command hook, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` command, HTTP или MCP tool, который достигает своего timeout, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление, называющее hook, timeout, который сработал, и что вывод был отброшен.
1191 1432
1192Hook [Agent SDK callback](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего таймаута, блокирует подсказку с сообщением, называющим hook и таймаут, потому что callback там может действовать как политический шлюз, который не должен отказать открыто. Сеанс продолжается. До v2.1.208 таймаут callback на этом событии заканчивал ход с ошибкой выполнения.1433[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего timeout, блокирует подсказку сообщением, называющим hook и timeout, потому что callback там может действовать как политический шлюз, который не должен отказывать открыто. Сеанс продолжается. До версии 2.1.208 callback timeout на этом событии заканчивал ход с ошибкой выполнения.
1193 1434
1194<h4 id="userpromptsubmit-input">1435<h4 id="userpromptsubmit-input">
1195 UserPromptSubmit input1436 UserPromptSubmit input
1196</h4>1437</h4>
1197 1438
1198В дополнение к [общим полям входа](#common-input-fields), UserPromptSubmit hooks получают поле `prompt`, содержащее текст, отправленный пользователем.1439Помимо [common input fields](#common-input-fields), hooks UserPromptSubmit получают поле `prompt`, содержащее текст, отправленный пользователем.
1199 1440
1200```json theme={null}1441```json theme={null}
1201{1442{
1212 UserPromptSubmit decision control1453 UserPromptSubmit decision control
1213</h4>1454</h4>
1214 1455
1215Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Доступны все [JSON поля выхода](#json-output).1456Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [JSON output fields](#json-output) доступны.
1216 1457
1217Есть два способа добавить контекст в разговор при exit code 0:1458Есть два способа добавить контекст к разговору при коде выхода 0:
1218 1459
1219* **Простой текст stdout**: любой текст, не являющийся JSON, написанный на stdout, добавляется как контекст1460* **Plain text stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude
1220* **JSON с `additionalContext`**: используйте формат JSON ниже для большего управления. Поле `additionalContext` добавляется как контекст1461* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст
1221 1462
1222Простой stdout показывается как выход hook в транскрипте. Значение `additionalContext` внедряется как системное напоминание, которое Claude читает без видимой записи в транскрипте.1463Ни один канал не создает видимую запись в транскрипте. Plain stdout и значение `additionalContext` каждое вводятся как системное напоминание, которое начинается с имени hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).
1223 1464
1224Чтобы заблокировать подсказку, верните JSON объект с `decision`, установленным на `"block"`:1465Чтобы заблокировать подсказку, верните JSON объект с `decision`, установленным на `"block"`:
1225 1466
1226| Поле | Описание |1467| Field | Description |
1227| :----------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |1468| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
1228| `decision` | `"block"` предотвращает обработку подсказки и стирает её из контекста. Опустите, чтобы разрешить подсказке продолжаться |1469| `decision` | `"block"` предотвращает обработку подсказки и стирает ее из контекста. Опустите, чтобы позволить подсказке продолжить |
1229| `reason` | Показывается пользователю при `decision` равном `"block"`. Не добавляется в контекст |1470| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |
1230| `additionalContext` | Строка, добавленная в контекст Claude наряду с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1471| `additionalContext` | Строка, добавленная в контекст Claude рядом с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |
1231| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержимого подсказки |1472| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |
1232| `suppressOriginalPrompt` | Если `true` при `decision` равном `"block"`, опускает исходный текст подсказки из сообщения блокировки, показываемого пользователю |1473| `suppressOriginalPrompt` | Если `true`, когда `decision` имеет значение `"block"`, опускает исходный текст подсказки из сообщения блокировки, показанного пользователю |
1474
1475Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю, и он не добавляется в контекст.
1233 1476
1234```json theme={null}1477```json theme={null}
1235{1478{
1247 UserPromptExpansion1490 UserPromptExpansion
1248</h3>1491</h3>
1249 1492
1250Запускается, когда пользователь вводит slash command, который расширяется в подсказку перед достижением Claude. Используйте это для блокировки определённых команд от прямого вызова, внедрения контекста для определённого skill или логирования, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если файл одобрения отсутствует, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.1493Запускается, когда команда, введенная пользователем, расширяется в подсказку перед достижением Claude. Используйте это для блокирования определенных команд от прямого вызова, внедрения контекста для определенного skill или логирования того, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если файл одобрения отсутствует, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.
1251 1494
1252Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1495Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1253 1496
1254Совпадает с `command_name`. Оставьте фильтр пустым для срабатывания на каждой подсказке-типе slash command.1497Совпадает с `command_name`. Оставьте matcher пустым для срабатывания на каждой команде типа подсказки.
1255 1498
1256<h4 id="userpromptexpansion-input">1499<h4 id="userpromptexpansion-input">
1257 UserPromptExpansion input1500 UserPromptExpansion input
1258</h4>1501</h4>
1259 1502
1260В дополнение к [общим полям входа](#common-input-fields), UserPromptExpansion hooks получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` равно `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.1503Помимо [common input fields](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` имеет значение `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.
1261 1504
1262```json theme={null}1505```json theme={null}
1263{1506{
1278 UserPromptExpansion decision control1521 UserPromptExpansion decision control
1279</h4>1522</h4>
1280 1523
1281Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Доступны все [JSON поля выхода](#json-output).1524Hooks `UserPromptExpansion` могут заблокировать расширение или добавить контекст. Все [JSON output fields](#json-output) доступны.
1282 1525
1283| Поле | Описание |1526| Field | Description |
1284| :------------------ | :--------------------------------------------------------------------------------------------------------------------------- |1527| :------------------ | :-------------------------------------------------------------------------------------------------------------------------- |
1285| `decision` | `"block"` предотвращает расширение slash command. Опустите, чтобы разрешить ему продолжаться |1528| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |
1286| `reason` | Показывается пользователю при `decision` равном `"block"` |1529| `reason` | Показано пользователю, когда `decision` имеет значение `"block"` |
1287| `additionalContext` | Строка, добавленная в контекст Claude наряду с расширенной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1530| `additionalContext` | Строка, добавленная в контекст Claude рядом с расширенной подсказкой. См. [Add context for Claude](#add-context-for-claude) |
1531
1532Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.
1288 1533
1289```json theme={null}1534```json theme={null}
1290{1535{
1301 MessageDisplay1546 MessageDisplay
1302</h3>1547</h3>
1303 1548
1304Запускается во время потоковой передачи сообщения помощника на экран. Claude Code отображает сообщение порциями: каждый раз, когда пакет новых завершённых строк готов к отрисовке, hook запускается один раз с этими строками, и Claude Code отображает текст замены hook вместо них. Длинное сообщение производит несколько вызовов; короткое сообщение может произвести только один.1549Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отображению, hook выполняется один раз с этими строками, и Claude Code отображает текст замены hook вместо них. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.
1305 1550
1306Используйте MessageDisplay для:1551Используйте MessageDisplay для:
1307 1552
1308* удаления markdown для минимального отображения1553* удаления markdown для минимального отображения
1309* преобразования текста, который приложение Agent SDK показывает своим пользователям1554* преобразования текста, который приложение Agent SDK показывает своим пользователям
1310* редактирования API ключей или внутренних имён хостов из ответов Claude1555* редактирования API ключей или внутренних имен хостов из ответов Claude
1311 1556
1312Claude Code удерживает каждый пакет до возврата вашего hook, поэтому держите hook быстрым. Если hook не удаётся или истекает время ожидания, Claude Code отображает исходный текст. Таймаут по умолчанию для этого события составляет 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1557Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает timeout, Claude Code отображает исходный текст. Стандартный timeout для этого события составляет 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1313 1558
1314MessageDisplay предназначен только для отображения: текст замены изменяет только то, что отрисовывается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отрисовываются без изменений.1559MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.
1315 1560
1316MessageDisplay не поддерживает фильтры и срабатывает для каждого сообщения помощника, которое потоком передаёт текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.1561MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое транслирует текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.
1317 1562
1318В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay запускается один раз за сообщение помощника вместо один раз за пакет строк. Единственный вызов приходит после завершения сообщения и содержит полный текст сообщения: `index` равен `0`, `final` равен `true`, и `delta` содержит всё сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.1563В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение помощника вместо один раз на партию строк. Один вызов приходит после завершения сообщения и несет полный текст сообщения: `index` имеет значение `0`, `final` имеет значение `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.
1319 1564
1320<h4 id="messagedisplay-input">1565<h4 id="messagedisplay-input">
1321 MessageDisplay input1566 MessageDisplay input
1322</h4>1567</h4>
1323 1568
1324В дополнение к [общим полям входа](#common-input-fields), MessageDisplay hooks получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы пакетов зависят от того, как текст потоком передаётся, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определённым образом.1569Помимо [common input fields](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как транслируется текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.
1325 1570
1326| Поле | Описание |1571| Field | Description |
1327| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1572| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1328| `turn_id` | UUID текущего хода |1573| `turn_id` | UUID текущего хода |
1329| `message_id` | UUID сообщения помощника, которое отображается. Стабилен во всех пакетах одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |1574| `message_id` | UUID сообщения помощника, которое отображается. Стабилен во всех партиях одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |
1330| `index` | Нулевой индекс этого пакета в сообщении |1575| `index` | Индекс этой партии в сообщении, начиная с нуля |
1331| `final` | `true` на последнем пакете сообщения. Каждое сообщение имеет ровно один финальный пакет |1576| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |
1332| `delta` | Новые завершённые строки с момента предыдущего пакета, включая завершающие новые строки. Всегда целые строки, кроме финального пакета, который может заканчиваться в середине строки. В интерактивных запусках дельта финального пакета пуста, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустую дельту, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` единственный вызов содержит всё сообщение |1577| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуста, когда сообщение заканчивается новой строкой, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |
1333 1578
1334```json theme={null}1579```json theme={null}
1335{1580{
1349 MessageDisplay output1594 MessageDisplay output
1350</h4>1595</h4>
1351 1596
1352В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, MessageDisplay hooks могут вернуть `displayContent` для замены дельты на экране:1597Помимо [JSON output fields](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:
1353 1598
1354| Поле | Описание |1599| Field | Description |
1355| :--------------- | :-------------------------------------------------------------------- |1600| :--------------- | :------------------------------------------------------------------- |
1356| `displayContent` | Текст, отображаемый вместо дельты. Опустите для отображения исходного |1601| `displayContent` | Текст, отображаемый вместо delta. Опустите для отображения исходного |
1357 1602
1358MessageDisplay hooks не имеют управления решением. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude.1603Hooks MessageDisplay не имеют управления решением. Они не могут заблокировать сообщение или изменить то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их JSON вывода и отбрасывает `systemMessage` и `continue`.
1359 1604
1360Этот пример удаляет форматирование markdown из ответов Claude для отображения в виде простого текста. Скрипт читает каждый пакет из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.1605Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.
1361 1606
1362<Tabs>1607<Tabs>
1363 <Tab title="macOS/Linux">1608 <Tab title="macOS/Linux">
1387 #!/bin/bash1632 #!/bin/bash
1388 jq '{hookSpecificOutput: {hookEventName: "MessageDisplay", displayContent: (.delta | gsub("\\*\\*"; "") | gsub("`"; ""))}}'1633 jq '{hookSpecificOutput: {hookEventName: "MessageDisplay", displayContent: (.delta | gsub("\\*\\*"; "") | gsub("`"; ""))}}'
1389 ```1634 ```
1390
1391 Скрипту нужен `jq` в вашем `PATH`.
1392 </Tab>1635 </Tab>
1393 1636
1394 <Tab title="Windows (PowerShell)">1637 <Tab title="Windows (PowerShell)">
1418 }1661 }
1419 ```1662 ```
1420 1663
1421 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы hook запустился быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.1664 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, поэтому hook запускается быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.
1422 1665
1423 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:1666 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:
1424 1667
1435 </Tab>1678 </Tab>
1436</Tabs>1679</Tabs>
1437 1680
1438Пакеты без markdown проходят без изменений. Если скрипт не удаётся, например потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.1681Партии без markdown проходят без изменений. Если скрипт не удается, например потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.
1439 1682
1440<h3 id="pretooluse">1683<h3 id="pretooluse">
1441 PreToolUse1684 PreToolUse
1442</h3>1685</h3>
1443 1686
1444Запускается после того, как Claude создаёт параметры инструмента и перед обработкой вызова инструмента. Совпадает с именем инструмента: `Bash`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `WebFetch`, `WebSearch`, `AskUserQuestion`, `ExitPlanMode` и любые [имена MCP инструментов](#match-mcp-tools).1687Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым именем инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [MCP tool names](#match-mcp-tools).
1688
1689Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged) вместо соответствия инструментам редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения, и они не имеют управления решением, поэтому они не могут заблокировать запись.
1445 1690
1446<Warning>1691<Warning>
1447 PreToolUse запускается только когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без какого-либо вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому никакой hook PreToolUse не срабатывает для них, включая hooks, соответствующие `Read`. Чтобы заблокировать определённые пути от ссылок `@`, используйте [правило отклонения `Read`](/docs/ru/permissions#read-and-edit) вместо этого.1692 PreToolUse запускается только, когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому никакой hook PreToolUse не срабатывает для них, включая hooks, соответствующие `Read`. Чтобы заблокировать определенные пути от ссылок `@`, используйте [правило отказа `Read`](/docs/ru/permissions#read-and-edit) вместо этого.
1693
1694 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1448</Warning>1695</Warning>
1449 1696
1450Используйте [PreToolUse decision control](#pretooluse-decision-control) для разрешения, отклонения, запроса или отложения вызова инструмента.1697Используйте [PreToolUse decision control](#pretooluse-decision-control) для разрешения, отказа, запроса или отсрочки вызова инструмента.
1698
1699[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой timeout, блокирует вызов инструмента, и Claude получает результат ошибки, называющий timeout. Явный отказ, возвращенный другим hook, все еще имеет приоритет.
1451 1700
1452<h4 id="pretooluse-input">1701<h4 id="pretooluse-input">
1453 PreToolUse input1702 PreToolUse input
1454</h4>1703</h4>
1455 1704
1456В дополнение к [общим полям входа](#common-input-fields), PreToolUse hooks получают `tool_name`, `tool_input` и `tool_use_id`. Поля `tool_input` зависят от инструмента:1705Помимо [common input fields](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1706
1707Для [MCP tool](#match-mcp-tools), ввод также несет `mcp_server`, объект с `name` сервера и `source`, который говорит, откуда пришло определение сервера. Значения `source` включают `plugin`, `sdk` и области конфигурации, такие как `user` и `project`. [`McpServerProvenance`](/docs/ru/agent-sdk/typescript#mcpserverprovenance) в справочнике Agent SDK перечисляет их все и говорит, как рассматривать тот, который вы не узнаете. Основывайте решения о доверии на `source`, а не на `name` или префиксе инструмента `mcp__<server>__`. Поле `mcp_server` требует Claude Code v2.1.274 или позже.
1708
1709Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:
1710
1711* Claude Code расширяет `~` и относительные пути перед выполнением hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание того же пути
1712* На Windows путь приходит с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`
1713* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки
1714* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен
1715
1716Вызов `Write` на Windows доставляет:
1717
1718```json theme={null}
1719{
1720 "hook_event_name": "PreToolUse",
1721 "tool_name": "Write",
1722 "tool_input": {
1723 "file_path": "C:\\project\\src\\index.ts",
1724 "content": "..."
1725 },
1726 ...
1727}
1728```
1729
1730Поля `tool_input` зависят от инструмента:
1731
1732<a id="bash" />
1457 1733
1458<h5 id="bash">1734<h5 id="bash">
1459 Bash1735 Bash
1460</h5>1736</h5>
1461 1737
1462Выполняет команды оболочки.1738Выполняет команды shell.
1463 1739
1464| Поле | Тип | Пример | Описание |1740| Field | Type | Example | Description |
1465| :------------------ | :------ | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |1741| :------------------ | :------ | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |
1466| `command` | string | `"npm test"` | Команда оболочки для выполнения |1742| `command` | string | `"npm test"` | Команда shell для выполнения |
1467| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |1743| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |
1468| `timeout` | number | `120000` | Опциональный таймаут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1744| `timeout` | number | `120000` | Опциональный timeout в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1469| `run_in_background` | boolean | `false` | Запускать ли команду в фоне |1745| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1746
1747Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude редактировать файлы через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.
1748
1749Ваш [PostToolUse hook](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.
1750
1751<Note>
1752 Список лучше всего усилен и находится в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для применения политики.
1753</Note>
1754
1755`changedFiles` и `files` указывают, что изменила команда; остальные поля говорят, насколько полон и надежен этот список.
1756
1757| Field | Type | Example | Description |
1758| :------------- | :------ | :------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1759| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые команда изменила, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |
1760| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` имеет значение `true` для файла, который команда добавила или удалила |
1761| `moreFiles` | number | `2` | Количество измененных файлов без diff в `files` |
1762| `unavailable` | boolean | `true` | Установлено, когда diff неполный или не может быть взят |
1763| `skipped` | boolean | `true` | Установлено для команды Git, которая перемещает рабочее дерево, такой как `git checkout` или `git stash`, поэтому Claude Code не берет diff |
1764| `shared` | boolean | `true` | Установлено, когда другой вызов инструмента Bash, такой как вызов подагента, выполнялся в том же репозитории одновременно, поэтому некоторые перечисленные изменения могут быть этой командой |
1765
1766<a id="powershell" />
1767
1768<h5 id="powershell">
1769 PowerShell
1770</h5>
1771
1772Выполняет команды PowerShell. См. [PowerShell tool](/docs/ru/tools-reference#powershell-tool) для доступности по платформе.
1773
1774Поля совпадают с инструментом Bash, со строкой команды в `command`:
1775
1776| Field | Type | Example | Description |
1777| :------------------ | :------ | :------------------------- | :--------------------------------------------- |
1778| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |
1779| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |
1780| `timeout` | number | `120000` | Опциональный timeout в миллисекундах |
1781| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1782
1783Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды shell, поэтому они охватывают оба инструмента:
1784
1785* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основной shell и маршрутизирует команды shell через него.
1786* На Windows без Git Bash инструмент включен автоматически, и Claude Code вообще не регистрирует инструмент Bash.
1787* Hook, который совпадает только с `Bash`, никогда не срабатывает там.
1470 1788
1471<h5 id="write">1789<h5 id="write">
1472 Write1790 Write
1473</h5>1791</h5>
1474 1792
1475Создаёт или перезаписывает файл.1793Создает или перезаписывает файл.
1476 1794
1477| Поле | Тип | Пример | Описание |1795| Field | Type | Example | Description |
1478| :---------- | :----- | :-------------------- | :--------------------------------- |1796| :---------- | :----- | :-------------------- | :--------------------------------- |
1479| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для записи |1797| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для записи |
1480| `content` | string | `"file content"` | Содержимое для записи в файл |1798| `content` | string | `"file content"` | Содержимое для записи в файл |
1485 1803
1486Заменяет строку в существующем файле.1804Заменяет строку в существующем файле.
1487 1805
1488| Поле | Тип | Пример | Описание |1806| Field | Type | Example | Description |
1489| :------------ | :------ | :-------------------- | :----------------------------------------- |1807| :------------ | :------ | :-------------------- | :----------------------------------------- |
1490| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для редактирования |1808| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для редактирования |
1491| `old_string` | string | `"original text"` | Текст для поиска и замены |1809| `old_string` | string | `"original text"` | Текст для поиска и замены |
1498 1816
1499Читает содержимое файла.1817Читает содержимое файла.
1500 1818
1501| Поле | Тип | Пример | Описание |1819| Field | Type | Example | Description |
1502| :---------- | :----- | :-------------------- | :------------------------------------------ |1820| :---------- | :----- | :-------------------- | :------------------------------------------ |
1503| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |1821| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |
1504| `offset` | number | `10` | Опциональный номер строки для начала чтения |1822| `offset` | number | `10` | Опциональный номер строки для начала чтения |
1510 1828
1511Находит файлы, соответствующие шаблону glob.1829Находит файлы, соответствующие шаблону glob.
1512 1830
1513| Поле | Тип | Пример | Описание |1831| Field | Type | Example | Description |
1514| :-------- | :----- | :--------------- | :-------------------------------------------------------------------- |1832| :-------- | :----- | :--------------- | :-------------------------------------------------------------------------- |
1515| `pattern` | string | `"**/*.ts"` | Шаблон glob для совпадения файлов |1833| `pattern` | string | `"**/*.ts"` | Шаблон glob для соответствия файлам |
1516| `path` | string | `"/path/to/dir"` | Опциональный каталог для поиска. По умолчанию текущий рабочий каталог |1834| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |
1517 1835
1518<h5 id="grep">1836<h5 id="grep">
1519 Grep1837 Grep
1520</h5>1838</h5>
1521 1839
1522Ищет содержимое файла с регулярными выражениями.1840Ищет содержимое файлов с помощью регулярных выражений.
1523 1841
1524| Поле | Тип | Пример | Описание |1842| Field | Type | Example | Description |
1525| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------- |1843| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------- |
1526| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |1844| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |
1527| `path` | string | `"/path/to/dir"` | Опциональный файл или каталог для поиска |1845| `path` | string | `"/path/to/dir"` | Опциональный файл или директория для поиска |
1528| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |1846| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |
1529| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |1847| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |
1530| `-i` | boolean | `true` | Поиск без учёта регистра |1848| `-i` | boolean | `true` | Поиск без учета регистра |
1531| `multiline` | boolean | `false` | Включить многострочное совпадение |1849| `multiline` | boolean | `false` | Включить многострочное соответствие |
1532 1850
1533<h5 id="webfetch">1851<h5 id="webfetch">
1534 WebFetch1852 WebFetch
1536 1854
1537Получает и обрабатывает веб-содержимое.1855Получает и обрабатывает веб-содержимое.
1538 1856
1539| Поле | Тип | Пример | Описание |1857| Field | Type | Example | Description |
1540| :------- | :----- | :---------------------------- | :--------------------------------------------- |1858| :------- | :----- | :---------------------------- | :--------------------------------------------- |
1541| `url` | string | `"https://example.com/api"` | URL для получения содержимого |1859| `url` | string | `"https://example.com/api"` | URL для получения содержимого |
1542| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном содержимом |1860| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном содержимом |
1547 1865
1548Ищет в веб.1866Ищет в веб.
1549 1867
1550| Поле | Тип | Пример | Описание |1868| Field | Type | Example | Description |
1551| :---------------- | :----- | :----------------------------- | :------------------------------------------------------ |1869| :---------------- | :----- | :----------------------------- | :------------------------------------------------------ |
1552| `query` | string | `"react hooks best practices"` | Поисковый запрос |1870| `query` | string | `"react hooks best practices"` | Поисковый запрос |
1553| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включать результаты только с этих доменов |1871| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включить результаты только с этих доменов |
1554| `blocked_domains` | array | `["spam.example.com"]` | Опциональный: исключить результаты с этих доменов |1872| `blocked_domains` | array | `["spam.example.com"]` | Опциональный: исключить результаты с этих доменов |
1555 1873
1556<h5 id="agent">1874<h5 id="agent">
1559 1877
1560Порождает [subagent](/docs/ru/sub-agents).1878Порождает [subagent](/docs/ru/sub-agents).
1561 1879
1562| Поле | Тип | Пример | Описание |1880| Field | Type | Example | Description |
1563| :-------------- | :----- | :------------------------- | :------------------------------------------------------------- |1881| :-------------- | :----- | :------------------------- | :--------------------------------------------------------- |
1564| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |1882| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |
1565| `description` | string | `"Find API endpoints"` | Краткое описание задачи |1883| `description` | string | `"Find API endpoints"` | Краткое описание задачи |
1566| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |1884| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |
1567| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения по умолчанию |1885| `model` | string | `"sonnet"` | Опциональный alias модели для переопределения по умолчанию |
1568 1886
1569В `PostToolUse`, `tool_response` для завершённого вызова Agent содержит финальный текст subagent вместе с телеметрией использования. Читайте эти поля для записи затрат для каждого subagent из hook:1887Когда вызов Agent переднего плана завершается, ваш [PostToolUse hook](#posttooluse) получает финальный текст подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [token and cost counters](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:
1570 1888
1571| Поле | Тип | Пример | Описание |1889| Field | Type | Example | Description |
1572| :------------------ | :----- | :---------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1890| :------------------ | :----- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1573| `status` | string | `"completed"` | `"completed"` для синхронных вызовов, `"async_launched"` для фоновых subagents. Начиная с v2.1.198, subagents запускаются в фоне по умолчанию, поэтому опущенный `run_in_background` также производит `"async_launched"` |1891| `status` | string | `"completed"` | `"completed"` для подагентов переднего плана, `"async_launched"` для подагентов фонового плана. Начиная с v2.1.198, подагенты выполняются в фоне по умолчанию, поэтому опущенный `run_in_background` также создает `"async_launched"` |
1574| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска subagent |1892| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |
1575| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки subagent |1893| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента, или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этой передаче вместо них |
1576| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой запустился subagent, которая может отличаться от запрошенной модели. Требует Claude Code v2.1.174 или позже |1894| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |
1577| `totalTokens` | number | `12450` | Всего токенов, выставленных счётом по ходам subagent |1895| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |
1578| `totalDurationMs` | number | `48211` | Реальная длительность запуска subagent |1896| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |
1579| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал subagent |1897| `totalDurationMs` | number | `48211` | Настоящее время выполнения запуска подагента |
1580| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1898| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |
1899| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1581 1900
1582Для фоновых subagents инструмент возвращается сразу после запуска, поэтому `tool_response` не содержит полей использования. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel` вместо этого.1901На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), доставляет свой отчет через этот инструмент, а не возвращает его как текст. Поле `content` его результата `completed` затем несет краткую заметку об этой передаче, а не сам отчет. Чтобы прочитать отчет, совпадайте с hook `PreToolUse` или `PostToolUse` на `SubagentHandback` и прочитайте `tool_input.message`.
1583 1902
1584Поле `resolvedModel` называет модель, на которой subagent фактически запустился, что может отличаться от значения `model` в `tool_input`. Оно требует Claude Code v2.1.174 или позже.1903Для подагентов фонового плана инструмент возвращается, когда задача переходит в фон, поэтому `tool_response` не несет полей использования: фоновый запуск возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фон во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1904
1905На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, что может отличаться от значения `model` в `tool_input`, такого как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент переходит в фон, поэтому переключение, которое произошло перед переходом в фон, отражается там. `modelsUsed` и поведение `resolvedModel` во время перехода в фон требуют Claude Code v2.1.212 или позже.
1585 1906
1586<a id="askuserquestion" />1907<a id="askuserquestion" />
1587 1908
1589 AskUserQuestion1910 AskUserQuestion
1590</h5>1911</h5>
1591 1912
1592Задаёт пользователю один-четыре вопроса с множественным выбором.1913Задает пользователю один-четыре вопроса с множественным выбором.
1593 1914
1594| Поле | Тип | Пример | Описание |1915| Field | Type | Example | Description |
1595| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1916| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1596| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с текстом `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |1917| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с строкой `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |
1597| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Соответствует текст вопроса выбранному ярлыку опции. Ответы с множественным выбором объединяют ярлыки запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |1918| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Отображает текст вопроса на выбранный label опции. Ответы с множественным выбором объединяют labels запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |
1598 1919
1599<h5 id="exitplanmode">1920<h5 id="exitplanmode">
1600 ExitPlanMode1921 ExitPlanMode
1601</h5>1922</h5>
1602 1923
1603Представляет план и просит пользователя одобрить его перед тем, как Claude покинет [plan mode](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` от модели обычно пуст. Claude Code внедряет содержимое плана и путь файла перед передачей входных данных в hooks.1924Представляет план и просит пользователя одобрить его перед тем, как Claude покидает [plan mode](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.
1604 1925
1605| Поле | Тип | Пример | Описание |1926| Field | Type | Example | Description |
1606| :--------------- | :----- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |1927| :--------------- | :----- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
1607| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Внедрено из файла плана на диске |1928| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |
1608| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Внедрено |1929| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |
1609| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно содержало разрешения на основе подсказки, которые Claude запрашивал для реализации плана |1930| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |
1610 1931
1611В `PostToolUse`, `tool_response` — это объект с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Читайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.1932В `PostToolUse`, `tool_response` — это объект с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.
1612 1933
1613<h4 id="pretooluse-decision-control">1934<h4 id="pretooluse-decision-control">
1614 PreToolUse decision control1935 PreToolUse decision control
1615</h4>1936</h4>
1616 1937
1617Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют верхнеуровневое поле `decision`, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт ему более богатое управление: четыре результата (разрешить, отклонить, спросить или отложить) плюс возможность изменить входные данные инструмента перед выполнением.1938Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отсрочить) плюс возможность изменить ввод инструмента перед выполнением.
1618 1939
1619| Поле | Описание |1940| Field | Description |
1620| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1941| :------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1621| `permissionDecision` | `"allow"` пропускает диалог разрешения, кроме [инструментов, требующих взаимодействия пользователя](#pretooluse-decision-control) и инструментов соединителя [ваша организация установила на `ask`](/docs/ru/mcp#organization-controls-on-connector-tools). `"deny"` предотвращает вызов инструмента. `"ask"` предлагает пользователю подтвердить. `"defer"` выходит корректно, чтобы инструмент мог быть возобновлён позже. [Правила отклонения и запроса](/docs/ru/permissions#manage-permissions) всё ещё применяются независимо от того, что возвращает hook |1942| `permissionDecision` | `"allow"` пропускает подсказку разрешения, кроме [actions no mode auto-approves](/docs/ru/permission-modes#actions-no-mode-auto-approves) и для `AskUserQuestion` и `ExitPlanMode`, которым нужен [`updatedInput` в паре с ним](#allow-with-updatedinput). `"deny"` предотвращает вызов инструмента. `"ask"` подсказывает пользователю подтвердить. `"defer"` выходит корректно, чтобы инструмент можно было возобновить позже. [Deny and ask rules](/docs/ru/permissions#manage-permissions) все еще оцениваются независимо от того, что возвращает hook |
1622| `permissionDecisionReason` | Для `"allow"` и `"ask"`, показывается пользователю, но не Claude. Для `"deny"`, показывается Claude. Для `"defer"`, игнорируется |1943| `permissionDecisionReason` | Для `"allow"` и `"ask"`, показано пользователю, но не Claude. Для `"deny"`, показано Claude. Для `"defer"`, игнорируется |
1623| `updatedInput` | Изменяет параметры входа инструмента перед выполнением. Заменяет весь объект входа, поэтому включите неизменённые поля наряду с изменёнными. Объедините с `"allow"` для автоматического одобрения или `"ask"` для показа изменённого входа пользователю. Для `"defer"`, игнорируется |1944| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Claude Code оценивает правила разрешений и [auto-background eligibility](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |
1624| `additionalContext` | Строка, добавленная в контекст Claude наряду с результатом инструмента. Игнорируется при `permissionDecision` равном `"defer"`. См. [Add context for Claude](#add-context-for-claude) |1945| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |
1625 1946
1626Когда несколько PreToolUse hooks возвращают разные решения, приоритет — `deny` > `defer` > `ask` > `allow`.1947Когда несколько hooks PreToolUse возвращают разные решения, приоритет — `deny` > `defer` > `ask` > `allow`.
1627 1948
1628Когда hook возвращает `"ask"`, диалог разрешения, отображаемый пользователю, включает метку, идентифицирующую источник hook: например, `[User]`, `[Project]`, `[Plugin]` или `[Local]`. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1949Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.
1950
1951Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает метку, определяющую, откуда пришел hook: `[settings]` для hook из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для hook plugin или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1952
1953`"ask"` hook также принуждает подсказку разрешения в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызов инструмента, но он не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и hook `"deny"` всегда соблюдался.
1629 1954
1630```json theme={null}1955```json theme={null}
1631{1956{
1641}1966}
1642```1967```
1643 1968
1644`AskUserQuestion` и `ExitPlanMode` требуют взаимодействия пользователя и обычно блокируют в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет этому требованию: hook читает входные данные инструмента из stdin, собирает ответ через ваш собственный UI и возвращает его в `updatedInput`, чтобы инструмент запустился без запроса. Возврат только `"allow"` недостаточен для этих инструментов. Для `AskUserQuestion` повторите исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), соответствующий тексту каждого вопроса выбранному ответу.1969<span id="allow-with-updatedinput" />
1645 1970
1646Инструменты соединителя [ваша организация установила на `ask`](/docs/ru/mcp#organization-controls-on-connector-tools) запрашивают даже когда hook возвращает `"allow"`.1971В [non-interactive mode](/docs/ru/headless) с флагом `-p`, Claude Code предлагает `AskUserQuestion` и `ExitPlanMode` только, когда запуск имеет [permission host](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) для получения подсказки, такой как callback Agent SDK `canUseTool`. Эти инструменты требуют взаимодействия с пользователем. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет это требование: hook читает ввод инструмента из stdin, собирает ответ через ваш собственный UI и возвращает его в `updatedInput`, чтобы инструмент выполнялся без подсказки. Возврат только `"allow"` недостаточен для этих инструментов. Для `AskUserQuestion`, повторите исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), отображающий текст каждого вопроса на выбранный ответ.
1647 1972
1648Начиная с v2.1.199, инструмент MCP, чей сервер помечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его диалог одобрения с помощью `"allow"`, с `updatedInput` или без, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое нужно инструменту.1973Начиная с версии 2.1.199, инструмент MCP, чей сервер отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с `updatedInput` или без него, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое требует инструмент.
1649 1974
1650<Note>1975<Note>
1651 PreToolUse ранее использовал верхнеуровневые поля `decision` и `reason`, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` соответствуют `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать верхнеуровневые `decision` и `reason` как их текущий формат.1976 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.
1652</Note>1977</Note>
1653 1978
1654<h4 id="defer-a-tool-call-for-later">1979<h4 id="defer-a-tool-call-for-later">
1655 Defer a tool call for later1980 Defer a tool call for later
1656</h4>1981</h4>
1657 1982
1658`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его JSON выход, таких как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать входные данные через его собственный интерфейс и возобновить с того же места. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он логирует предупреждение и игнорирует результат hook.1983`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его JSON вывод, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить с того же места. Claude Code соблюдает это значение только в [non-interactive mode](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он логирует предупреждение и игнорирует результат hook.
1659 1984
1660Инструмент `AskUserQuestion` — это типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Круговой путь работает так:1985Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [permission host](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому запустите запуск с одним. Круговой путь работает так:
1661 1986
16621. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.19871. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.
16632. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и отложенный вызов инструмента сохраняется в транскрипте.19882. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и сохраненным вызовом инструмента в транскрипте.
16643. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своём UI и ждёт ответа.19893. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.
16654. Вызывающий процесс запускает `claude -p --resume <session-id>`. Тот же вызов инструмента срабатывает `PreToolUse` снова.19904. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же permission host. Тот же вызов инструмента срабатывает `PreToolUse` снова.
16665. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.19915. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.
1667 1992
1668Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:1993Поле `deferred_tool_use` несет `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:
1669 1994
1670```json theme={null}1995```json theme={null}
1671{1996{
1681}2006}
1682```2007```
1683 2008
1684Нет таймаута или лимита повторных попыток. Сеанс остаётся на диске до возобновления, в соответствии с операцией очистки [`cleanupPeriodDays`](/docs/ru/settings#available-settings), которая удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.2009Нет timeout или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [retention sweep rules](/docs/ru/claude-directory#cleaned-up-automatically) [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.
1685 2010
1686`"defer"` работает только когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через обычный поток разрешений. Ограничение существует потому что возобновление может только повторно запустить один инструмент: нет способа отложить один вызов из пакета без оставления других неразрешённых.2011`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отсрочить один вызов из партии без оставления других неразрешенными.
1687 2012
1688Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит когда MCP сервер, который предоставил инструмент, не подключен для возобновлённого сеанса. Полезная нагрузка `deferred_tool_use` всё ещё включена, чтобы вы могли идентифицировать, какой инструмент исчез.2013Если отсроченный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, чтобы вы могли определить, какой инструмент исчез.
1689 2014
1690<Note>2015<Note>
1691 `--resume` восстанавливает режим разрешения, который был активен при отложении инструмента, поэтому вам не нужно передавать `--permission-mode` снова. Исключения — это `plan` и `bypassPermissions`, которые никогда не переносятся. Передача `--permission-mode` явно при возобновлении переопределяет восстановленное значение.2016 Чтобы возобновить отсроченный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Без него Claude Code не восстанавливает режим плана. Требует Claude Code v2.1.246 или позже.
2017
2018 Когда вы возобновляете с `-p`, Claude Code не восстанавливает никакой другой сохраненный режим разрешений. Он запускает запуск в режиме разрешений, который новый запуск `claude -p` запустил бы, поэтому передайте `--permission-mode` или `--dangerously-skip-permissions` снова, если отсроченный сеанс использовал один. Когда вы возобновляете с `claude --resume <session-id>` без `-p`, Claude Code восстанавливает сохраненный режим разрешений, с исключениями, перечисленными в [permission mode on resume](/docs/ru/sessions#permission-mode-on-resume).
1692</Note>2019</Note>
1693 2020
1694<h3 id="permissionrequest">2021<h3 id="permissionrequest">
1695 PermissionRequest2022 PermissionRequest
1696</h3>2023</h3>
1697 2024
1698Запускается при показе пользователю диалога разрешения.2025Запускается, когда Claude Code собирается попросить у вас разрешение на использование инструмента. В сеансах, которые не могут показать подсказку, такие как фоновые подагенты в [non-interactive mode](/docs/ru/headless), Claude Code все еще запускает эти hooks, и если ни один hook не возвращает решение, он отказывает вызову инструмента.
1699Используйте [PermissionRequest decision control](#permissionrequest-decision-control) для разрешения или отклонения от имени пользователя.2026Используйте [PermissionRequest decision control](#permissionrequest-decision-control) для разрешения или отказа от имени пользователя.
2027
2028Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает [Notification](#notification) hook с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.
2029
2030Claude Code не запускает hooks PermissionRequest для [network request](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.
1700 2031
1701Совпадает с именем инструмента, те же значения, что и PreToolUse.2032Совпадает с именем инструмента, те же значения, что и PreToolUse.
1702 2033
1704 PermissionRequest input2035 PermissionRequest input
1705</h4>2036</h4>
1706 2037
1707PermissionRequest hooks получают поля `tool_name` и `tool_input` как PreToolUse hooks, но без `tool_use_id`. Опциональный массив `permission_suggestions` содержит параметры "всегда разрешить", которые пользователь обычно видит в диалоге разрешения. Разница в том, когда срабатывает hook: PermissionRequest hooks запускаются при показе диалога разрешения пользователю, в то время как PreToolUse hooks запускаются перед выполнением инструмента независимо от статуса разрешения.2038Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [permission updates](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.
2039
2040Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может удержать опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.
2041
2042Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить у вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1708 2043
1709```json theme={null}2044```json theme={null}
1710{2045{
1733 PermissionRequest decision control2068 PermissionRequest decision control
1734</h4>2069</h4>
1735 2070
1736Hooks `PermissionRequest` могут разрешить или отклонить запросы разрешения. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:2071Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:
1737 2072
1738| Поле | Описание |2073| Field | Description |
1739| :------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2074| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1740| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отклоняет его. [Правила отклонения и запроса](/docs/ru/permissions#manage-permissions) всё ещё применяются, поэтому hook, возвращающий `"allow"`, не переопределяет совпадающее правило отклонения |2075| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает в нем. [Deny and ask rules](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |
1741| `updatedInput` | Только для `"allow"`: изменяет параметры входа инструмента перед выполнением. Заменяет весь объект входа, поэтому включите неизменённые поля наряду с изменёнными. Изменённый вход повторно оценивается против правил отклонения и запроса |2076| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |
1742| `updatedPermissions` | Только для `"allow"`: массив [записей обновления разрешения](#permission-update-entries) для применения, таких как добавление правила разрешения или изменение режима разрешения сеанса |2077| `updatedPermissions` | Для `"allow"` только: массив [permission update entries](#permission-update-entries) для применения, такой как добавление правила разрешения или изменение режима разрешений сеанса |
1743| `message` | Только для `"deny"`: говорит Claude, почему разрешение было отклонено |2078| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |
1744| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |2079| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |
2080
2081Hook, который выходит 2 без объекта `decision`, оставляет поток разрешений неизменным, и его stderr отбрасывается. Только объект `decision` может предоставить или отказать в запросе.
1745 2082
1746```json theme={null}2083```json theme={null}
1747{2084{
1761 Permission update entries2098 Permission update entries
1762</h4>2099</h4>
1763 2100
1764Поле выхода `updatedPermissions` и поле входа [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет её другие поля, и `destination`, который управляет тем, где применяется изменение.2101Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.
1765 2102
1766| `type` | Поля | Эффект |2103| `type` | Fields | Effect |
1767| :------------------ | :--------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2104| :------------------ | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1768| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешения. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |2105| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для соответствия всему инструменту. `behavior` — это `"allow"`, `"deny"` или `"ask"` |
1769| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |2106| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |
1770| `removeRules` | `rules`, `behavior`, `destination` | Удаляет совпадающие правила данного `behavior` |2107| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |
1771| `setMode` | `mode`, `destination` | Изменяет режим разрешения. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |2108| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как alias для `default`. Alias `manual` требует Claude Code v2.1.200 или позже |
1772| `addDirectories` | `directories`, `destination` | Добавляет рабочие каталоги. `directories` — это массив строк пути |2109| `addDirectories` | `directories`, `destination` | Добавляет рабочие директории. `directories` — это массив строк пути |
1773| `removeDirectories` | `directories`, `destination` | Удаляет рабочие каталоги |2110| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |
1774 2111
1775<Note>2112<Note>
1776 `setMode` с `bypassPermissions` только вступает в силу, если сеанс был запущен с режимом обхода, уже доступным: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в настройках, и режим не отключен [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings). В противном случае обновление — это no-op. `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2113 `setMode` с `bypassPermissions` вступает в силу только, если вы запустили сеанс с режимом bypass, уже доступным: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [user, `--settings` или managed settings](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление — это no-op. Обновление также является no-op, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает режим или когда сеанс запускается в [restricted mode](/docs/ru/cli-reference#cli-flags).
2114
2115 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.
1777</Note>2116</Note>
1778 2117
1779Поле `destination` на каждой записи определяет, остаётся ли изменение в памяти или сохраняется в файл настроек.2118Поле `destination` на каждой записи определяет, остается ли изменение в памяти или сохраняется в файл настроек.
1780 2119
1781| `destination` | Записывает в |2120| `destination` | Writes to |
1782| :---------------- | :--------------------------------------------------- |2121| :---------------- | :--------------------------------------------------- |
1783| `session` | только в памяти, отбрасывается при завершении сеанса |2122| `session` | только в памяти, отбрасывается при завершении сеанса |
1784| `localSettings` | `.claude/settings.local.json` |2123| `localSettings` | `.claude/settings.local.json` |
1785| `projectSettings` | `.claude/settings.json` |2124| `projectSettings` | `.claude/settings.json` |
1786| `userSettings` | `~/.claude/settings.json` |2125| `userSettings` | `~/.claude/settings.json` |
1787 2126
1788Hook может вывести одно из `permission_suggestions`, которые он получил, как свой собственный выход `updatedPermissions`, что эквивалентно выбору пользователем этого параметра "всегда разрешить" в диалоге.2127Hook может повторить один из `permission_suggestions`, которые он получил, как свой собственный вывод `updatedPermissions`.
1789 2128
1790<h3 id="posttooluse">2129<h3 id="posttooluse">
1791 PostToolUse2130 PostToolUse
1795 2134
1796Совпадает с именем инструмента, те же значения, что и PreToolUse.2135Совпадает с именем инструмента, те же значения, что и PreToolUse.
1797 2136
2137Совпадайте более широко, когда имя инструмента не является правильным фильтром:
2138
2139* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook может затем обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также указывает неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).
2140* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.
2141
1798<h4 id="posttooluse-input">2142<h4 id="posttooluse-input">
1799 PostToolUse input2143 PostToolUse input
1800</h4>2144</h4>
1801 2145
1802Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Входные данные включают как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента.2146Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути инструментов файлов `tool_input` приходят в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).
1803 2147
1804```json theme={null}2148```json theme={null}
1805{2149{
1815 },2159 },
1816 "tool_response": {2160 "tool_response": {
1817 "filePath": "/path/to/file.txt",2161 "filePath": "/path/to/file.txt",
1818 "success": true2162 "type": "create"
1819 },2163 },
1820 "tool_use_id": "toolu_01ABC123...",2164 "tool_use_id": "toolu_01ABC123...",
1821 "duration_ms": 122165 "duration_ms": 12
1822}2166}
1823```2167```
1824 2168
1825| Поле | Описание |2169| Field | Description |
1826| :------------ | :-------------------------------------------------------------------------------------------------------------------------------- |2170| :------------ | :---------------------------------------------------------------------------------------------------------------------------------- |
1827| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на диалоги разрешения и hooks PreToolUse |2171| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
1828 2172
1829<h4 id="posttooluse-decision-control">2173<h4 id="posttooluse-decision-control">
1830 PostToolUse decision control2174 PostToolUse decision control
1831</h4>2175</h4>
1832 2176
1833Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2177Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
1834 2178
1835| Поле | Описание |2179| Field | Description |
1836| :--------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |2180| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1837| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude всё ещё видит исходный выход; чтобы заменить его, используйте `updatedToolOutput` |2181| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |
1838| `reason` | Объяснение, показываемое Claude при `decision` равном `"block"` |2182| `reason` | Объяснение, показанное Claude, когда `decision` имеет значение `"block"` |
1839| `additionalContext` | Строка, добавленная в контекст Claude наряду с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |2183| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |
1840| `updatedToolOutput` | Заменяет выход инструмента предоставленным значением перед отправкой Claude. Значение должно соответствовать форме выхода инструмента |2184| `classifierContext` | Краткая заметка об этом результате вызова для [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) классификатора, а не для Claude. См. [Annotate a result for the auto mode classifier](#annotate-a-result-for-the-auto-mode-classifier). Требует Claude Code v2.1.236 или позже |
1841| `updatedMCPToolOutput` | Заменяет выход только для [MCP инструментов](#match-mcp-tools). Предпочитайте `updatedToolOutput`, который работает для всех инструментов |2185| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |
2186| `updatedMCPToolOutput` | Заменяет вывод для [MCP tools](#match-mcp-tools) только. Предпочитайте `updatedToolOutput`, который работает для всех инструментов |
1842 2187
1843Пример ниже заменяет выход вызова `Bash`. Значение замены соответствует форме выхода инструмента `Bash`:2188Пример ниже заменяет вывод вызова `Bash`. Значение замены совпадает с формой вывода инструмента `Bash`:
1844 2189
1845```json theme={null}2190```json theme={null}
1846{2191{
1858```2203```
1859 2204
1860<Warning>2205<Warning>
1861 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже запустился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный выход перед запуском hook. Чтобы предотвратить или изменить вызов инструмента перед его запуском, используйте hook [PreToolUse](#pretooluse) вместо этого.2206 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте hook [PreToolUse](#pretooluse) вместо этого.
1862 2207
1863 Значение замены должно соответствовать форме выхода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не соответствует схеме выхода инструмента, игнорируется и используется исходный выход. Выход инструмента MCP передаётся без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с неправильным предположением.2208 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.
2209</Warning>
2210
2211<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2212 Annotate a result for the auto mode classifier
2213</h4>
2214
2215Верните `classifierContext` для отправки краткой заметки об этом результате вызова инструмента [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) классификатору, а не Claude. Классификатор [никогда не получает результаты инструментов сами](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ сказать ему что-то о том, что вернул вызов, перед тем как он проверит более поздние действия. Поле требует Claude Code v2.1.236 или позже.
2216
2217Пример ниже говорит классификатору, откуда пришел вывод запроса:
2218
2219```json theme={null}
2220{
2221 "hookSpecificOutput": {
2222 "hookEventName": "PostToolUse",
2223 "classifierContext": "This query ran against the staging database, not production."
2224 }
2225}
2226```
2227
2228Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:
2229
2230* **Hooks, настроенные в Claude Code**: для hooks из файлов настроек, plugins, skills и frontmatter агента, классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре
2231* **In-process Agent SDK callbacks**: когда приложение, встраивающее Claude Code, регистрирует hook как [TypeScript SDK callback](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединенную заметку как непроверенный контекст
2232
2233Claude Code применяет эти ограничения при доставке заметки:
2234
2235* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента на 2000 символов и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов
2236* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоне](#run-hooks-in-the-background), потому что этот ответ приходит после того, как Claude Code записывает результат инструмента
2237* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов
2238* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод
2239
2240<Warning>
2241 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте ненадежный вывод инструмента или текст третьих сторон в него. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя о нем; не используйте поле для доставки несвязанных сообщений или потока событий.
1864</Warning>2242</Warning>
1865 2243
1866<h3 id="posttoolusefailure">2244<h3 id="posttoolusefailure">
1867 PostToolUseFailure2245 PostToolUseFailure
1868</h3>2246</h3>
1869 2247
1870Запускается при сбое выполнения инструмента: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.2248Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.
1871 2249
1872Совпадает с именем инструмента, те же значения, что и PreToolUse.2250Совпадает с именем инструмента, те же значения, что и PreToolUse.
1873 2251
1874<Note>2252<Note>
1875 Это событие не срабатывает для вызовов инструментов, отклонённых перед выполнением: неизвестное имя инструмента, входные данные, которые не проходят проверку схемы или инструмента, или отклонение разрешения. Отклонения проверки возвращаются как результаты `tool_use_error` и происходят перед запуском hooks, поэтому они не срабатывают ни `PreToolUse` ни этим событием. Отклонения разрешения срабатывают `PreToolUse`, но не этим событием; см. [PermissionDenied](#permissiondenied).2253 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное имя инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы проверки возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
1876</Note>2254</Note>
1877 2255
1878<h4 id="posttoolusefailure-input">2256<h4 id="posttoolusefailure-input">
1879 PostToolUseFailure input2257 PostToolUseFailure input
1880</h4>2258</h4>
1881 2259
1882PostToolUseFailure hooks получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как верхнеуровневые поля:2260Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:
1883 2261
1884```json theme={null}2262```json theme={null}
1885{2263{
1894 "description": "Run test suite"2272 "description": "Run test suite"
1895 },2273 },
1896 "tool_use_id": "toolu_01ABC123...",2274 "tool_use_id": "toolu_01ABC123...",
1897 "error": "Command exited with non-zero status code 1",2275 "error": "Exit code 1\nError: Cannot find module 'express'",
1898 "is_interrupt": false,2276 "is_interrupt": false,
1899 "duration_ms": 41872277 "duration_ms": 4187
1900}2278}
1901```2279```
1902 2280
1903| Поле | Описание |2281| Field | Description |
1904| :------------- | :-------------------------------------------------------------------------------------------------------------------------------- |2282| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1905| `error` | Строка, описывающая, что пошло не так |2283| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |
1906| `is_interrupt` | Опциональное логическое значение, указывающее, был ли сбой вызван прерыванием пользователя |2284| `is_interrupt` | Опциональный boolean. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этот hook; результат инструмента несет сообщение прерывания вместо этого |
1907| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на диалоги разрешения и hooks PreToolUse |2285| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
2286
2287Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется по инструменту и сбою. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.
2288
2289* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными
2290* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс shell
2291* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`
1908 2292
1909<h4 id="posttoolusefailure-decision-control">2293<h4 id="posttoolusefailure-decision-control">
1910 PostToolUseFailure decision control2294 PostToolUseFailure decision control
1911</h4>2295</h4>
1912 2296
1913Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2297Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
1914 2298
1915| Поле | Описание |2299| Field | Description |
1916| :------------------ | :------------------------------------------------------------------------------------------------------------ |2300| :------------------ | :----------------------------------------------------------------------------------------------------------- |
1917| `additionalContext` | Строка, добавленная в контекст Claude наряду с ошибкой. См. [Add context for Claude](#add-context-for-claude) |2301| `additionalContext` | Строка, добавленная в контекст Claude рядом с ошибкой. См. [Add context for Claude](#add-context-for-claude) |
1918 2302
1919```json theme={null}2303```json theme={null}
1920{2304{
1929 PostToolBatch2313 PostToolBatch
1930</h3>2314</h3>
1931 2315
1932Запускается один раз после разрешения каждого вызова инструмента в пакете, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз за инструмент, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всем пакетом, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые запустились, а не от какого-либо одного инструмента. Нет фильтра для этого события.2316Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз на инструмент, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.
1933 2317
1934<h4 id="posttoolbatch-input">2318<h4 id="posttoolbatch-input">
1935 PostToolBatch input2319 PostToolBatch input
1936</h4>2320</h4>
1937 2321
1938В дополнение к [общим полям входа](#common-input-fields), PostToolBatch hooks получают `tool_calls`, массив, описывающий каждый вызов инструмента в пакете:2322Помимо [common input fields](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:
1939 2323
1940```json theme={null}2324```json theme={null}
1941{2325{
1961}2345}
1962```2346```
1963 2347
1964`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков содержимого, ровно как инструмент его выдал. Для `Read` это означает текст с префиксом номера строки, а не необработанное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.2348`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков содержимого, ровно как инструмент выдал его. Для `Read` это означает текст с префиксом номера строки, а не исходное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.
1965 2349
1966<Note>2350<Note>
1967 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передаёт структурированный объект `Output` инструмента, такой как `{filePath: "...", success: true}` для `Write`; `PostToolBatch` передаёт сериализованное содержимое `tool_result`, которое видит модель.2351 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передает структурированный объект `Output` инструмента, такой как `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передает сериализованное содержимое `tool_result`, которое видит модель.
1968</Note>2352</Note>
1969 2353
1970<h4 id="posttoolbatch-decision-control">2354<h4 id="posttoolbatch-decision-control">
1971 PostToolBatch decision control2355 PostToolBatch decision control
1972</h4>2356</h4>
1973 2357
1974Hooks `PostToolBatch` могут внедрить контекст для Claude. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2358Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
1975 2359
1976| Поле | Описание |2360| Field | Description |
1977| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2361| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1978| `additionalContext` | Строка контекста, внедрённая один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в неё поместить и как возобновлённые сеансы обрабатывают прошлые значения |2362| `additionalContext` | Строка контекста, внедренная один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в нее поместить и как возобновленные сеансы обрабатывают прошлые значения |
1979 2363
1980```json theme={null}2364```json theme={null}
1981{2365{
1986}2370}
1987```2371```
1988 2372
1989Возврат `decision: "block"` или `continue: false` останавливает агентный цикл перед следующим вызовом модели.2373Возврат `decision: "block"` или `continue: false` останавливает агентский цикл перед следующим вызовом модели. Сообщение блокировки поступает из JSON `reason` или `stopReason` или из stderr при выходе 2. Вы видите его как предупреждение в транскрипте, и оно остается в разговоре, поэтому Claude видит его при продолжении разговора.
1990 2374
1991<h3 id="permissiondenied">2375<h3 id="permissiondenied">
1992 PermissionDenied2376 PermissionDenied
1993</h3>2377</h3>
1994 2378
1995Запускается когда классификатор [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отклоняет вызов инструмента. Этот hook срабатывает только в auto mode: он не запускается когда вы вручную отклоняете диалог разрешения, когда hook `PreToolUse` блокирует вызов или когда совпадает правило `deny`. Используйте это для логирования отказов классификатора, корректировки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.2379Запускается, когда [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отказывает в вызове инструмента, включая когда он отказывает без вердикта классификатора, потому что [проверка безопасности, отдельная от auto mode, отказала в запросе классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не был проанализирован. Этот hook срабатывает только в режиме auto: он не запускается, когда вы вручную отказываете диалогу разрешений, когда hook `PreToolUse` блокирует вызов или когда совпадает правило `deny`. Используйте его для логирования отказов, корректировки конфигурации или сообщения модели, что она может повторить вызов инструмента.
1996 2380
1997Совпадает с именем инструмента, те же значения, что и PreToolUse.2381Совпадает с именем инструмента, те же значения, что и PreToolUse.
1998 2382
2000 PermissionDenied input2384 PermissionDenied input
2001</h4>2385</h4>
2002 2386
2003В дополнение к [общим полям входа](#common-input-fields), PermissionDenied hooks получают `tool_name`, `tool_input`, `tool_use_id` и `reason`.2387Помимо [common input fields](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).
2004 2388
2005```json theme={null}2389```json theme={null}
2006{2390{
2015 "description": "Clean build directory"2399 "description": "Clean build directory"
2016 },2400 },
2017 "tool_use_id": "toolu_01ABC123...",2401 "tool_use_id": "toolu_01ABC123...",
2018 "reason": "Auto mode denied: command targets a path outside the project"2402 "reason": "[Irreversible Local Destruction]"
2019}2403}
2020```2404```
2021 2405
2022| Поле | Описание |2406| Field | Description |
2023| :------- | :-------------------------------------------------------------------- |2407| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2024| `reason` | Объяснение классификатора того, почему вызов инструмента был отклонён |2408| `reason` | Причина отказа. Для вердикта классификатора в большинстве сеансов он называет совпадающее правило в квадратных скобках, такое как `[Data Exfiltration]`; см. [Review denials](/docs/ru/auto-mode-config#review-denials) для других форм. Для [no-verdict denial](#permissiondenied-decision-control) он начинается с `Auto mode could not evaluate this action and is blocking it for safety`. Для отказа, потому что модель классификатора была недоступна, это фиксированный текст `Classifier unavailable` |
2025 2409
2026<h4 id="permissiondenied-decision-control">2410<h4 id="permissiondenied-decision-control">
2027 PermissionDenied decision control2411 PermissionDenied decision control
2028</h4>2412</h4>
2029 2413
2030PermissionDenied hooks могут сообщить модели, что она может повторить попытку отклонённого вызова инструмента. Верните JSON объект с `hookSpecificOutput.retry`, установленным на `true`:2414Hooks PermissionDenied могут сказать модели, что она может повторить отклоненный вызов инструмента. Верните JSON объект с `hookSpecificOutput.retry`, установленным на `true`:
2031 2415
2032```json theme={null}2416```json theme={null}
2033{2417{
2038}2422}
2039```2423```
2040 2424
2041Когда `retry` равно `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить попытку вызова инструмента. Отказ сам по себе не отменяется. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остаётся и модель получает исходное сообщение об отклонении.2425Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить вызов инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.
2426
2427Claude Code игнорирует `retry: true`, когда классификатор создал [no verdict on the action](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от auto mode, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли позже или продолжить.
2042 2428
2043<h3 id="notification">2429<h3 id="notification">
2044 Notification2430 Notification
2045</h3>2431</h3>
2046 2432
2047Запускается при отправке Claude Code уведомлений. Совпадает с типом уведомления. Опустите фильтр для запуска hooks для всех типов уведомлений.2433Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.
2048 2434
2049| Фильтр | Когда он срабатывает |2435Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вы получаете оповещение, а не срабатывает ли ваш hook.
2050| :--------------------- | :------------------------------------------------------------------------------------------------------------------ |2436
2051| `permission_prompt` | Claude нуждается в одобрении использования инструмента |2437| Matcher | Когда срабатывает |
2052| `idle_prompt` | Claude завершил работу и ждёт вашей следующей подсказки |2438| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2439| `permission_prompt` | Claude нуждается в вашем разрешении на использование инструмента или [network request](/docs/ru/sandboxing#network-isolation) изолированной команды, и подсказка ждала около шести секунд |
2440| `idle_prompt` | Claude закончил отвечать около 60 секунд назад и вы не печатали с тех пор |
2053| `auth_success` | Аутентификация завершена |2441| `auth_success` | Аутентификация завершена |
2054| `elicitation_dialog` | MCP сервер открывает форму запроса |2442| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |
2055| `elicitation_complete` | Форма запроса MCP отправлена или отклонена |2443| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |
2056| `elicitation_response` | Ответ на запрос MCP отправлен обратно на сервер |2444| `elicitation_complete` | Сервер MCP сообщает, что [URL-mode elicitation](#elicitation-input) завершена |
2057| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода. Срабатывает только при открытом [agent view](/docs/ru/agent-view) в терминале |2445| `elicitation_response` | Ответ на запрос MCP отправляется обратно на сервер |
2058| `agent_completed` | Фоновый сеанс завершается или не удаётся. Срабатывает только при открытом [agent view](/docs/ru/agent-view) в терминале |2446| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале, или текущий сеанс просит вас вопрос [agent team](/docs/ru/agent-teams) товарища по команде и вы не печатали около шести секунд |
2447| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |
2448| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление вашего плана или переключение моделей, снова делает использование доступным |
2449| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter` вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |
2450| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил самостоятельно, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |
2059 2451
2060Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.2452Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.
2061 2453
2062Используйте отдельные фильтры для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:2454Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или позже.
2455
2456В сеансах терминала, `permission_prompt` для [network request](/docs/ru/sandboxing#network-isolation) изолированной команды требует Claude Code v2.1.246 или позже.
2457
2458`agent_needs_input` для вопроса настройки терминала товарища по команде требует Claude Code v2.1.248 или позже.
2459
2460<Note>
2461 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:
2462
2463 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте [PermissionRequest](#permissionrequest) вместо этого.
2464 * Ожидайте `idle_prompt` около 60 секунд после того, как Claude закончит отвечать, и только если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается самостоятельно, один из типов `quota_auto_resume_*` срабатывает вместо этого.
2465 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один и тот же шестисекундный шлюз как `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.
2466
2467 Запрос разрешения или запрос, который приходит, пока другой диалог находится на экране, сохраняет один и тот же шестисекундный шлюз, рассчитанный с момента прихода запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.
2468</Note>
2469
2470Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback Agent SDK [`canUseTool`](/docs/ru/agent-sdk/user-input), что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:
2471
2472* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.
2473* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2474* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) на `1` для отключения `permission_prompt` в этих сеансах.
2475
2476До версии 2.1.233, `permission_prompt` не срабатывал в этих сеансах.
2477
2478Используйте отдельные matchers для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:
2063 2479
2064```json theme={null}2480```json theme={null}
2065{2481{
2092 Notification input2508 Notification input
2093</h4>2509</h4>
2094 2510
2095В дополнение к [общим полям входа](#common-input-fields), Notification hooks получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип сработал.2511Помимо [common input fields](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.
2096 2512
2097```json theme={null}2513```json theme={null}
2098{2514{
2106}2522}
2107```2523```
2108 2524
2109Notification hooks не могут блокировать или изменять уведомления. Они предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис. [Общие JSON поля выхода](#json-output) такие как `systemMessage` применяются.2525Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которое полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис.
2110 2526
2111<h3 id="subagentstart">2527<h3 id="subagentstart">
2112 SubagentStart2528 SubagentStart
2113</h3>2529</h3>
2114 2530
2115Запускается при порождении Claude Code subagent через инструмент Agent. Поддерживает фильтры для фильтрации по имени типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [пользовательских subagents](/docs/ru/sub-agents), это поле `name` из frontmatter агента, а не имя файла.2531Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ по команде [agent team](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по имени типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [custom subagents](/docs/ru/sub-agents), это поле `name` из frontmatter агента, а не имя файла.
2116 2532
2117Для subagents, поставляемых [плагином](/docs/ru/plugins), тип агента — это идентификатор, ограниченный плагином, такой как `my-plugin:reviewer`, а не простое имя frontmatter. Двоеточие помещает имя, ограниченное плагином, на путь регулярного выражения, поэтому закрепите фильтр с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.2533Для подагентов, поставляемых [plugin](/docs/ru/plugins), тип агента — это идентификатор с областью действия plugin, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью действия plugin на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.
2118 2534
2119<h4 id="subagentstart-input">2535<h4 id="subagentstart-input">
2120 SubagentStart input2536 SubagentStart input
2121</h4>2537</h4>
2122 2538
2123В дополнение к [общим полям входа](#common-input-fields), SubagentStart hooks получают `agent_id` с уникальным идентификатором для subagent и `agent_type` с именем агента, которое фильтр использует для фильтрации.2539Помимо [common input fields](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором для подагента и `agent_type` с именем агента, который matcher фильтрует.
2124 2540
2125```json theme={null}2541```json theme={null}
2126{2542{
2133}2549}
2134```2550```
2135 2551
2136SubagentStart hooks не могут блокировать создание subagent, но они могут внедрить контекст в subagent. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, вы можете вернуть:2552Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть:
2137 2553
2138| Поле | Описание |2554| Field | Description |
2139| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------- |2555| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------- |
2140| `additionalContext` | Строка, добавленная в контекст subagent в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |2556| `additionalContext` | Строка, добавленная в контекст подагента в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |
2141 2557
2142```json theme={null}2558```json theme={null}
2143{2559{
2148}2564}
2149```2565```
2150 2566
2567Когда hook запускается снова для того же подагента, Claude Code внедряет возвращенный контекст только, когда контекст подагента уже не содержит копию из более раннего запуска. Копия, внедренная при запуске, остается на месте, оставляя [prompt cache](/docs/ru/prompt-caching#subagents-and-the-cache) подагента нетронутым. После [auto-compaction](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code внедряет контекст следующего запуска снова.
2568
2151<h3 id="subagentstop">2569<h3 id="subagentstop">
2152 SubagentStop2570 SubagentStop
2153</h3>2571</h3>
2154 2572
2155Запускается при завершении ответа Claude Code subagent. Совпадает с типом агента, те же значения, что и SubagentStart.2573Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.
2156 2574
2157<h4 id="subagentstop-input">2575<h4 id="subagentstop-input">
2158 SubagentStop input2576 SubagentStop input
2159</h4>2577</h4>
2160 2578
2161В дополнение к [общим полям входа](#common-input-fields), SubagentStop hooks получают `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` и `last_assistant_message`. Поле `agent_type` — это значение, используемое для фильтрации фильтра. `transcript_path` — это транскрипт основного сеанса, в то время как `agent_transcript_path` — это собственный транскрипт subagent, хранящийся в вложенной папке `subagents/`. Поле `last_assistant_message` содержит текстовое содержимое финального ответа subagent, поэтому hooks могут получить к нему доступ без анализа файла транскрипта.2579Помимо [common input fields](#common-input-fields), hooks SubagentStop получают `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` и `last_assistant_message`. Поле `agent_type` — это значение, используемое для фильтрации matcher. `transcript_path` — это транскрипт основного сеанса, в то время как `agent_transcript_path` — это собственный транскрипт подагента, хранящийся в вложенной папке `subagents/`. Поле `last_assistant_message` содержит текстовое содержимое финального ответа подагента, поэтому hooks могут получить доступ к нему без анализа файла транскрипта.
2162 2580
2163SubagentStop hooks также получают массивы `background_tasks` и `session_crons`, описанные в разделе [Stop input](#stop-input), доступные в Claude Code v2.1.145 или позже. Оба массива ограничены родительским сеансом, а не subagent.2581На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, совпадающий на `SubagentHandback`, получает как `tool_input.message`.
2582
2583Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.
2164 2584
2165```json theme={null}2585```json theme={null}
2166{2586{
2179}2599}
2180```2600```
2181 2601
2182SubagentStop hooks используют тот же формат управления решением, что и [Stop hooks](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для ненаправленной обратной связи, которая держит subagent работающим. Возврат `decision: "block"` с `reason` держит subagent работающим и доставляет `reason` subagent как его следующую инструкцию. Чтобы внедрить контекст в родительский сеанс после возврата subagent, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.2602Hooks SubagentStop используют тот же формат управления решением, что и [Stop hooks](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.
2183 2603
2184<h3 id="taskcreated">2604<h3 id="taskcreated">
2185 TaskCreated2605 TaskCreated
2186</h3>2606</h3>
2187 2607
2188Запускается при создании задачи через инструмент `TaskCreate`. Используйте это для обеспечения соглашений об именовании, требования описаний задач или предотвращения создания определённых задач.2608Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для применения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability), это событие не срабатывает.
2189 2609
2190Когда hook `TaskCreated` выходит с кодом 2, задача не создаётся и сообщение stderr передаётся обратно модели как обратная связь. Чтобы полностью остановить товарища вместо его повторного запуска, верните JSON с `{"continue": false, "stopReason": "..."}`. TaskCreated hooks не поддерживают фильтры и срабатывают при каждом вхождении.2610Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.
2191 2611
2192<h4 id="taskcreated-input">2612<h4 id="taskcreated-input">
2193 TaskCreated input2613 TaskCreated input
2194</h4>2614</h4>
2195 2615
2196В дополнение к [общим полям входа](#common-input-fields), TaskCreated hooks получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2616Помимо [common input fields](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2197 2617
2198```json theme={null}2618```json theme={null}
2199{2619{
2200 "session_id": "abc123",2620 "session_id": "abc123",
2201 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",2621 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
2202 "cwd": "/Users/...",2622 "cwd": "/Users/...",
2203 "permission_mode": "default",
2204 "hook_event_name": "TaskCreated",2623 "hook_event_name": "TaskCreated",
2205 "task_id": "task-001",2624 "task_id": "task-001",
2206 "task_subject": "Implement user authentication",2625 "task_subject": "Implement user authentication",
2210}2629}
2211```2630```
2212 2631
2213| Поле | Описание |2632| Field | Description |
2214| :----------------- | :----------------------------------------------------------------- |2633| :----------------- | :--------------------------------------------------------------------------- |
2215| `task_id` | Идентификатор создаваемой задачи |2634| `task_id` | Идентификатор создаваемой задачи |
2216| `task_subject` | Название задачи |2635| `task_subject` | Название задачи |
2217| `task_description` | Подробное описание задачи. Может отсутствовать |2636| `task_description` | Подробное описание задачи. Может быть отсутствующим |
2218| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |2637| `teammate_name` | Имя товарища по команде, создающего задачу. Может быть отсутствующим |
2219| `team_name` | Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2638| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2220 2639
2221<h4 id="taskcreated-decision-control">2640<h4 id="taskcreated-decision-control">
2222 TaskCreated decision control2641 TaskCreated decision control
2223</h4>2642</h4>
2224 2643
2225TaskCreated hooks поддерживают два способа управления созданием задачи:2644Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.
2226 2645
2227* **Exit code 2**: задача не создаётся и сообщение stderr передаётся обратно модели как обратная связь.2646* **Exit code 2**: Claude Code возвращает текст stderr как сообщение.
2228* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, соответствуя поведению hook `Stop`. `stopReason` показывается пользователю.2647* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` как сообщение.
2229 2648
2230Этот пример блокирует задачи, чьи названия не следуют требуемому формату:2649Этот пример блокирует задачи, чьи названия не следуют требуемому формату:
2231 2650
2246 TaskCompleted2665 TaskCompleted
2247</h3>2666</h3>
2248 2667
2249Запускается при отметке задачи как завершённой. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершённую через инструмент TaskUpdate, или когда товарищ [agent team](/docs/ru/agent-teams) завершает свой ход с незавершёнными задачами. Используйте это для обеспечения критериев завершения, таких как прохождение тестов или проверок линтинга перед закрытием задачи.2668Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ по команде [agent team](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для применения критериев завершения, таких как прохождение тестов или проверок lint, перед закрытием задачи.
2250 2669
2251Когда hook `TaskCompleted` выходит с кодом 2, задача не отмечается как завершённая и сообщение stderr передаётся обратно модели как обратная связь. Чтобы полностью остановить товарища вместо его повторного запуска, верните JSON с `{"continue": false, "stopReason": "..."}`. TaskCompleted hooks не поддерживают фильтры и срабатывают при каждом вхождении.2670Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.
2252 2671
2253<h4 id="taskcompleted-input">2672<h4 id="taskcompleted-input">
2254 TaskCompleted input2673 TaskCompleted input
2255</h4>2674</h4>
2256 2675
2257В дополнение к [общим полям входа](#common-input-fields), TaskCompleted hooks получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2676Помимо [common input fields](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2258 2677
2259```json theme={null}2678```json theme={null}
2260{2679{
2271}2690}
2272```2691```
2273 2692
2274| Поле | Описание |2693| Field | Description |
2275| :----------------- | :----------------------------------------------------------------- |2694| :----------------- | :--------------------------------------------------------------------------- |
2276| `task_id` | Идентификатор завершаемой задачи |2695| `task_id` | Идентификатор завершаемой задачи |
2277| `task_subject` | Название задачи |2696| `task_subject` | Название задачи |
2278| `task_description` | Подробное описание задачи. Может отсутствовать |2697| `task_description` | Подробное описание задачи. Может быть отсутствующим |
2279| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |2698| `teammate_name` | Имя товарища по команде, завершающего задачу. Может быть отсутствующим |
2280| `team_name` | Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2699| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2281 2700
2282<h4 id="taskcompleted-decision-control">2701<h4 id="taskcompleted-decision-control">
2283 TaskCompleted decision control2702 TaskCompleted decision control
2284</h4>2703</h4>
2285 2704
2286TaskCompleted hooks поддерживают два способа управления завершением задачи:2705Hooks TaskCompleted поддерживают два способа управления завершением задачи:
2287 2706
2288* **Exit code 2**: задача не отмечается как завершённая и сообщение stderr передаётся обратно модели как обратная связь.2707* **Exit code 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.
2289* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, соответствуя поведению hook `Stop`. `stopReason` показывается пользователю.2708* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие запустил товарищ по команде, завершающий свой ход, полностью останавливает товарища по команде, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда событие запустил инструмент `TaskUpdate`, Claude Code игнорирует `continue: false`; выход 2 все еще блокирует завершение.
2290 2709
2291Этот пример запускает тесты и блокирует завершение задачи, если они не пройдены:2710Этот пример запускает тесты и блокирует завершение задачи, если они не проходят:
2292 2711
2293```bash theme={null}2712```bash theme={null}
2294#!/bin/bash2713#!/bin/bash
2308 Stop2727 Stop
2309</h3>2728</h3>
2310 2729
2311Запускается при завершении ответа основного агента Claude Code. Не запускается, если остановка произошла из-за прерывания пользователя. Ошибки API срабатывают [StopFailure](#stopfailure) вместо этого.2730Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API срабатывают [StopFailure](#stopfailure) вместо этого.
2312 2731
2313<Tip>2732<Tip>
2314 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для stop hook, ограниченного сеансом на основе подсказки. Используйте её, когда вы хотите, чтобы Claude продолжал работать до выполнения условия без написания конфигурации hook.2733 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью действия сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.
2315</Tip>2734</Tip>
2316 2735
2317<h4 id="stop-input">2736<h4 id="stop-input">
2318 Stop input2737 Stop input
2319</h4>2738</h4>
2320 2739
2321В дополнение к [общим полям входа](#common-input-fields), Stop hooks получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` равно `true`, когда Claude Code уже продолжает в результате stop hook. Проверьте это значение или обработайте транскрипт, чтобы предотвратить блокировку на условии, которое никогда не разрешится. Claude Code переопределяет hook и заканчивает ход после 8 последовательных блокировок.2740Помимо [common input fields](#common-input-fields), hooks Stop получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` имеет значение `true`, когда Claude Code уже продолжает в результате hook stop. Проверьте это значение или обработайте транскрипт, чтобы избежать блокирования на условии, которое никогда не разрешится. Claude Code переопределяет hook и заканчивает ход после 8 последовательных блокировок.
2322 2741
2323Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить к нему доступ без анализа файла транскрипта. Для hooks, которые действуют на только что завершённый ход, такие как hooks для чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантирует включение финального сообщения в момент Stop на всех версиях.2742Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантируется включать финальное сообщение в момент Stop на всех версиях.
2324 2743
2325Массивы `background_tasks` и `session_crons`, доступные в Claude Code v2.1.145 или позже, позволяют hooks различать "сеанс завершён" от "сеанс приостановлен в ожидании фоновой работы для его пробуждения". Оба массива присутствуют, когда реестр задач доступен, и пусты, когда ничего не выполняется или не запланировано.2744Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен в ожидании фоновой работы для пробуждения его обратно". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.
2326 2745
2327Каждая запись в `background_tasks` описывает одну выполняемую задачу и использует эти поля:2746Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:
2328 2747
2329| Поле | Описание |2748| Field | Description |
2330| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2749| :------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2331| `id` | Идентификатор задачи |2750| `id` | Идентификатор задачи |
2332| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |2751| `type` | Дружественный label типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый label определяет, какая функция Claude Code создала задачу. Возвращается к сырому дискриминанту для неизвестных типов |
2333| `status` | Текущий статус задачи |2752| `status` | Текущий статус задачи |
2334| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезке |2753| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезании |
2335| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |2754| `command` | Командная строка shell, ограниченная 1000 символами. Присутствует только для задач `shell` |
2336| `agent_type` | Имя типа subagent. Присутствует только для задач `subagent` |2755| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |
2337| `server` | Имя MCP сервера. Присутствует только для задач `monitor` и `MCP task` |2756| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |
2338| `tool` | Имя MCP инструмента. Присутствует только для задач `monitor` и `MCP task` |2757| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |
2339| `name` | Имя workflow. Присутствует только для задач `workflow` |2758| `name` | Имя workflow. Присутствует только для задач `workflow` |
2340 2759
2341Каждая запись в `session_crons` описывает одно запланированное пробуждение, ограниченное сеансом, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:2760Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью действия сеанса, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:
2342 2761
2343| Поле | Описание |2762| Field | Description |
2344| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |2763| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |
2345| `id` | Идентификатор cron задачи |2764| `id` | Идентификатор задачи Cron |
2346| `schedule` | Выражение cron, например `0 9 * * 1-5` |2765| `schedule` | Выражение Cron, например `0 9 * * 1-5` |
2347| `recurring` | `false` для одноразовых пробуждений, чьё расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |2766| `recurring` | `false` для одноразовых пробуждений, чье расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |
2348| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |2767| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |
2349 2768
2350Этот пример показывает Stop input с одной выполняемой shell задачей и одним повторяющимся cron:2769Этот пример показывает ввод Stop с одной выполняющейся задачей shell и одним повторяющимся cron:
2351 2770
2352```json theme={null}2771```json theme={null}
2353{2772{
2382 Stop decision control2801 Stop decision control
2383</h4>2802</h4>
2384 2803
2385Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2804Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2386 2805
2387| Поле | Описание |2806| Field | Description |
2388| :------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2807| :------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2389| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы разрешить Claude остановиться |2808| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |
2390| `reason` | Требуется при `decision` равном `"block"`. Говорит Claude, почему оно должно продолжить |2809| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |
2391| `hookSpecificOutput.additionalContext` | Ненаправленная обратная связь для Claude. Разговор продолжается, чтобы Claude мог действовать на основе этого, но в отличие от `decision: "block"` это показывается в транскрипте как обратная связь hook, а не ошибка hook |2810| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на нее, но в отличие от `decision: "block"`, она показана в транскрипте как обратная связь hook, а не ошибка hook |
2811
2812Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.
2392 2813
2393```json theme={null}2814```json theme={null}
2394{2815{
2397}2818}
2398```2819```
2399 2820
2400Используйте `additionalContext`, когда hook работает как задумано и даёт Claude руководство, такое как "запустите набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно вход `stop_hook_active` и ограничение 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и уведомление об ошибке hook не показывается:2821Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и никакое уведомление об ошибке hook не показывается:
2401 2822
2402```json theme={null}2823```json theme={null}
2403{2824{
2412 StopFailure2833 StopFailure
2413</h3>2834</h3>
2414 2835
2415Запускается вместо [Stop](#stop) когда ход заканчивается из-за ошибки API. Выход и код выхода игнорируются. Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.2836Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.
2416 2837
2417<h4 id="stopfailure-input">2838<h4 id="stopfailure-input">
2418 StopFailure input2839 StopFailure input
2419</h4>2840</h4>
2420 2841
2421В дополнение к [общим полям входа](#common-input-fields), StopFailure hooks получают `error`, опциональные `error_details` и `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации фильтра.2842Помимо [common input fields](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.
2422 2843
2423| Поле | Описание |2844| Field | Description |
2424| :----------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2845| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2425| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens` или `unknown` |2846| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |
2426| `error_details` | Дополнительные детали об ошибке, когда доступны |2847| `error_details` | Дополнительные детали об ошибке, когда доступны |
2427| `last_assistant_message` | Отрендеренный текст ошибки, показанный в разговоре. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный выход Claude, для `StopFailure` оно содержит строку ошибки API, такую как `"API Error: Rate limit reached"` |2848| `last_assistant_message` | Отображаемый текст ошибки, показанный в разговоре. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит строку ошибки API, такую как `"API Error: Rate limit reached"` |
2428 2849
2429```json theme={null}2850```json theme={null}
2430{2851{
2438}2859}
2439```2860```
2440 2861
2441StopFailure hooks не имеют управления решением. Они запускаются только в целях уведомления и логирования.2862Hooks StopFailure не имеют управления решением. Они запускаются только в целях уведомления и логирования.
2442 2863
2443<h3 id="teammateidle">2864<h3 id="teammateidle">
2444 TeammateIdle2865 TeammateIdle
2445</h3>2866</h3>
2446 2867
2447Запускается когда товарищ [agent team](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для обеспечения качественных ворот перед остановкой работы товарища, такие как требование прохождения проверок линтинга или проверка существования выходных файлов.2868Запускается, когда товарищ по команде [agent team](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для применения шлюзов качества перед остановкой товарища по команде, такие как требование прохождения проверок lint или проверка существования выходных файлов.
2448 2869
2449Когда hook `TeammateIdle` выходит с кодом 2, товарищ получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания. Чтобы полностью остановить товарища вместо его повторного запуска, верните JSON с `{"continue": false, "stopReason": "..."}`. TeammateIdle hooks не поддерживают фильтры и срабатывают при каждом вхождении.2870Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.
2450 2871
2451<h4 id="teammateidle-input">2872<h4 id="teammateidle-input">
2452 TeammateIdle input2873 TeammateIdle input
2453</h4>2874</h4>
2454 2875
2455В дополнение к [общим полям входа](#common-input-fields), TeammateIdle hooks получают `teammate_name` и `team_name`.2876Помимо [common input fields](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.
2456 2877
2457```json theme={null}2878```json theme={null}
2458{2879{
2466}2887}
2467```2888```
2468 2889
2469| Поле | Описание |2890| Field | Description |
2470| :-------------- | :----------------------------------------------------------------- |2891| :-------------- | :--------------------------------------------------------------------------- |
2471| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |2892| `teammate_name` | Имя товарища по команде, который собирается перейти в режим ожидания |
2472| `team_name` | Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2893| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2473 2894
2474<h4 id="teammateidle-decision-control">2895<h4 id="teammateidle-decision-control">
2475 TeammateIdle decision control2896 TeammateIdle decision control
2476</h4>2897</h4>
2477 2898
2478TeammateIdle hooks поддерживают два способа управления поведением товарища:2899Hooks TeammateIdle поддерживают два способа управления поведением товарища по команде:
2479 2900
2480* **Exit code 2**: товарищ получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.2901* **Exit code 2**: товарищ по команде получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.
2481* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, соответствуя поведению hook `Stop`. `stopReason` показывается пользователю.2902* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища по команде, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю.
2482 2903
2483Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу перейти в режим ожидания:2904Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу по команде перейти в режим ожидания:
2484 2905
2485```bash theme={null}2906```bash theme={null}
2486#!/bin/bash2907#!/bin/bash
2497 ConfigChange2918 ConfigChange
2498</h3>2919</h3>
2499 2920
2500Запускается при изменении файла конфигурации во время сеанса. Используйте это для аудита изменений настроек, обеспечения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.2921Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений настроек, применения политик безопасности или блокирования несанкционированных изменений файлов конфигурации.
2501 2922
2502ConfigChange hooks срабатывают для изменений файлов настроек, управляемых параметров политики и файлов skills. Поле `source` во входных данных говорит вам, какой тип конфигурации изменился, и опциональное поле `file_path` предоставляет путь к изменённому файлу.2923Claude Code запускает hooks ConfigChange, когда файл настроек, файл управляемой политики или файл skill изменяется. Для управляемой политики он запускает их только, когда `managed-settings.json` или файл в `managed-settings.d/` изменяется. Он применяет [server-managed settings](/docs/ru/server-managed-settings) и изменения в macOS управляемых предпочтениях или политике реестра Windows без запуска их. На WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings), он также применяет измененный файл управляемых настроек Windows на его опросе политики без запуска их.
2503 2924
2504Фильтр фильтрует по источнику конфигурации:2925Matcher фильтрует по источнику конфигурации:
2505 2926
2506| Фильтр | Когда он срабатывает |2927| Matcher | Когда срабатывает |
2507| :----------------- | :---------------------------------------- |2928| :----------------- | :------------------------------------------------------------------ |
2508| `user_settings` | `~/.claude/settings.json` изменяется |2929| `user_settings` | `~/.claude/settings.json` изменяется |
2509| `project_settings` | `.claude/settings.json` изменяется |2930| `project_settings` | `.claude/settings.json` изменяется |
2510| `local_settings` | `.claude/settings.local.json` изменяется |2931| `local_settings` | `.claude/settings.local.json` изменяется |
2511| `policy_settings` | Управляемые параметры политики изменяются |2932| `policy_settings` | `managed-settings.json` или файл в `managed-settings.d/` изменяется |
2512| `skills` | Файл skill в `.claude/skills/` изменяется |2933| `skills` | Файл skill в `.claude/skills/` изменяется |
2513 2934
2514Этот пример логирует все изменения конфигурации для аудита безопасности:2935Этот пример логирует все изменения конфигурации для аудита безопасности:
2535 ConfigChange input2956 ConfigChange input
2536</h4>2957</h4>
2537 2958
2538В дополнение к [общим полям входа](#common-input-fields), ConfigChange hooks получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному изменённому файлу.2959Помимо [common input fields](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.
2539 2960
2540```json theme={null}2961```json theme={null}
2541{2962{
2552 ConfigChange decision control2973 ConfigChange decision control
2553</h4>2974</h4>
2554 2975
2555ConfigChange hooks могут блокировать применение изменений конфигурации. Используйте exit code 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к запущенному сеансу.2976Hooks ConfigChange могут заблокировать изменения конфигурации от вступления в силу. Используйте выход 2 или JSON `decision` для предотвращения изменения. При блокировании новые настройки не применяются к работающему сеансу.
2556 2977
2557| Поле | Описание |2978| Field | Description |
2558| :--------- | :--------------------------------------------------------------------------------------------- |2979| :--------- | :--------------------------------------------------------------------------------------------- |
2559| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы разрешить изменение |2980| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы позволить изменению |
2560| `reason` | Объяснение, показываемое пользователю при `decision` равном `"block"` |2981| `reason` | Принято, но никогда не показано |
2561 2982
2562```json theme={null}2983```json theme={null}
2563{2984{
2566}2987}
2567```2988```
2568 2989
2569Изменения `policy_settings` не могут быть заблокированы. Hooks всё ещё срабатывают для источников `policy_settings`, поэтому вы можете использовать их для аудита логирования, но любое решение блокировки игнорируется. Это гарантирует, что управляемые предприятием параметры всегда вступают в силу.2990Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых настроек на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда [server-managed settings](/docs/ru/server-managed-settings) приходят или обновляются.
2991
2992Claude Code действует на решение блокировки из JSON вывода hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, независимо от того, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только пишет строку в debug log.
2570 2993
2571<h3 id="cwdchanged">2994<h3 id="cwdchanged">
2572 CwdChanged2995 CwdChanged
2573</h3>2996</h3>
2574 2997
2575Запускается при изменении рабочего каталога во время сеанса, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения каталога: перезагрузка переменных окружения, активация специфичных для проекта цепочек инструментов или автоматический запуск скриптов настройки. Объединяется с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждого каталога.2998Запускается, когда команда shell в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов, специфичных для проекта, или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.
2576 2999
2577CwdChanged hooks имеют доступ к `CLAUDE_ENV_FILE`. Переменные, написанные в этот файл, сохраняются в последующих командах Bash для сеанса, как и в [SessionStart hooks](#persist-environment-variables).3000Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code очищает их.
2578 3001
2579CwdChanged не поддерживает фильтры и срабатывает при каждом изменении каталога.3002CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.
2580 3003
2581<h4 id="cwdchanged-input">3004<h4 id="cwdchanged-input">
2582 CwdChanged input3005 CwdChanged input
2583</h4>3006</h4>
2584 3007
2585В дополнение к [общим полям входа](#common-input-fields), CwdChanged hooks получают `old_cwd` и `new_cwd`.3008Помимо [common input fields](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.
2586 3009
2587```json theme={null}3010```json theme={null}
2588{3011{
2599 CwdChanged output3022 CwdChanged output
2600</h4>3023</h4>
2601 3024
2602В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, CwdChanged hooks могут вернуть `watchPaths` для динамической установки, какие пути файлов [FileChanged](#filechanged) отслеживает:3025Помимо [JSON output fields](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) наблюдает:
2603 3026
2604| Поле | Описание |3027| Field | Description |
2605| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3028| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2606| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации `matcher` всегда отслеживаются. Возврат пустого массива очищает динамический список, что типично при входе в новый каталог |3029| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |
3030
3031Hooks CwdChanged не имеют управления решением. Они не могут заблокировать изменение директории.
3032
3033Claude Code читает `watchPaths` и `systemMessage` из их JSON вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
3034
3035<h3 id="directoryadded">
3036 DirectoryAdded
3037</h3>
3038
3039Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления SDK клиентом с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например установкой его зависимостей.
3040
3041Claude Code не срабатывает это событие, когда:
2607 3042
2608CwdChanged hooks не имеют управления решением. Они не могут блокировать изменение каталога.3043* Вы передаете директорию с флагом запуска `--add-dir`; [SessionStart](#sessionstart) охватывает эти директории
3044* Вы добавляете директорию на вкладку `/permissions` Workspace
3045* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной
3046
3047Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда выполняется ваш hook. Команды hook сами выполняются неизолированными.
3048
3049Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоне с стандартным timeout 600 секунд.
3050
3051Matcher фильтрует по тому, как была добавлена директория:
3052
3053| Matcher | Когда срабатывает |
3054| :------------------- | :------------------------------------------------------------------------- |
3055| `slash_command` | Вы добавляете директорию с `/add-dir` |
3056| `register_repo_root` | SDK клиент добавляет директорию с запросом управления `register_repo_root` |
3057
3058<h4 id="directoryadded-input">
3059 DirectoryAdded input
3060</h4>
3061
3062Помимо [common input fields](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.
3063
3064| Field | Description |
3065| :---------- | :-------------------------------------------------------------------------------------------------------------------- |
3066| `directory` | Абсолютный путь директории, которая была добавлена |
3067| `source` | Как была добавлена директория, `"slash_command"` для `/add-dir` или `"register_repo_root"` для запроса управления SDK |
3068
3069```json theme={null}
3070{
3071 "session_id": "abc123",
3072 "transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
3073 "cwd": "/Users/my-project",
3074 "hook_event_name": "DirectoryAdded",
3075 "directory": "/Users/my-other-repo",
3076 "source": "slash_command"
3077}
3078```
3079
3080Hooks DirectoryAdded не имеют управления решением. Они не могут заблокировать добавление, которое уже завершилось, когда выполняется hook. Claude Code отбрасывает поле `continue` из их JSON вывода и выводит остальное по-другому в зависимости от источника:
3081
3082* `slash_command`: Claude Code доставляет вывод `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log
3083* `register_repo_root`: Claude Code пишет вывод `systemMessage` и вывод сбоя в debug log только
2609 3084
2610<h3 id="filechanged">3085<h3 id="filechanged">
2611 FileChanged3086 FileChanged
2612</h3>3087</h3>
2613 3088
2614Запускается при изменении отслеживаемого файла на диске. Полезно для перезагрузки переменных окружения при изменении файлов конфигурации проекта.3089Запускается, когда наблюдаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code. Обычное использование — перезагрузка переменных окружения, когда изменяются файлы конфигурации проекта.
2615 3090
2616Поле `matcher` для этого события служит двум целям:3091`matcher` для этого события служит двум целям:
2617 3092
2618* **Построение списка наблюдения**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочем каталоге, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Regex шаблоны здесь не полезны: значение, такое как `^\.env`, отслеживало бы файл буквально названный `^\.env`.3093* **Build the watch list**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` наблюдает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, наблюдало бы файл буквально названный `^\.env`.
2619* **Фильтрация, какие hooks запускаются**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила фильтра](#matcher-patterns) против базового имени изменённого файла.3094* **Filter which hooks run**: когда наблюдаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [matcher rules](#matcher-patterns) против базового имени измененного файла.
2620 3095
2621FileChanged hooks имеют доступ к `CLAUDE_ENV_FILE`. Переменные, написанные в этот файл, сохраняются в последующих командах Bash для сеанса, как и в [SessionStart hooks](#persist-environment-variables).3096Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая вызов инструмента `Bash` или внешний скрипт, переписывающий файл:
3097
3098```json theme={null}
3099{
3100 "hooks": {
3101 "FileChanged": [
3102 {
3103 "matcher": "data.csv",
3104 "hooks": [
3105 {
3106 "type": "command",
3107 "command": "/path/to/normalize-line-endings.sh"
3108 }
3109 ]
3110 }
3111 ]
3112 }
3113}
3114```
3115
3116Hook читает абсолютный путь измененного файла из поля `file_path` [JSON input](#filechanged-input) на stdin. Его guard `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабый guard зацикливается навсегда, потому что `perl -i` переписывает файл даже когда он ничего не подставляет и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3117
3118```bash theme={null}
3119#!/bin/bash
3120FILE=$(jq -r .file_path)
3121if grep -q $'\r$' "$FILE"; then
3122 perl -pi -e 's/\r$//' "$FILE"
3123fi
3124```
3125
3126Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.
3127
3128Чтобы наблюдать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка наблюдения. Claude Code запускает наблюдатель только, когда что-то называет файл для наблюдения, поэтому посейте список с группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда наблюдаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым наблюдаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения, как любое другое значение, как буквальный файл названный `*`.
3129
3130Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code очищает их.
2622 3131
2623<h4 id="filechanged-input">3132<h4 id="filechanged-input">
2624 FileChanged input3133 FileChanged input
2625</h4>3134</h4>
2626 3135
2627В дополнение к [общим полям входа](#common-input-fields), FileChanged hooks получают `file_path` и `event`.3136Помимо [common input fields](#common-input-fields), hooks FileChanged получают `file_path` и `event`.
2628 3137
2629| Поле | Описание |3138| Field | Description |
2630| :---------- | :---------------------------------------------------------------------------------------------------------------- |3139| :---------- | :---------------------------------------------------------------------------------------------------------------- |
2631| `file_path` | Абсолютный путь к файлу, который изменился |3140| `file_path` | Абсолютный путь к файлу, который изменился |
2632| `event` | Что произошло: `"change"` для изменённого файла, `"add"` для созданного файла или `"unlink"` для удалённого файла |3141| `event` | Что произошло: `"change"` для измененного файла, `"add"` для созданного файла или `"unlink"` для удаленного файла |
2633 3142
2634```json theme={null}3143```json theme={null}
2635{3144{
2646 FileChanged output3155 FileChanged output
2647</h4>3156</h4>
2648 3157
2649В дополнение к [JSON полям выхода](#json-output), доступным для всех hooks, FileChanged hooks могут вернуть `watchPaths` для динамического обновления, какие пути файлов отслеживаются:3158Помимо [JSON output fields](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов наблюдаются:
2650 3159
2651| Поле | Описание |3160| Field | Description |
2652| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3161| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2653| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации `matcher` всегда отслеживаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для отслеживания на основе изменённого файла |3162| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для наблюдения на основе измененного файла |
3163
3164Hooks FileChanged не имеют управления решением. Они не могут заблокировать изменение файла от возникновения.
2654 3165
2655FileChanged hooks не имеют управления решением. Они не могут блокировать изменение файла от возникновения.3166Claude Code читает `watchPaths` и `systemMessage` из их JSON вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
2656 3167
2657<h3 id="worktreecreate">3168<h3 id="worktreecreate">
2658 WorktreeCreate3169 WorktreeCreate
2659</h3>3170</h3>
2660 3171
2661Запускается при создании worktree, либо из `claude --worktree`, либо из [subagent, использующего `isolation: "worktree"`](/docs/ru/sub-agents#choose-the-subagent-scope). По умолчанию Claude Code создаёт изолированную рабочую копию с помощью `git worktree`. Настройка hook WorktreeCreate заменяет это поведение git по умолчанию, позволяя вам использовать другую систему контроля версий, такую как SVN, Perforce или Mercurial.3172Запускается, когда создается worktree, будь то из `claude --worktree`, из [subagent using `isolation: "worktree"`](/docs/ru/sub-agents#choose-the-subagent-scope) или для [background session](/docs/ru/agent-view#how-file-edits-are-isolated), которую Claude Code изолирует в своем собственном worktree. По умолчанию Claude Code создает изолированную рабочую копию с `git worktree`. Настройка hook WorktreeCreate заменяет это поведение git по умолчанию, позволяя вам использовать другую систему контроля версий, такую как SVN, Perforce или Mercurial.
3173
3174Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.
2662 3175
2663Потому что hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.3176Hook должен вернуть путь к созданной директории worktree. Claude Code использует этот путь как рабочую директорию для изолированного сеанса. См. [WorktreeCreate output](#worktreecreate-output) для того, как каждый тип hook возвращает путь.
2664 3177
2665Hook должен вернуть путь к созданному worktree каталогу. Claude Code использует этот путь как рабочий каталог для изолированного сеанса. См. [WorktreeCreate output](#worktreecreate-output) для того, как каждый тип hook возвращает путь.3178Claude Code действует на успех hook и возвращенный путь и отбрасывает `systemMessage` и `continue`.
2666 3179
2667Этот пример создаёт рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой:3180Этот пример создает рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой собственный:
2668 3181
2669```json theme={null}3182```json theme={null}
2670{3183{
2683}3196}
2684```3197```
2685 3198
2686Hook читает имя worktree `name` из JSON входа на stdin, проверяет свежую копию в новый каталог и выводит путь каталога. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой выход на stderr, чтобы он не мешал пути.3199Hook читает имя worktree `name` из JSON ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.
2687 3200
2688<h4 id="worktreecreate-input">3201<h4 id="worktreecreate-input">
2689 WorktreeCreate input3202 WorktreeCreate input
2690</h4>3203</h4>
2691 3204
2692В дополнение к [общим полям входа](#common-input-fields), WorktreeCreate hooks получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.3205Помимо [common input fields](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.
2693 3206
2694```json theme={null}3207```json theme={null}
2695{3208{
2705 WorktreeCreate output3218 WorktreeCreate output
2706</h4>3219</h4>
2707 3220
2708WorktreeCreate hooks не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданному worktree каталогу:3221Hooks WorktreeCreate не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:
2709 3222
2710* **Command hooks** (`type: "command"`): выводят путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой выход hook на stderr.3223* **Command hooks** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска shell, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.
2711* **HTTP hooks** (`type: "http"`): возвращают `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3224* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
2712 3225
2713Если hook не удаётся или не производит путь, создание worktree не удаётся с ошибкой.3226Если hook не удается или не создает путь, создание worktree не удается с ошибкой.
2714 3227
2715Claude Code разрешает относительный путь против каталога, в котором запустился hook. Если результирующий путь не является каталогом, который Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1. До v2.1.205 относительный путь или путь, который не существовал на диске, вызывал сбой сеанса при запуске, и с `-p` он зависал примерно на 30 секунд перед выходом с кодом 0.3228Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1.
3229
3230Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через symlink ниже корня репозитория, потому что symlink, зафиксированный в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через symlink внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.
2716 3231
2717<h3 id="worktreeremove">3232<h3 id="worktreeremove">
2718 WorktreeRemove3233 WorktreeRemove
2719</h3>3234</h3>
2720 3235
2721Запускается при удалении worktree, либо при выходе из сеанса `--worktree` и выборе его удаления, либо при завершении subagent с `isolation: "worktree"`. Это аналог очистки для [WorktreeCreate](#worktreecreate).3236Запускается, когда worktree удаляется. Это очистка, соответствующая [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:
3237
3238* вы выходите из сеанса `--worktree` и выбираете его удаление
3239* подагент с `isolation: "worktree"` завершается
3240* вы удаляете [background session](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook
3241
3242Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate для системы контроля версий, не основанной на git, соедините его с hook WorktreeRemove для обработки очистки. Без него директория worktree остается на диске.
3243
3244Claude Code отбрасывает [JSON output fields](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.
2722 3245
2723Для git-based worktrees Claude Code обрабатывает очистку автоматически с помощью `git worktree remove`. Если вы настроили hook WorktreeCreate для системы контроля версий, не основанной на git, объедините его с hook WorktreeRemove для обработки очистки. Без него каталог worktree остаётся на диске.3246Для удаления сеанса фонового плана Claude Code проверяет сохраненный путь worktree перед запуском hook и отказывает пути, который является symlink или проходит через один ниже корня репозитория. Hook запускается для worktree, который все еще содержит файлы только, когда вы подтверждаете удаление в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes); для такого worktree, [`claude rm`](/docs/ru/agent-view#manage-sessions-from-the-shell) сохраняет сеанс и worktree вместо этого. До версии 2.1.216 hook запускался на сохраненном пути без этих проверок.
2724 3247
2725Claude Code передаёт путь, который WorktreeCreate вывел на stdout, как `worktree_path` во входных данных hook. Этот пример читает этот путь и удаляет каталог:3248Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:
2726 3249
2727```json theme={null}3250```json theme={null}
2728{3251{
2745 WorktreeRemove input3268 WorktreeRemove input
2746</h4>3269</h4>
2747 3270
2748В дополнение к [общим полям входа](#common-input-fields), WorktreeRemove hooks получают поле `worktree_path`, которое является абсолютным путём к удаляемому worktree.3271Помимо [common input fields](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.
2749 3272
2750```json theme={null}3273```json theme={null}
2751{3274{
2757}3280}
2758```3281```
2759 3282
2760WorktreeRemove hooks не имеют управления решением. Они не могут блокировать удаление worktree, но мог выполнять задачи очистки, такие как удаление состояния контроля версий или архивирование изменений. Сбои hook логируются только в режиме отладки.3283Код выхода hook WorktreeRemove определяет результат. Когда hook выходит с ненулевым кодом и директория в `worktree_path` все еще существует после этого, удаление не удается:
3284
3285* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).
3286* Если вы удаляли фоновый сеанс, сеанс также остается. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удаляет ли удаление сеанса снова директорию в любом случае.
2761 3287
2762<h3 id="precompact">3288<h3 id="precompact">
2763 PreCompact3289 PreCompact
2764</h3>3290</h3>
2765 3291
2766Запускается перед тем, как Claude Code собирается запустить операцию компактирования.3292Запускается перед тем, как Claude Code собирается запустить операцию compact.
2767 3293
2768Значение фильтра указывает, было ли компактирование запущено вручную или автоматически:3294Значение matcher указывает, было ли сжатие запущено вручную или автоматически:
2769 3295
2770| Фильтр | Когда он срабатывает |3296| Matcher | Когда срабатывает |
2771| :------- | :-------------------------------------------------------------- |3297| :------- | :--------------------------------------------------------------------------------------------------------- |
2772| `manual` | `/compact` |3298| `manual` | `/compact` |
2773| `auto` | Автоматическое компактирование при заполнении контекстного окна |3299| `auto` | Auto-compact, когда разговор достигает [auto-compact window](/docs/ru/model-config#set-the-auto-compact-window) |
3300
3301Выход с кодом 2 для блокирования сжатия. Для ручного `/compact`, сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.
2774 3302
2775Exit code 2 блокирует компактирование. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.3303Блокирование автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено упреждающе перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.
2776 3304
2777Блокировка автоматического компактирования имеет разные эффекты в зависимости от того, когда оно срабатывает. Если компактирование было запущено проактивно перед лимитом контекста, Claude Code пропускает его и разговор продолжается некомпактированным. Если компактирование было запущено для восстановления от ошибки лимита контекста, уже возвращённой API, основная ошибка выходит на поверхность и текущий запрос не удаётся.3305Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.
2778 3306
2779<h4 id="precompact-input">3307<h4 id="precompact-input">
2780 PreCompact input3308 PreCompact input
2781</h4>3309</h4>
2782 3310
2783В дополнение к [общим полям входа](#common-input-fields), PreCompact hooks получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передаёт в `/compact`. Для `auto`, `custom_instructions` пусто.3311Помимо [common input fields](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и имеет значение `null`, когда они ничего не передают. Для `auto`, `custom_instructions` имеет значение `null`.
2784 3312
2785```json theme={null}3313```json theme={null}
2786{3314{
2789 "cwd": "/Users/...",3317 "cwd": "/Users/...",
2790 "hook_event_name": "PreCompact",3318 "hook_event_name": "PreCompact",
2791 "trigger": "manual",3319 "trigger": "manual",
2792 "custom_instructions": ""3320 "custom_instructions": null
2793}3321}
2794```3322```
2795 3323
2797 PostCompact3325 PostCompact
2798</h3>3326</h3>
2799 3327
2800Запускается после завершения Claude Code операции компактирования. Используйте это событие для реакции на новое компактирован состояние, например для логирования сгенерированного резюме или обновления внешнего состояния.3328Запускается после завершения операции compact Claude Code. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированной сводки или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.
2801 3329
2802Те же значения фильтра применяются как для `PreCompact`:3330Те же значения matcher применяются, как для `PreCompact`:
2803 3331
2804| Фильтр | Когда он срабатывает |3332| Matcher | Когда срабатывает |
2805| :------- | :--------------------------------------------------------------------- |3333| :------- | :--------------------------------------------------------------------------------------------------------------- |
2806| `manual` | После `/compact` |3334| `manual` | После `/compact` |
2807| `auto` | После автоматического компактирования при заполнении контекстного окна |3335| `auto` | После auto-compact, когда разговор достигает [auto-compact window](/docs/ru/model-config#set-the-auto-compact-window) |
2808 3336
2809<h4 id="postcompact-input">3337<h4 id="postcompact-input">
2810 PostCompact input3338 PostCompact input
2811</h4>3339</h4>
2812 3340
2813В дополнение к [общим полям входа](#common-input-fields), PostCompact hooks получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией компактирования.3341Помимо [common input fields](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку разговора, сгенерированную операцией compact.
2814 3342
2815```json theme={null}3343```json theme={null}
2816{3344{
2823}3351}
2824```3352```
2825 3353
2826PostCompact hooks не имеют управления решением. Они не могут влиять на результат компактирования, но могут выполнять последующие задачи.3354Hooks PostCompact не имеют управления решением. Они не могут влиять на результат сжатия, но могут выполнять последующие задачи.
3355
3356<h3 id="premodelswitch">
3357 PreModelSwitch
3358</h3>
3359
3360Запускается перед применением переключения модели, которое вы или клиент запросили. Используйте это для блокирования переключения, требования подтверждения или показа стоимости переключения перед его выполнением.
3361
3362PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:
3363
3364* `/model <name>` и средство выбора `/model`
3365* Средство выбора модели `Option+P` или `Alt+P`
3366* Параметр Model в `/config`
3367* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса
3368* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3369
3370Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает самостоятельно, такие как [automatic model fallback](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.
3371
3372Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Alias, такой как `opus`, датированный ID модели и ID, специфичный для поставщика, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.
3373
3374Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из своего ввода, а не полагаться только на matcher.
3375
3376Напишите matcher как точное имя, список, разделенный `|`, такой как `claude-opus-4-6|claude-opus-5`, или регулярное выражение, такое как `.*opus.*`. Этот пример использует matcher точного имени и также проверяет `to_model` из ввода hook, поэтому он отказывает переключению на Opus 4.6 выходом 2 и позволяет любой другой цели пройти:
3377
3378<Tabs>
3379 <Tab title="macOS/Linux">
3380 Команда проверяет `to_model` с `jq`:
3381
3382 ```json theme={null}
3383 {
3384 "hooks": {
3385 "PreModelSwitch": [
3386 {
3387 "matcher": "claude-opus-4-6",
3388 "hooks": [
3389 {
3390 "type": "command",
3391 "command": "jq -e '.to_model | test(\"opus-4-6\")' > /dev/null && { echo 'Opus 4.6 is retired for this project. Use a newer model.' >&2; exit 2; }; exit 0"
3392 }
3393 ]
3394 }
3395 ]
3396 }
3397 }
3398 ```
3399 </Tab>
3400
3401 <Tab title="Windows (PowerShell)">
3402 Зарегистрируйте command hook, который запускает скрипт через PowerShell:
3403
3404 ```json theme={null}
3405 {
3406 "hooks": {
3407 "PreModelSwitch": [
3408 {
3409 "matcher": "claude-opus-4-6",
3410 "hooks": [
3411 {
3412 "type": "command",
3413 "command": "powershell.exe",
3414 "args": [
3415 "-NoProfile",
3416 "-ExecutionPolicy",
3417 "Bypass",
3418 "-File",
3419 "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-opus-46.ps1"
3420 ]
3421 }
3422 ]
3423 }
3424 ]
3425 }
3426 }
3427 ```
3428
3429 Сохраните этот скрипт в `.claude/hooks/block-opus-46.ps1` в вашем проекте:
3430
3431 ```powershell theme={null}
3432 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3433 if ($hookInput.to_model -match 'opus-4-6') {
3434 [Console]::Error.WriteLine('Opus 4.6 is retired for this project. Use a newer model.')
3435 exit 2
3436 }
3437 exit 0
3438 ```
3439 </Tab>
3440</Tabs>
3441
3442Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, работающего на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.
3443
3444<h4 id="premodelswitch-input">
3445 PreModelSwitch input
3446</h4>
3447
3448Помимо [common input fields](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что стоит повторная отправка разговора на новую модель, поэтому hook может показать эту цифру перед переключением.
3449
3450| Field | Type | Description |
3451| :-------------------------- | :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3452| `from_model` | string | ID модели, на которую переключается |
3453| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |
3454| `requested_model` | string or `null` | Модель, которую назвал запрос: alias, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |
3455| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3456| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш чтения, кэш создания и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |
3457| `prompt_cache_warm` | boolean | Вероятно ли, что кэш подсказок текущей модели все еще теплый, означая, что переключение его теряет |
3458| `cache_ttl` | string | [Prompt cache lifetime](/docs/ru/prompt-caching#cache-lifetime), который Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |
3459| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` при скорости `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |
3460| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по вашим собственным ставкам организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил стандартную ставку |
3461
3462Этот пример показывает ввод для `/model opus` в сеансе, работающем на Sonnet 5:
3463
3464```json theme={null}
3465{
3466 "session_id": "abc123",
3467 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
3468 "cwd": "/Users/...",
3469 "hook_event_name": "PreModelSwitch",
3470 "from_model": "claude-sonnet-5",
3471 "to_model": "claude-opus-5",
3472 "requested_model": "opus",
3473 "source": "command",
3474 "context_tokens": 182340,
3475 "prompt_cache_warm": true,
3476 "cache_ttl": "5m",
3477 "estimated_cache_write_usd": 1.1396,
3478 "pricing": "catalog"
3479}
3480```
3481
3482<h4 id="premodelswitch-decision-control">
3483 PreModelSwitch decision control
3484</h4>
3485
3486Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Выход 2 или `decision: "block"` верхнего уровня отменяет переключение.
3487
3488Для более тонкого контроля, верните `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как на [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. Таблица ниже описывает оба поля:
3489
3490| Field | Description |
3491| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
3492| `permissionDecision` | `"allow"` продолжает и пропускает [confirmation Claude Code shows while the prompt cache is warm](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` подсказывает пользователю подтвердить его |
3493| `permissionDecisionReason` | Для `"deny"`, показано пользователю как причина блокирования переключения или возвращено как ошибка для запроса `set_model`. Для `"ask"`, показано в подсказке подтверждения. Игнорируется для `"allow"` |
3494
3495Только `/model` в интерактивном сеансе может показать подсказку `"ask"`. На каждой другой поверхности, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.
3496
3497Этот пример просит пользователя подтвердить и цитирует количество токенов из `context_tokens`:
3498
3499```json theme={null}
3500{
3501 "hookSpecificOutput": {
3502 "hookEventName": "PreModelSwitch",
3503 "permissionDecision": "ask",
3504 "permissionDecisionReason": "Switching now re-sends about 180k tokens to the new model. Continue?"
3505 }
3506}
3507```
3508
3509Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет — `deny` > `ask` > `allow`.
3510
3511Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета стоимости может вернуть `{"systemMessage": "..."}` и выход 0.
3512
3513Hook PreModelSwitch, который не отвечает перед своим timeout, блокирует переключение. На [PreToolUse](#timeouts), напротив, hook command, который истекает timeout, позволяет вызову инструмента продолжить. Стандартный timeout для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандартные значения `prompt` и `agent` не применяются.
3514
3515Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).
3516
3517<h3 id="postmodelswitch">
3518 PostModelSwitch
3519</h3>
3520
3521Запускается после изменения модели сеанса. Используйте это для предоставления руководства, специфичного для модели, без редактирования каждого CLAUDE.md, например инструкции на уровне организации, которая применяется на определенных моделях.
3522
3523PostModelSwitch требует Claude Code v2.1.251 или позже. Он не может блокировать, потому что модель уже изменилась. Claude Code запускает hooks PostModelSwitch после любого из этих изменений:
3524
3525* Переключение, которое вы или клиент запросили
3526* [Automatic model fallback](/docs/ru/model-config#automatic-model-fallback), которое изменяет модель сеанса
3527* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана
3528* Claude Code восстанавливает модель при возобновлении сеанса
3529
3530Claude Code не запускает hooks PostModelSwitch, когда модель из [fallback model chain](/docs/ru/model-config#fallback-model-chains) служит ходу, потому что это замещение длится один ход и оставляет модель сеанса неизменной.
3531
3532Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.
3533
3534Этот пример добавляет руководство, когда модель сеанса изменяется на любую модель Opus:
3535
3536```json theme={null}
3537{
3538 "hooks": {
3539 "PostModelSwitch": [
3540 {
3541 "matcher": ".*opus.*",
3542 "hooks": [
3543 {
3544 "type": "command",
3545 "command": "echo 'On Opus, delegate implementation work to subagents and keep this conversation for planning and review.'"
3546 }
3547 ]
3548 }
3549 ]
3550 }
3551}
3552```
3553
3554Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, работающего на другой модели, например запустите `/model opus` из сеанса Sonnet, затем попросите Claude, какое руководство оно имеет о текущей модели.
3555
3556<h4 id="postmodelswitch-input">
3557 PostModelSwitch input
3558</h4>
3559
3560Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сеанса.
3561
3562`requested_model` имеет значение `null`, когда `source` имеет значение `"auto"`. Когда `source` имеет значение `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.
3563
3564<h4 id="postmodelswitch-decision-control">
3565 PostModelSwitch decision control
3566</h4>
3567
3568Claude Code берет ваш вывод hook [plain-text stdout](#exit-code-0) при выходе 0 или `additionalContext` из JSON вывода и доставляет его Claude со следующим запросом после переключения. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть:
3569
3570| Field | Description |
3571| :------------------ | :----------------------------------------------------------------------------------------------------------------- |
3572| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |
3573
3574Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для последнего переключения целевой модели.
2827 3575
2828<h3 id="sessionend">3576<h3 id="sessionend">
2829 SessionEnd3577 SessionEnd
2830</h3>3578</h3>
2831 3579
2832Запускается при завершении сеанса Claude Code. Полезно для задач очистки, логирования статистики сеанса или сохранения состояния сеанса. Поддерживает фильтры для фильтрации по причине выхода.3580Запускается, когда сеанс Claude Code заканчивается. Полезно для задач очистки, логирования статистики сеанса или сохранения состояния сеанса. Поддерживает matchers для фильтрации по причине выхода.
2833 3581
2834Поле `reason` во входных данных hook указывает, почему сеанс закончился:3582Поле `reason` в ввод hook указывает, почему сеанс закончился:
2835 3583
2836| Причина | Описание |3584| Reason | Description |
2837| :---------------------------- | :------------------------------------------------ |3585| :---------------------------- | :-------------------------------------------------------------------------------------------- |
2838| `clear` | Сеанс очищен с помощью команды `/clear` |3586| `clear` | Сеанс очищен с помощью команды `/clear` |
2839| `resume` | Сеанс переключен через интерактивный `/resume` |3587| `resume` | Сеанс переключен через интерактивный `/resume` |
2840| `logout` | Пользователь вышел |3588| `logout` | Пользователь вышел |
2841| `prompt_input_exit` | Пользователь вышел, пока был виден ввод подсказки |3589| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |
2842| `bypass_permissions_disabled` | Режим обхода разрешений был отключен |
2843| `other` | Другие причины выхода |3590| `other` | Другие причины выхода |
3591| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |
2844 3592
2845<h4 id="sessionend-input">3593<h4 id="sessionend-input">
2846 SessionEnd input3594 SessionEnd input
2847</h4>3595</h4>
2848 3596
2849В дополнение к [общим полям входа](#common-input-fields), SessionEnd hooks получают поле `reason`, указывающее, почему сеанс закончился. См. таблицу выше для всех значений.3597Помимо [common input fields](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. таблицу [reason](#sessionend) выше для всех значений.
2850 3598
2851```json theme={null}3599```json theme={null}
2852{3600{
2858}3606}
2859```3607```
2860 3608
2861SessionEnd hooks не имеют управления решением. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки.3609Hooks SessionEnd не имеют управления решением. Они не могут заблокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [JSON output fields](#json-output), такие как `systemMessage`.
3610
3611Hooks SessionEnd имеют стандартный timeout 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:
3612
3613* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` для каждого hook в ваших файлах настроек, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандартный. Timeouts, установленные на hooks, предоставленные plugin, не повышают бюджет.
3614* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится timeout для каждого hook без своего собственного `timeout`.
2862 3615
2863SessionEnd hooks имеют таймаут по умолчанию 1,5 секунды. Это применяется как к выходу из сеанса, так и к `/clear` и переключению сеансов через интерактивный `/resume`. Если hook нуждается в большем времени, установите поле `timeout` в конфигурации hook. Общий бюджет автоматически повышается до наибольшего per-hook таймаута, настроенного в файлах настроек, до 60 секунд. Таймауты, установленные на hooks, предоставленные плагинами, не повышают бюджет. Чтобы явно переопределить бюджет, установите переменную окружения `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` в миллисекундах.3616Этот пример устанавливает бюджет на 5 секунд:
2864 3617
2865```bash theme={null}3618```bash theme={null}
2866CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3619CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
2867```3620```
2868 3621
3622До версии 2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышал только общий бюджет, и hook без своего собственного `timeout` все еще отменялся после 1.5 секунды.
3623
2869<h3 id="elicitation">3624<h3 id="elicitation">
2870 Elicitation3625 Elicitation
2871</h3>3626</h3>
2872 3627
2873Запускается, когда MCP сервер запрашивает ввод пользователя во время выполнения задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.3628Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.
2874 3629
2875Поле фильтра совпадает с именем MCP сервера.3630Поле matcher совпадает с именем сервера MCP.
2876 3631
2877<h4 id="elicitation-input">3632<h4 id="elicitation-input">
2878 Elicitation input3633 Elicitation input
2879</h4>3634</h4>
2880 3635
2881В дополнение к [общим полям входа](#common-input-fields), Elicitation hooks получают `mcp_server_name`, `message` и опциональные `mode`, `url`, `elicitation_id` и `requested_schema` поля.3636Помимо [common input fields](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные поля `mode`, `url`, `elicitation_id` и `requested_schema`.
2882 3637
2883Для form-mode elicitation (наиболее распространённый случай):3638Для запроса в режиме формы, наиболее распространенный случай:
2884 3639
2885```json theme={null}3640```json theme={null}
2886{3641{
2887 "session_id": "abc123",3642 "session_id": "abc123",
2888 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3643 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
2889 "cwd": "/Users/...",3644 "cwd": "/Users/...",
2890 "permission_mode": "default",
2891 "hook_event_name": "Elicitation",3645 "hook_event_name": "Elicitation",
2892 "mcp_server_name": "my-mcp-server",3646 "mcp_server_name": "my-mcp-server",
2893 "message": "Please provide your credentials",3647 "message": "Please provide your credentials",
2901}3655}
2902```3656```
2903 3657
2904Для URL-mode elicitation (аутентификация на основе браузера):3658Для запроса в режиме URL, используемого для аутентификации на основе браузера:
2905 3659
2906```json theme={null}3660```json theme={null}
2907{3661{
2908 "session_id": "abc123",3662 "session_id": "abc123",
2909 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3663 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
2910 "cwd": "/Users/...",3664 "cwd": "/Users/...",
2911 "permission_mode": "default",
2912 "hook_event_name": "Elicitation",3665 "hook_event_name": "Elicitation",
2913 "mcp_server_name": "my-mcp-server",3666 "mcp_server_name": "my-mcp-server",
2914 "message": "Please authenticate",3667 "message": "Please authenticate",
2935}3688}
2936```3689```
2937 3690
2938| Поле | Значения | Описание |3691| Field | Values | Description |
2939| :-------- | :---------------------------- | :----------------------------------------------------------------------------------- |3692| :-------- | :---------------------------- | :--------------------------------------------------------------------------------------------- |
2940| `action` | `accept`, `decline`, `cancel` | Принять, отклонить или отменить запрос |3693| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |
2941| `content` | object | Значения полей формы для отправки. Используется только когда `action` равен `accept` |3694| `content` | object | Значения полей формы для отправки. Используется только, когда `action` имеет значение `accept` |
2942 3695
2943Exit code 2 отклоняет elicitation и показывает stderr пользователю.3696Выход 2 отклоняет запрос. Claude Code не показывает ваше сообщение stderr нигде.
3697
3698Claude Code действует на `hookSpecificOutput` из JSON вывода hook Elicitation и отбрасывает `systemMessage` и `continue`.
2944 3699
2945<h3 id="elicitationresult">3700<h3 id="elicitationresult">
2946 ElicitationResult3701 ElicitationResult
2947</h3>3702</h3>
2948 3703
2949Запускается после ответа пользователя на MCP elicitation. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на MCP сервер.3704Запускается после ответа пользователя на запрос MCP. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.
2950 3705
2951Поле фильтра совпадает с именем MCP сервера.3706Поле matcher совпадает с именем сервера MCP.
2952 3707
2953<h4 id="elicitationresult-input">3708<h4 id="elicitationresult-input">
2954 ElicitationResult input3709 ElicitationResult input
2955</h4>3710</h4>
2956 3711
2957В дополнение к [общим полям входа](#common-input-fields), ElicitationResult hooks получают `mcp_server_name`, `action` и опциональные `mode`, `elicitation_id` и `content` поля.3712Помимо [common input fields](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные поля `mode`, `elicitation_id` и `content`.
2958 3713
2959```json theme={null}3714```json theme={null}
2960{3715{
2961 "session_id": "abc123",3716 "session_id": "abc123",
2962 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",3717 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
2963 "cwd": "/Users/...",3718 "cwd": "/Users/...",
2964 "permission_mode": "default",
2965 "hook_event_name": "ElicitationResult",3719 "hook_event_name": "ElicitationResult",
2966 "mcp_server_name": "my-mcp-server",3720 "mcp_server_name": "my-mcp-server",
2967 "action": "accept",3721 "action": "accept",
2987}3741}
2988```3742```
2989 3743
2990| Поле | Значения | Описание |3744| Field | Values | Description |
2991| :-------- | :---------------------------- | :------------------------------------------------------------------------------------ |3745| :-------- | :---------------------------- | :---------------------------------------------------------------------------------------------- |
2992| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3746| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |
2993| `content` | object | Переопределяет значения полей формы. Имеет смысл только когда `action` равен `accept` |3747| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` имеет значение `accept` |
2994 3748
2995Exit code 2 блокирует ответ, изменяя эффективное действие на `decline`.3749Выход 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.
3750
3751Claude Code действует на `hookSpecificOutput` из JSON вывода hook ElicitationResult и отбрасывает `systemMessage` и `continue`.
2996 3752
2997<h2 id="prompt-based-hooks">3753<h2 id="prompt-based-hooks">
2998 Prompt-based hooks3754 Prompt-based hooks
3020 3776
3021* `ConfigChange`3777* `ConfigChange`
3022* `CwdChanged`3778* `CwdChanged`
3779* `DirectoryAdded`
3023* `Elicitation`3780* `Elicitation`
3024* `ElicitationResult`3781* `ElicitationResult`
3025* `FileChanged`3782* `FileChanged`
3026* `InstructionsLoaded`3783* `InstructionsLoaded`
3784* `MessageDisplay`
3027* `Notification`3785* `Notification`
3028* `PostCompact`3786* `PostCompact`
3787* `PostModelSwitch`
3029* `PreCompact`3788* `PreCompact`
3789* `PreModelSwitch`
3030* `SessionEnd`3790* `SessionEnd`
3031* `StopFailure`3791* `StopFailure`
3032* `SubagentStart`3792* `SubagentStart`
3033* `WorktreeCreate`3793* `WorktreeCreate`
3034* `WorktreeRemove`3794* `WorktreeRemove`
3035 3795
3036`SessionStart` и `Setup` поддерживают `command` и `mcp_tool` hooks. Они не поддерживают `http`, `prompt` или `agent` hooks.3796`SessionStart` и `Setup` поддерживают `command` и `mcp_tool` hooks, и [MCP tool hook fields](#mcp-tool-hook-fields) описывает, когда их `mcp_tool` hooks запускаются. Они не поддерживают `http`, `prompt` или `agent` hooks.
3037 3797
3038<h3 id="how-prompt-based-hooks-work">3798<h3 id="how-prompt-based-hooks-work">
3039 How prompt-based hooks work3799 How prompt-based hooks work
3049 Prompt hook configuration3809 Prompt hook configuration
3050</h3>3810</h3>
3051 3811
3052Установите `type` на `"prompt"` и предоставьте строку `prompt` вместо `command`. Используйте заполнитель `$ARGUMENTS` для внедрения данных JSON входа hook в текст вашей подсказки. Claude Code отправляет объединённую подсказку и входные данные быстрой модели Claude, которая возвращает JSON решение.3812Установите `type` на `"prompt"` и предоставьте строку `prompt` вместо `command`. Используйте заполнитель `$ARGUMENTS` для внедрения данных JSON входа hook в текст вашей подсказки.
3053 3813
3054Этот hook `Stop` просит LLM оценить, должен ли Claude остановиться перед разрешением Claude закончить:3814Этот hook `Stop` просит LLM оценить, должен ли Claude остановиться перед разрешением Claude закончить:
3055 3815
3071```3831```
3072 3832
3073| Поле | Обязательно | Описание |3833| Поле | Обязательно | Описание |
3074| :---------------- | :---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3834| :---------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3075| `type` | да | Должно быть `"prompt"` |3835| `type` | да | Должно быть `"prompt"` |
3076| `prompt` | да | Текст подсказки для отправки LLM. Используйте `$ARGUMENTS` как заполнитель для JSON входа hook. Если `$ARGUMENTS` отсутствует, JSON входа добавляется к подсказке |3836| `prompt` | да | Текст подсказки для отправки LLM. Используйте `$ARGUMENTS` как заполнитель для JSON входа hook. Если `$ARGUMENTS` отсутствует, JSON входа добавляется к подсказке |
3077| `model` | нет | Модель для использования при оценке. По умолчанию быстрая модель |3837| `model` | нет | Модель для использования при оценке. По умолчанию быстрая модель |
3078| `timeout` | нет | Таймаут в секундах. По умолчанию: 30 |3838| `timeout` | нет | Таймаут в секундах. По умолчанию: 30 |
3079| `continueOnBlock` | нет | Когда подсказка возвращает `ok: false`, передайте причину обратно Claude и продолжите ход вместо остановки. По умолчанию: `false`. Реализуется как `continue: true` на результирующем `decision: "block"`. См. [Response schema](#response-schema) для поведения для каждого события |3839| `continueOnBlock` | нет | На событиях, к которым это применяется, `true` передаёт причину `ok: false` обратно Claude и продолжает вместо завершения хода. По умолчанию: `false`. См. [Response schema](#response-schema) для поведения для каждого события |
3080 3840
3081<h3 id="response-schema">3841<h3 id="response-schema">
3082 Response schema3842 Response schema
3087```json theme={null}3847```json theme={null}
3088{3848{
3089 "ok": true | false,3849 "ok": true | false,
3090 "reason": "Explanation for the decision"3850 "reason": "Explanation for the decision",
3851 "impossible": true | false
3091}3852}
3092```3853```
3093 3854
3094| Поле | Описание |3855| Поле | Описание |
3095| :------- | :-------------------------------------------------------------------------------------------------------- |3856| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
3096| `ok` | `true` разрешает действие. `false` производит `decision: "block"`. См. поведение для каждого события ниже |3857| `ok` | `true` разрешает действие. Для `false`, см. поведение для каждого события ниже |
3097| `reason` | Требуется при `ok` равном `false`. Используется как причина блокировки |3858| `reason` | Требуется при `ok` равном `false` |
3859| `impossible` | Опционально. Модель возвращает его с `ok: false`, когда она судит, что условие никогда не может быть удовлетворено. На `Stop` и `SubagentStop`, Claude Code затем позволяет ходу закончиться вместо передачи причины обратно. Agent hooks и другие события игнорируют его |
3098 3860
3099Что происходит при `ok: false`, зависит от события:3861Что происходит при `ok: false`, зависит от события:
3100 3862
3101* `Stop` и `SubagentStop`: причина передаётся обратно Claude как его следующая инструкция и ход продолжается3863* `Stop` и `SubagentStop`: причина передаётся обратно Claude как его следующая инструкция и ход продолжается, если только ответ также не устанавливает `impossible: true`, в этом случае Claude Code позволяет остановке и ход заканчивается
3102* `PreToolUse`: вызов инструмента отклоняется и причина возвращается Claude как ошибка инструмента, эквивалентно `permissionDecision: "deny"` из command hook3864* `PreToolUse`: вызов инструмента отклоняется; по умолчанию ход заканчивается и причина отказа появляется в чате как строка предупреждения. Установите `continueOnBlock: true` для возврата причины Claude как ошибки инструмента, чтобы он мог скорректировать и продолжить, эквивалентно `permissionDecision: "deny"` из command hook. До v2.1.210 причина отказа возвращалась Claude как ошибка инструмента и ход продолжался
3103* `PostToolUse`: по умолчанию ход заканчивается и причина появляется в чате как строка предупреждения. Установите `continueOnBlock: true` для передачи причины обратно Claude и продолжения хода вместо этого3865* `PostToolUse`: по умолчанию ход заканчивается и причина появляется в чате как строка предупреждения. Установите `continueOnBlock: true` для передачи причины обратно Claude и продолжения хода вместо этого
3104* `PostToolBatch`, `UserPromptSubmit` и `UserPromptExpansion`: ход заканчивается и причина появляется как строка предупреждения. Эти события заканчивают ход на `decision: "block"` независимо от `continue`3866* `PostToolBatch`, `UserPromptSubmit` и `UserPromptExpansion`: ход заканчивается и причина появляется как строка предупреждения. Эти события заканчивают ход на `decision: "block"` независимо от `continue`
3105* `PostToolUseFailure`, `TaskCreated` и `TaskCompleted`: причина возвращается Claude как ошибка инструмента, аналогично `PreToolUse`3867* `PostToolUseFailure` и `TaskCreated`: причина возвращается Claude как ошибка инструмента и ход продолжается, независимо от `continueOnBlock`
3868* `TaskCompleted`: когда он срабатывает, потому что задача отмечена как завершённая во время хода, причина возвращается Claude как ошибка инструмента и ход продолжается, независимо от `continueOnBlock`. Когда он срабатывает, потому что товарищ по команде останавливается, он ведёт себя как `TeammateIdle` и останавливает товарища по команде по умолчанию
3106* `TeammateIdle`: по умолчанию товарищ по команде останавливается и причина появляется как строка предупреждения. Установите `continueOnBlock: true` для передачи причины обратно товарищу по команде и продолжения его работы вместо этого3869* `TeammateIdle`: по умолчанию товарищ по команде останавливается и причина появляется как строка предупреждения. Установите `continueOnBlock: true` для передачи причины обратно товарищу по команде и продолжения его работы вместо этого
3107* `PermissionRequest`: `ok: false` не имеет эффекта. Чтобы отклонить одобрение из hook, используйте [command hook](#command-hook-fields), возвращающий `hookSpecificOutput.decision.behavior: "deny"`3870* `PermissionRequest`: `ok: false` не имеет эффекта. Чтобы отклонить одобрение из hook, используйте [command hook](#command-hook-fields), возвращающий `hookSpecificOutput.decision.behavior: "deny"`
3108* `PermissionDenied`: `ok: false` не имеет эффекта, потому что отказ уже произошёл. Единственный результат, который это событие читает, это `hookSpecificOutput.retry`, который prompt и agent hooks не могут установить. Они запускаются на этом событии, но их результат отбрасывается. Используйте [command hook](#command-hook-fields) для возврата `retry`3871* `PermissionDenied`: `ok: false` не имеет эффекта, потому что отказ уже произошёл. Единственный результат, который это событие читает, это `hookSpecificOutput.retry`, который prompt и agent hooks не могут установить. Они запускаются на этом событии, но их результат отбрасывается. Используйте [command hook](#command-hook-fields) для возврата `retry`
3113 Check multiple conditions before stopping3876 Check multiple conditions before stopping
3114</h3>3877</h3>
3115 3878
3116Этот hook `Stop` использует подробную подсказку для проверки трёх условий перед разрешением Claude остановиться. Hooks `SubagentStop` используют тот же формат для оценки, должен ли [subagent](/docs/ru/sub-agents) остановиться. Если `"ok"` равно `false`, Claude продолжает работать с предоставленной причиной как своей следующей инструкцией:3879Этот hook `Stop` использует подробную подсказку для проверки трёх условий перед разрешением Claude остановиться. Hooks `SubagentStop` используют тот же формат для оценки, должен ли [subagent](/docs/ru/sub-agents) остановиться. Если модель возвращает `"ok": false`, потому что условие ещё не выполнено, Claude продолжает работать с предоставленной причиной как своей следующей инструкцией:
3117 3880
3118```json theme={null}3881```json theme={null}
3119{3882{
31521. Claude Code порождает subagent с вашей подсказкой и JSON входом hook39151. Claude Code порождает subagent с вашей подсказкой и JSON входом hook
31532. Subagent может использовать инструменты, такие как Read, Grep и Glob, для исследования39162. Subagent может использовать инструменты, такие как Read, Grep и Glob, для исследования
31543. После до 50 оборотов subagent возвращает структурированное решение `{ "ok": true/false }`39173. После до 50 оборотов subagent возвращает структурированное решение `{ "ok": true/false }`
31554. Claude Code обрабатывает решение так же, как prompt hook39184. Claude Code разрешает действие, если `ok` имеет значение `true`. Если `ok` имеет значение `false`, Claude Code обрабатывает блокировку так же, как prompt hook с `continueOnBlock: true` на этом событии, как указано в разделе [Response schema](#response-schema)
3156 3919
3157Agent hooks полезны, когда проверка требует проверки фактических файлов или выхода тестов, а не только оценки данных входа hook.3920Agent hooks полезны, когда проверка требует проверки фактических файлов или выхода тестов, а не только оценки данных входа hook.
3158 3921
3160 Agent hook configuration3923 Agent hook configuration
3161</h3>3924</h3>
3162 3925
3163Установите `type` на `"agent"` и предоставьте строку `prompt`. Поля конфигурации те же, что и [prompt hooks](#prompt-hook-configuration), с более длинным таймаутом по умолчанию:3926Установите `type` на `"agent"` и предоставьте строку `prompt`, используя `$ARGUMENTS` как заполнитель для JSON входа hook. Поля конфигурации те же, что и [prompt hooks](#prompt-hook-configuration), за исключением того, что agent hooks имеют более длинный таймаут по умолчанию в 60 секунд и не имеют поля `continueOnBlock`.
3164
3165| Поле | Обязательно | Описание |
3166| :-------- | :---------- | :-------------------------------------------------------------------------------------------------- |
3167| `type` | да | Должно быть `"agent"` |
3168| `prompt` | да | Подсказка, описывающая, что проверять. Используйте `$ARGUMENTS` как заполнитель для JSON входа hook |
3169| `model` | нет | Модель для использования. По умолчанию быстрая модель |
3170| `timeout` | нет | Таймаут в секундах. По умолчанию: 60 |
3171 3927
3172Схема ответа та же, что и prompt hooks: `{ "ok": true }` для разрешения или `{ "ok": false, "reason": "..." }` для блокировки.3928Схема ответа — это `{ "ok": true }` для разрешения или `{ "ok": false, "reason": "..." }` для блокировки. При `ok: false`, Claude Code обрабатывает agent hook так же, как он обрабатывает [prompt hook с `continueOnBlock: true`](#response-schema) на том же событии; agent hooks не имеют поля `continueOnBlock` и не поддерживают поле `impossible` из prompt hook.
3173 3929
3174Этот hook `Stop` проверяет, что все модульные тесты проходят перед разрешением Claude закончить:3930Этот hook `Stop` проверяет, что все модульные тесты проходят перед разрешением Claude закончить:
3175 3931
3203 3959
3204Добавьте `"async": true` к конфигурации command hook для запуска его в фоне без блокировки Claude. Это поле доступно только на hooks `type: "command"`.3960Добавьте `"async": true` к конфигурации command hook для запуска его в фоне без блокировки Claude. Это поле доступно только на hooks `type: "command"`.
3205 3961
3206Этот hook запускает скрипт тестирования после каждого вызова инструмента `Write`. Claude продолжает работать немедленно, пока `run-tests.sh` выполняется до 120 секунд. Когда скрипт завершается, его выход доставляется на следующий ход разговора:3962Этот hook запускает скрипт тестирования после каждого вызова инструмента `Write`. Claude продолжает работать немедленно, пока `run-tests.sh` выполняется. Когда скрипт завершается, его выход доставляется на следующий ход разговора:
3207 3963
3208```json theme={null}3964```json theme={null}
3209{3965{
3215 {3971 {
3216 "type": "command",3972 "type": "command",
3217 "command": "/path/to/run-tests.sh",3973 "command": "/path/to/run-tests.sh",
3218 "async": true,3974 "async": true
3219 "timeout": 120
3220 }3975 }
3221 ]3976 ]
3222 }3977 }
3225}3980}
3226```3981```
3227 3982
3228Поле `timeout` устанавливает максимальное время в секундах для фонового процесса. Если не указано, асинхронные hooks используют тот же 10-минутный таймаут по умолчанию, что и синхронные hooks.3983Как только асинхронный hook запущен в фоне, Claude Code не применяет `timeout` к нему. Claude Code по-прежнему применяет `timeout` к hook, который вы запускаете с `asyncRewake`.
3984
3985Claude Code доставляет результаты асинхронного hook только во время работы сеанса:
3986
3987* В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code завершает любой асинхронный hook, который всё ещё работает при завершении, и завершает его с результатом `cancelled`
3988* Если работа вашего hook должна пережить сеанс `claude -p`, запустите полностью отделённый процесс из него
3229 3989
3230<h3 id="how-async-hooks-execute">3990<h3 id="how-async-hooks-execute">
3231 Как выполняются асинхронные hooks3991 Как выполняются асинхронные hooks
3233 3993
3234Когда срабатывает асинхронный hook, Claude Code запускает процесс hook и немедленно продолжает без ожидания его завершения. Hook получает те же JSON входные данные через stdin, что и синхронный hook.3994Когда срабатывает асинхронный hook, Claude Code запускает процесс hook и немедленно продолжает без ожидания его завершения. Hook получает те же JSON входные данные через stdin, что и синхронный hook.
3235 3995
3236После выхода фонового процесса, если hook произвёл JSON ответ с полем `additionalContext`, это содержимое доставляется Claude как контекст на следующем ходу разговора. Поле `systemMessage` показывается вам, а не Claude.3996После выхода фонового процесса Claude Code доставляет поля `additionalContext` и `systemMessage` из JSON ответа hook к Claude на следующем ходу разговора. В отличие от `systemMessage` синхронного hook, ни одно из этих полей не показывается вам.
3237 3997
3238Claude Code проверяет, что JSON ответ соответствует той же [схеме выходных данных](#json-output), что и синхронные hooks, и отбрасывает любое поле, значение которого имеет неправильный тип, например `systemMessage`, который не является строкой, вместо его доставки. Запустите с `--debug` для просмотра предупреждения, называющего каждое отброшенное поле. До версии v2.1.202 неправильно сформированный JSON выход из асинхронного hook мог привести к сбою сеанса, и сбой повторялся каждый раз при возобновлении сеанса.3998Claude Code проверяет, что JSON ответ соответствует той же [схеме выходных данных](#json-output), что и синхронные hooks, и отбрасывает любое поле, значение которого имеет неправильный тип, например `systemMessage`, который не является строкой, вместо его доставки. Запустите с `--debug` для просмотра предупреждения, называющего каждое отброшенное поле. До версии v2.1.202 неправильно сформированный JSON выход из асинхронного hook мог привести к сбою сеанса, и сбой повторялся каждый раз при возобновлении сеанса.
3239 3999
3283 "type": "command",4043 "type": "command",
3284 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/run-tests-async.sh",4044 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/run-tests-async.sh",
3285 "args": [],4045 "args": [],
3286 "async": true,4046 "async": true
3287 "timeout": 300
3288 }4047 }
3289 ]4048 ]
3290 }4049 }
3297 Ограничения4056 Ограничения
3298</h3>4057</h3>
3299 4058
3300Асинхронные hooks имеют несколько ограничений по сравнению с синхронными hooks:4059Асинхронные hooks имеют дополнительные ограничения по сравнению с синхронными hooks:
3301 4060
3302* Только hooks `type: "command"` поддерживают `async`. Prompt-based hooks не могут запускаться асинхронно.
3303* Асинхронные hooks не могут блокировать вызовы инструментов или возвращать решения. К моменту завершения hook действие, вызвавшее его, уже произошло.
3304* Выход hook доставляется на следующий ход разговора. Если сеанс неактивен, ответ ждёт до следующего взаимодействия пользователя. Исключение: hook `asyncRewake`, который выходит с кодом 2, пробуждает Claude немедленно даже когда сеанс неактивен.4061* Выход hook доставляется на следующий ход разговора. Если сеанс неактивен, ответ ждёт до следующего взаимодействия пользователя. Исключение: hook `asyncRewake`, который выходит с кодом 2, пробуждает Claude немедленно даже когда сеанс неактивен.
3305* Каждое выполнение создаёт отдельный фоновый процесс. Нет дедупликации между несколькими срабатываниями одного и того же асинхронного hook.4062* Каждое выполнение создаёт отдельный фоновый процесс. Нет дедупликации между несколькими срабатываниями одного и того же асинхронного hook.
3306 4063
3312 Отказ от ответственности4069 Отказ от ответственности
3313</h3>4070</h3>
3314 4071
3315Command hooks запускаются с полными разрешениями системного пользователя.
3316
3317<Warning>4072<Warning>
3318 Command hooks выполняют команды оболочки с вашими полными разрешениями пользователя. Они могут изменять, удалять или получать доступ к любым файлам, к которым может получить доступ ваша учётная запись пользователя. Проверьте и протестируйте все команды hook перед добавлением их в вашу конфигурацию.4073 Command hooks выполняют команды оболочки с вашими полными разрешениями пользователя. Они могут изменять, удалять или получать доступ к любым файлам, к которым может получить доступ ваша учётная запись пользователя. Проверьте и протестируйте все команды hook перед добавлением их в вашу конфигурацию.
3319</Warning>4074</Warning>
3320 4075
4076<h3 id="workspace-trust">
4077 Доверие рабочей области
4078</h3>
4079
4080Claude Code проверяет доверие рабочей области перед запуском любого hook из файла параметров. Что считается доверенным, зависит от типа сеанса:
4081
4082* **Интерактивный сеанс**: Claude Code удерживает hooks из каждого файла параметров, включая ваш собственный `~/.claude/settings.json`, пока вы не примете [диалог доверия рабочей области](/docs/ru/permissions#project-allow-rules-and-workspace-trust) для папки или для родительского каталога, чьё доверие распространяется на неё
4083* **Сеанс `-p` или SDK**: Claude Code никогда не показывает диалог и рассматривает папку как доверенную, поэтому hooks, зафиксированные в `.claude/settings.json` репозитория, запускаются в папке, которой вы никогда не доверяли
4084
4085Перед тем как запустить `claude -p` над репозиторием, который вы не писали, проверьте его файлы параметров `.claude/`, начните с [`--bare`](/docs/ru/headless#start-faster-with-bare-mode) или [отключите hooks для этого запуска](#disable-or-remove-hooks) с помощью `--settings '{"disableAllHooks": true}'`. Frontmatter hooks в проектном подагенте следуют более строгому правилу, чем hooks файлов параметров. [Что запускается перед доверием папке](/docs/ru/permissions#what-runs-before-you-trust-a-folder) перечисляет каждый вид содержимого репозитория по типу сеанса.
4086
3321<h3 id="security-best-practices">4087<h3 id="security-best-practices">
3322 Лучшие практики безопасности4088 Лучшие практики безопасности
3323</h3>4089</h3>
3334 Windows PowerShell tool4100 Windows PowerShell tool
3335</h2>4101</h2>
3336 4102
3337На Windows вы можете запустить отдельные hooks в PowerShell, установив `"shell": "powershell"` на command hook. Hooks порождают PowerShell напрямую, поэтому это работает независимо от того, установлен ли `CLAUDE_CODE_USE_POWERSHELL_TOOL`. Claude Code автоматически обнаруживает `pwsh.exe`, исполняемый файл PowerShell 7 и более поздних версий, и переходит на `powershell.exe` для Windows PowerShell 5.1.4103На Windows вы можете запустить отдельные hooks в PowerShell, установив `"shell": "powershell"` на command hook. Claude Code автоматически обнаруживает `pwsh.exe`, исполняемый файл PowerShell 7 и более поздних версий, и переходит на `powershell.exe` для Windows PowerShell 5.1.
3338 4104
3339```json theme={null}4105```json theme={null}
3340{4106{
3375 Debug hooks4141 Debug hooks
3376</h2>4142</h2>
3377 4143
3378Детали выполнения hooks, включая информацию о том, какие hooks совпали, их коды выхода и полный stdout и stderr, записываются в файл отладочного журнала. Запустите Claude Code с `claude --debug-file <path>` для записи журнала в известное расположение, или запустите `claude --debug` и прочитайте журнал в `~/.claude/debug/<session-id>.txt`. Флаг `--debug` не выводит на терминал.4144Детали выполнения hooks записываются в файл отладочного журнала. Запустите Claude Code с `claude --debug-file <path>` для записи журнала в известное расположение, или запустите `claude --debug` и прочитайте журнал в `~/.claude/debug/<session-id>.txt`. Флаг `--debug` не выводит на терминал.
4145
4146Например, hook `PostToolUse` на `Write`, чья команда выводит `hook-ran`, создаёт записи вроде:
3379 4147
3380```text theme={null}4148```text theme={null}
3381[DEBUG] Executing hooks for PostToolUse:Write41492026-07-19T02:03:24.382Z [DEBUG] Hook output does not start with {, treating as plain text
3382[DEBUG] Found 1 hook commands to execute41502026-07-19T02:03:24.382Z [DEBUG] "Hook PostToolUse:Write (PostToolUse) success:\nhook-ran"
3383[DEBUG] Executing hook command: <Your command> with timeout 600000ms
3384[DEBUG] Hook command completed with status 0: <Your stdout>
3385```4151```
3386 4152
3387Для более детальной информации о совпадении hooks установите `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` для просмотра дополнительных строк логирования, таких как количество совпадений фильтра hook и совпадение запроса.4153Для более детальной информации о совпадении hooks установите `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` для просмотра дополнительных строк логирования, таких как количество совпадений фильтра hook и совпадение запроса.
3388 4154
3389Для устранения неполадок распространённых проблем, таких как hooks, которые не срабатывают, бесконечные циклы Stop hook или ошибки конфигурации, см. [Limitations and troubleshooting](/docs/ru/hooks-guide#limitations-and-troubleshooting) в руководстве. Для более широкого диагностического пошагового руководства, охватывающего `/context`, `/doctor` и приоритет параметров, см. [Debug your config](/docs/ru/debug-your-config).4155Для устранения неполадок распространённых проблем, таких как hooks, которые не срабатывают, Stop hooks, которые продолжают блокировать, или ошибки конфигурации, см. [Limitations and troubleshooting](/docs/ru/hooks-guide#limitations-and-troubleshooting) в руководстве. Для более широкого диагностического пошагового руководства, охватывающего `/context`, `/doctor` и приоритет параметров, см. [Debug your config](/docs/ru/debug-your-config).