Skip to main content

Ссылка на крючки GitHub Copilot CLI

Найдите события крюка, форматы конфигураций и входные полезные нагрузки для Второй пилот CLI.

Хуки — это внешние команды, которые выполняются в определённых жизненных точках сессии, обеспечивая индивидуальную автоматизацию, управление безопасностью и интеграции. Файлы конфигурации крюков загружаются автоматически из .github/hooks/*.json вашего репозитория.

Формат конфигурации крючка

Конфигурационные файлы крючка используют формат JSON с версией 1.

Командные крючки

Командные хуки запускают shell-скрипты и поддерживаются на всех типах хуков.

{
  "version": 1,
  "hooks": {
    "preToolUse": [
      {
        "type": "command",
        "bash": "your-bash-command",
        "powershell": "your-powershell-command",
        "cwd": "optional/working/directory",
        "env": { "VAR": "value" },
        "timeoutSec": 30
      }
    ]
  }
}
ПолеТипОбязательныйDescription
bashstringОдин из bash/powershellКоманда shell для Unix.
cwdstringНетРабочая папка для команды (относительно корня репозитория или абсолюта).
envobjectНетПеременные среды для установки (поддерживает расширение переменных).
powershellstringОдин из bash/powershellКоманда shell для Windows.
timeoutSecчисло/номерНетВремя ожидания в секундах. По умолчанию: 30.
type"command"ДаЭтот параметр должен содержать значение "command".

Подсказочные зацепки

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

{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "prompt",
        "prompt": "Your prompt text or /slash-command"
      }
    ]
  }
}
ПолеТипОбязательныйDescription
type"prompt"ДаЭтот параметр должен содержать значение "prompt".
promptstringДаТекст для отправки — это может быть сообщение на естественном языке или команда слэша.

События с крючками

СобытиеСрабатывает, когдаОбработка выхода
agentStopГлавный агент завершает ход.Да — может блокировать и заставлять продолжение.
errorOccurredОшибка возникает во время выполнения.Нет
notificationСрабатывает асинхронно, когда CLI отправляет системное уведомление (завершение оболочки, завершение работы агента или простоя, запросы разрешения, диалоги вызова). Удар и забыть: никогда не блокирует сессию. Поддерживает matcher regex на notification_type.Опционально — можно вводить additionalContext в сессию.
permissionRequestСрабатывает до запуска сервиса разрешений (движок правил, утверждение сессии, авторазрешение/автозапрет и подсказка пользователя). Если выход объединённого крючка возвращается behavior: "allow" или "deny", это решение приводит к короткому замыканию нормального потока разрешений. Поддерживает matcher regex на toolName.Да — можно разрешить или отклонить программно.
postToolUseПосле успешного завершения каждого инструмента.Да — можно заменить успешный результат (только программные хуки SDK).
postToolUseFailureПосле того, как инструмент завершается с неудачей.Да — может предоставить навигацию по восстановлению через additionalContext (код 2 выхода для командных хуков).
preCompactВот-вот начнётся уплотнение контекста (ручное или автоматическое). Поддерживают matcher фильтрацию по триггерам ("manual" или "auto").Нет — только уведомление.
preToolUseПеред тем, как каждый инструмент сработает.Да — можно разрешать, отрицать или изменять.
sessionEndСессия заканчивается.Нет
sessionStartНачинается новая или возобновлённая сессия.Нет
subagentStartПоявляется субагент (до его запуска). Возвраты additionalContext предшествуют запросу субагента. Поддерживает matcher фильтрацию по имени агента.Нет — нельзя блокировать создание.
subagentStopСубагент завершает.Да — может блокировать и заставлять продолжение.
userPromptSubmittedПользователь отправляет запрос.Нет

Полезные нагрузки для ввода событий hook

Каждое событие с крючком доставляет JSON-полезную нагрузку обработчику крючков. Поддерживаются два формата полезной нагрузки, выбираемых по имени события, используемому в конфигурации крючка:

  • camelCase format — Настройте имя события в camelCase (например, sessionStart). Поля используют CamelCase.

          VS Code совместимый формат** — Настройте имя события в PascalCase (например, `SessionStart`). Поля используют snake_case для соответствия VS CodeCopilot формату расширения.

sessionStart / SessionStart

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;      // Unix timestamp in milliseconds
    cwd: string;
    source: "startup" | "resume" | "new";
    initialPrompt?: string;
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "SessionStart";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    source: "startup" | "resume" | "new";
    initial_prompt?: string;
}

sessionEnd / SessionEnd

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "SessionEnd";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}

userPromptSubmitted / UserPromptSubmit

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    prompt: string;
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "UserPromptSubmit";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    prompt: string;
}

preToolUse / PreToolUse

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
}
          **
          VS Code Совместимый вход:**

При настройке с именем PreToolUseсобытия PascalCase полезная нагрузка использует snake_case имена полей, чтобы соответствовать формату VS CodeCopilot расширения:

{
    hook_event_name: "PreToolUse";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;    // Tool arguments (parsed from JSON string when possible)
}

postToolUse / PostToolUse

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
    toolResult: {
        resultType: "success";
        textResultForLlm: string;
    }
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "PostToolUse";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;
    tool_result: {
        result_type: "success" | "failure" | "denied" | "error";
        text_result_for_llm: string;
    }
}

postToolUseFailure / PostToolUseFailure

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
    error: string;
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "PostToolUseFailure";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;
    error: string;
}

agentStop / Stop

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    stopReason: "end_turn";
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "Stop";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    stop_reason: "end_turn";
}

subagentStart

          **Входные данные:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    agentName: string;
    agentDisplayName?: string;
    agentDescription?: string;
}

subagentStop / SubagentStop

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    agentName: string;
    agentDisplayName?: string;
    stopReason: "end_turn";
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "SubagentStop";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    agent_name: string;
    agent_display_name?: string;
    stop_reason: "end_turn";
}

errorOccurred / ErrorOccurred

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    error: {
        message: string;
        name: string;
        stack?: string;
    };
    errorContext: "model_call" | "tool_execution" | "system" | "user_input";
    recoverable: boolean;
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "ErrorOccurred";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    error: {
        message: string;
        name: string;
        stack?: string;
    };
    error_context: "model_call" | "tool_execution" | "system" | "user_input";
    recoverable: boolean;
}

preCompact / PreCompact

          **Ввод CamelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    trigger: "manual" | "auto";
    customInstructions: string;
}
          **
          VS Code Совместимый вход:**
{
    hook_event_name: "PreCompact";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    trigger: "manual" | "auto";
    custom_instructions: string;
}

          `preToolUse` Контроль принятия решений

Крюк preToolUse может управлять выполнением инструмента, записывая JSON-объект в stdout.

ПолеЦенностиDescription
permissionDecision
          `"allow"`, , `"deny"``"ask"` | Работает ли инструмент. Пустой выход использует стандартное поведение. |

| permissionDecisionReason | string | Агенту показали разум. Требуется при принятии решения "deny". | | modifiedArgs | object | Замените аргументы инструментов вместо оригиналов. |

          `agentStop`
           / 
          `subagentStop` Контроль принятия решений
ПолеЦенностиDescription
decision
          `"block"`, `"allow"` | 
          `"block"` заставляет другого агента поступить, используя `reason` это как подсказку. |

| reason | string | Подсказка для следующего хода, когда decision ."block" |

          `permissionRequest` Контроль принятия решений

          `permissionRequest` Крюк срабатывает до запуска сервиса разрешений — до проверки правил, одобрения сессии, авторазрешения/автозапрета и подсказки пользователя. Если крючки возвращаются `behavior: "allow"` или `"deny"`, это решение приводит к короткому замыканию нормального потока разрешений. Возврат ничего не выходит на обычную обработку разрешений. Используйте его для программного одобрения или отклонения вызовов инструментов — особенно полезно в режимах pipe (`-p`) и CI, где нет интерактивного запроса.

Все настроенные permissionRequest крючки работают для каждого запроса (кроме read типов hook с разрешениями, которые срабатывают перед хуками). Выходы крючка объединяются с более поздними выходами хука, переопределяя более ранние.

          **Матчер:** Необязательный регулярный выражение, тестируемое против `toolName`. Закрепленное как `^(?:pattern)$`; должно совпадать с полным именем инструмента. При установке крюк срабатывает только при совпадающих названиях инструментов.

Выводите JSON в stdout, чтобы контролировать решение о разрешении:

ПолеЦенностиDescription
behavior
          `"allow"`, `"deny"` | Одобрить или отклонить этот инструмент. |

| message | string | Причина возвращалась к LLM при отказе. | | interrupt | boolean | В true сочетании с "deny", агент полностью останавливается. |

Вернуть пустой выход или {} провалиться в нормальный поток разрешений. Для командных хуков выходной код 2 рассматривается как отказ; stdout JSON (если он есть) объединяется с {"behavior":"deny"}, а stderr игнорируется.

          `notification` Крюк

          `notification` Крюк срабатывает асинхронно, когда CLI издаёт системное уведомление. Эти хуки — это система «убери и забудь»: они никогда не блокируют сессию, а любые ошибки фиксируются и пропускаются.

          **Входные данные:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    hook_event_name: "Notification";
    message: string;           // Human-readable notification text
    title?: string;            // Short title (e.g., "Permission needed", "Shell completed")
    notification_type: string; // One of the types listed below
}
          **Типы уведомлений:**
ТипКогда он срабатывает
shell_completedЗаканчивается фоновая (асинхронная) команда shell
shell_detached_completedЗавершается отделённая оболочная сессия
agent_completedФоновый субагент заканчивает (выполнен или неудачно)
agent_idleАгент фона заканчивает ход и переходит в состояние простоя (ожидание write_agent)
permission_promptАгент запрашивает разрешение на запуск инструмента
elicitation_dialogАгент запрашивает дополнительную информацию у пользователя
          **Выходные данные:**
{
    additionalContext?: string; // Injected into the session as a user message
}

Если additionalContext он возвращается, текст вводится в сессию в виде предварительного пользовательского сообщения. Это может запустить дальнейшую обработку агентов, если сессия находится в простое. Возврат {} или опустошение выхода, чтобы не предпринимать действия.

          **Матчер:** Опциональный регуляр на `notification_type`. Паттерн закреплён как `^(?:pattern)$`. Опустите `matcher` все типы уведомлений.

Имена инструментов для подбора крючков

Имя инструментаDescription
ask_userЗадайте пользователю уточняющий вопрос.
bashВыполнять команды оболочки (Unix).
createСоздавайте новые файлы.
editИзменять содержимое файла.
globИщите файлы по шаблону.
grepПоиск по содержимому файла.
powershellВыполнять команды shell (Windows).
taskЗапускайте задачи субагентов.
viewЧтение содержимого файла.
web_fetchЗагружайте веб-страницы.

Если настраивать несколько хуков одного типа, они выполняются по порядку. Для preToolUse, если какой-либо крюк возвращается "deny", инструмент блокируется. Для командных хуков выход с кодом postToolUseFailure приводит к возврату stderr в качестве руководства 2 по восстановлению для помощника. Сбои с крючками (ненулевые коды выхода или тайм-ауты) фиксируются и пропускаются — они никогда не блокируют выполнение агентов.

Дополнительные материалы