Главная/Документация/Автоматизации/Обзор автоматизаций
Автоматизации

Обзор автоматизаций

Автоматизации позволяют автоматически выполнять действия при событиях в AIKraft Agents — от реакции на метки и изменения статусов до планируемых задач и уведомлений. Всё настраивается в одном JSON-файле.

Автоматизации позволяют выполнять действия автоматически при наступлении событий в AIKraft Agents. Вы можете запускать shell-команды, отправлять запросы для создания новых сессий или планировать повторяющиеся рабочие процессы — всё это настраивается в одном JSON-файле.

Просто спросите своего агента. Фразы вроде «создай автоматизацию, которая уведомляет меня, когда сессия помечена как срочная» или «настрой ежедневный утренний дайджест в 9:00». Агент сам создаст и проверит конфигурацию.

Начало работы

Самый простой способ настроить автоматизацию — описать, что вы хотите, на простом языке. Вот несколько примеров запросов:

Что вы хотитеЧто сказать
Ежедневный дайджест«Настрой ежедневный дайджест будничного стендапа в 9:00»
Уведомления на рабочем столе«Уведомляй меня macOS-уведомлением, когда сессия помечена как срочная»
Аудит логов«Записывай все изменения режима прав в файл»
Авто-метка«Когда сессия начинается, запусти команду, которая проверяет рабочую папку и записывает её»
Повторяющийся отчёт«Каждую пятницу в 17:00 создай сессию, которая подводит итоги завершённых задач за неделю»
Интеграция через вебхук«Когда я помечаю сессию, отправь curl-запрос на мой вебхук»

Первая автоматизация

Вот самая простая автоматизация — она записывает сообщение каждый раз, когда метка добавляется к сессии:

terminaljson
{
  "version": 2,
  "automations": {
    "LabelAdd": [
      {
        "actions": [
          { "type": "command", "command": "echo \"Label added: $CRAFT_LABEL\" >> ~/craft-automations.log" }
        ]
      }
    ]
  }
}

Сохраните это как ~/.craft-agent/workspaces/{workspaceId}/automations.json — и она сразу начинает работать, без перезапуска.

Планирование запроса

Хотите, чтобы AIKraft Agents делал что-то для вас по расписанию? Используйте действие типа prompt с cron-выражением:

terminaljson
{
  "version": 2,
  "automations": {
    "SchedulerTick": [
      {
        "cron": "0 9 * * 1-5",
        "timezone": "America/New_York",
        "labels": ["Scheduled"],
        "actions": [
          { "type": "prompt", "prompt": "Check @github for any new issues assigned to me and summarise them" }
        ]
      }
    ]
  }
}

Это создаёт новую сессию каждый будний день в 9:00, активирует источник GitHub и просит агента проверить ваши задачи. Сессия автоматически помечается как «Scheduled» для удобного фильтрования.

Как работают автоматизации

Когда событие срабатывает (например, метка добавлена, инструмент запущен или cron-расписание совпало), AIKraft Agents проверяет вашу конфигурацию на наличие подходящих записей и выполняет их.

Существует два типа действий:

  • Команды — выполняют shell-команды с данными события, доступными через переменные окружения
  • Запросы — отправляют запрос в AIKraft Agents, создавая новую сессию (только для App-событий)

Файл конфигурации

Автоматизации настраиваются на уровне workspace в файле automations.json:

terminalbash
~/.craft-agent/workspaces/{workspaceId}/automations.json

Базовая структура

terminaljson
{
  "version": 2,
  "automations": {
    "EventName": [
      {
        "matcher": "regex-pattern",
        "actions": [
          { "type": "command", "command": "echo 'Hello'" }
        ]
      }
    ]
  }
}

Каждый тип события соответствует массиву matcher-ов, а каждый matcher содержит массив действий, выполняемых при совпадении шаблона с значением события.

Управление автоматизациями

В интерфейсе

Автоматизации отображаются в боковой панели под **Автоматизациями**. Отсюда вы можете:

  • Включать / выключать — переключать отдельные автоматизации без удаления
  • Дублировать — создавать копию с суффиксом «Копия»
  • Удалять — удалять автоматизацию навсегда
  • Тестировать — вручную запустить автоматизацию, чтобы проверить её работу перед реальным событием. Тестовый запуск разрешает @упоминания, активирует источники и использует настроенное llmConnection/model — тот же путь выполнения, что и у планировщика.
  • История выполнений — каждая автоматизация записывает успехи и ошибки в временную шкалу, доступную на странице деталей. История хранится в automations-history.jsonl и сохраняет последние 20 запусков на автоматизацию (максимум 1000 записей).

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

В файле конфигурации

Вы также можете управлять автоматизациями, редактируя automations.json напрямую. Изменения вступают в силу сразу — без перезапуска.

Включение и выключение: Установите "enabled": false на любом matcher, чтобы временно отключить его без удаления конфигурации. Опустите поле или установите true, чтобы включить обратно.

terminaljson
{
  "matcher": "^urgent$",
  "enabled": false,
  "actions": [
    { "type": "command", "command": "notify-send 'Urgent!'" }
  ]
}

Удаление: Удалите запись matcher из automations.json. Если тип события не имеет оставшихся matcher-ов, удалите всю ключ события.

Спросите своего агента управлять автоматизациями за вас: «выключи все мои плановые автоматизации» или «удали автоматизацию уведомления о срочном». Агент прочитает и обновит automations.json напрямую.

События

App-события

Инициированы самим AIKraft Agents. Поддерживают команды и запросы.

СобытиеТриггерЗначение для сопоставления
LabelAddМетка добавлена к сессииID метки (например, urgent)
LabelRemoveМетка удалена из сессииID метки
LabelConfigChangeКонфигурация метки измененаВсегда совпадает
PermissionModeChangeРежим прав изменёнНовое имя режима
FlagChangeСессия помечена/лишена пометкиtrue или false
SessionStatusChangeСтатус сессии изменёнНовый статус (например, done)
SchedulerTickЗапускается каждую минутуИспользует cron-сопоставление

Переименовано: TodoStateChange переименовано в SessionStatusChange. Старое имя всё ещё работает как устаревший алиас, но выводит предупреждение о проверке. Обновите автоматизации для использования SessionStatusChange.

Изменения статуса: Чтобы реагировать на изменения статуса/рабочего состояния (например, когда сессия переходит в «готово» или «в процессе»), используйте событие SessionStatusChange. Значение для сопоставления — новое имя статуса, поэтому вы можете использовать matcher, например, "^done$", чтобы срабатывать только на определённые переходы.

События агента

Передаются в Claude SDK. Поддерживаются только команды (без запросов).

СобытиеТриггерЗначение для сопоставления
PreToolUseПеред выполнением инструментаИмя инструмента
PostToolUseПосле успешного выполнения инструментаИмя инструмента
PostToolUseFailureПосле ошибки выполнения инструментаИмя инструмента
UserPromptSubmitПользователь отправляет запросJSON данных события
SessionStartСессия начинаетсяJSON данных события
SessionEndСессия завершаетсяJSON данных события
StopАгент останавливаетсяJSON данных события
SubagentStartСубагент запущенJSON данных события
SubagentStopСубагент завершёнJSON данных события
NotificationУведомление полученоJSON данных события
PreCompactПеред компоновкой контекстаJSON данных события
PermissionRequestЗапрошено разрешениеJSON данных события
SetupНастройка/инициализация агентаJSON данных события

Типы действий

Команды

Выполняет shell-команду при срабатывании события. Данные события доступны через переменные окружения.

terminaljson
{
  "type": "command",
  "command": "echo \"Label $CRAFT_LABEL was added\" >> ~/automation-log.txt",
  "timeout": 60000
}
СвойствоТипПо умолчаниюОписание
type"command"ОбязательноТип действия
commandstringОбязательноShell-команда для выполнения
timeoutnumber60000Таймаут в миллисекундах

Запросы

Отправляет запрос в AIKraft Agents, создавая новую сессию. Работает только с App-событиями.

terminaljson
{
  "type": "prompt",
  "prompt": "Run the @weather skill and summarize today's forecast"
}
СвойствоТипПо умолчаниюОписание
type"prompt"ОбязательноТип действия
promptstringОбязательноТекст запроса для отправки
llmConnectionstringПо умолчанию для workspaceSlug LLM-подключения (настраивается в AI-настройках)
modelstringПо умолчанию для workspaceID модели для создаваемой сессии
thinkingLevel"off" | "low" | "medium" | "high" | "xhigh" | "max"По умолчанию для workspaceУровень рассуждений для создаваемой сессии

Функции:

  • Используйте @упоминания для ссылки на источники или скиллы (например, @github, @linear)
  • Переменные окружения раскрываются (например, $CRAFT_LABEL, ${CRAFT_SESSION_NAME})
  • Упомянутые источники автоматически активируются для новой сессии

Переопределения на уровне действия: Вы можете переопределить AI-провайдера, модель и уровень рассуждений для сессии, создаваемой запросом. Каждое поле независимо — опустите любое из них, чтобы унаследовать значение по умолчанию для workspace.

terminaljson
{
  "type": "prompt",
  "prompt": "Quick code review of recent changes",
  "llmConnection": "my-copilot-connection",
  "model": "gemini-2.5-flash",
  "thinkingLevel": "high"
}

Значение llmConnection — это slug LLM-подключения, настроенного в AI-настройках. Значение model — это ID модели, поддерживаемой провайдером. Если значение недействительно или не найдено, оно плавно переходит к значению по умолчанию для workspace.

Разрешение уровня рассуждений: thinkingLevel на действии имеет приоритет; если опущен, применяется значение по умолчанию для workspace; если ни то, ни другое не задано, сессии по умолчанию используют "medium". Устаревшее значение "think" из старых конфигураций автоматически мигрируется в "medium". Бэкенды плавно ограничивают неподдерживаемые значения (например, Anthropic автоматически понижает xhigh до high на моделях, которые это не поддерживают; Pi ограничивает max до xhigh).

Matcher-ы

Регулярные выражения

Большинство событий используют regex-сопоставление со значением события:

terminaljson
{
  "matcher": "^urgent$",
  "actions": [
    { "type": "command", "command": "notify-send 'Urgent!'" }
  ]
}

Опустите поле matcher, чтобы сопоставить все события этого типа.

Примеры:

ШаблонСовпадения
^urgent$Точное совпадение с «urgent»
bug\|featureЛибо «bug», либо «feature»
^prod-Любое значение, начинающееся с «prod-»
(опущен)Все события этого типа

Cron-сопоставление

Для событий SchedulerTick используйте cron-выражения вместо regex:

terminaljson
{
  "cron": "0 9 * * 1-5",
  "timezone": "Europe/Budapest",
  "actions": [
    { "type": "prompt", "prompt": "Give me a morning briefing" }
  ]
}

Формат cron: minute hour day-of-month month day-of-week

ПолеДиапазонПримеры
Минута0–590, */15
Час0–239, 14
День месяца1–311, 15
Месяц1–121, */3
День недели0–6 (0 = воскресенье)1-5, 0,6

Частые шаблоны:

CronРасписание
*/15 * * * *Каждые 15 минут
0 9 * * *Ежедневно в 9:00
0 9 * * 1-5По будним дням в 9:00
30 14 1 * *1-го числа каждого месяца в 14:30
0 */6 * * *Каждые 6 часов

Часовой пояс: Используются имена IANA (например, Europe/Budapest, America/New_York). По умолчанию используется системный часовой пояс. Проверьте с помощью [crontab.guru](https://crontab.guru/).

Условия

Условия — это необязательные фильтры, которые выполняются после совпадения matcher/cron, но перед запуском действий. Все условия в массиве должны пройти (неявный AND). Если массив пуст или опущен, действия выполняются безусловно.

Условия комбинируются — вы можете объединить временные окна, фильтры дней недели и проверки состояния, чтобы создать точные триггеры автоматизации без сложных cron-выражений.

terminaljson
{
  "cron": "0 9 * * *",
  "timezone": "Europe/Budapest",
  "conditions": [
    {
      "condition": "time",
      "weekday": ["mon", "tue", "wed", "thu", "fri"]
    }
  ],
  "actions": [
    { "type": "prompt", "prompt": "Good morning! Here's your daily briefing." }
  ]
}

Временные условия

Проверяет время суток и день недели в заданном часовом поясе.

terminaljson
{
  "condition": "time",
  "after": "09:00",
  "before": "17:00",
  "weekday": ["mon", "tue", "wed", "thu", "fri"],
  "timezone": "Europe/Budapest"
}
СвойствоТипОписание
after"HH:MM"Начало временного окна (включительно)
before"HH:MM"Конец временного окна (эксклюзивно)
weekdaystring[]Разрешённые дни: mon, tue, wed, thu, fri, sat, sun
timezonestringIANA часовой пояс. Переходит к часовому поясу matcher, затем к системному локальному

Ночные диапазоны: Если after позже, чем before (например, "after": "22:00", "before": "06:00"), диапазон переносится через полночь.

Состояние условий

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

terminaljson
{
  "condition": "state",
  "field": "permissionMode",
  "from": "safe",
  "to": "allow-all"
}
СвойствоТипОписание
fieldstringИмя поля полезной нагрузки (например, permissionMode, sessionStatus, labels, isFlagged)
valueanyТочное совпадение
fromanyПредыдущее значение (для событий перехода)
toanyНовое значение (для событий перехода)
containsstringПроверка принадлежности к массиву (например, проверка наличия метки)
not_valueanyСовпадает с чем угодно, кроме этого значения

Поля перехода: Для permissionMode и sessionStatus, from/to автоматически разрешаются в соответствующие ключи полезной нагрузки (oldMode/newMode, oldState/newState).

Логическая композиция

Комбинируйте условия с помощью and, or и not:

terminaljson
{
  "condition": "and",
  "conditions": [
    { "condition": "time", "weekday": ["mon", "tue", "wed", "thu", "fri"] },
    { "condition": "time", "after": "09:00", "before": "17:00" }
  ]
}
terminaljson
{
  "condition": "or",
  "conditions": [
    { "condition": "state", "field": "permissionMode", "value": "allow-all" },
    { "condition": "state", "field": "isFlagged", "value": true }
  ]
}
terminaljson
{
  "condition": "not",
  "conditions": [
    { "condition": "time", "weekday": ["sat", "sun"] }
  ]
}
ТипПоведение
andВсе под-условия должны пройти
orХотя бы одно под-условие должно пройти
notНи одно из под-условий не должно пройти

Условия могут быть вложены до 8 уровней. Предупреждение о упрощении выводится на глубине 4. По возможности держите условия плоскими. Неизвестные типы условий закрываются (вычисляются как false).

Опции matcher-а

Каждая запись matcher поддерживает следующие необязательные поля:

СвойствоТипПо умолчаниюОписание
matcherstringСовпадает со всемиRegex-шаблон для фильтрации событий
cronstringCron-выражение (только SchedulerTick)
timezonestringСистемный TZIANA часовой пояс для cron
conditionsarray[]Условия, которые должны пройти перед запуском действий (см. Условия)
permissionModestring"safe"Режим безопасности для команд
labelsstring[][]Метки, применяемые к создаваемым сессиям
telegramTopicstringМаршрутизирует создаваемые сессии в тему форума Telegram — см. Маршрутизация тем Telegram
enabledbooleantrueУстановите false, чтобы отключить без удаления
actionsarrayОбязательноМассив действий команд/запросов

Маршрутизация тем Telegram

Когда у вас есть супергруппа Telegram, настроенная в Настройки → Сообщения → Telegram, вы можете маршрутизировать сессии, создаваемые matcher-ом, в выделенную тему форума, установив поле telegramTopic.

terminaljson
{
  "automations": {
    "LabelAdd": [
      {
        "matcher": "^urgent$",
        "telegramTopic": "Urgent Alerts",
        "permissionMode": "ask",
        "actions": [
          { "type": "prompt", "prompt": "Look at the urgent issue: $LABEL" }
        ]
      }
    ]
  }
}

Когда matcher срабатывает, создаваемая сессия привязывается к теме форума с заданным именем. Тема создаётся при первом использовании и переиспользуется впоследствие, поэтому последующие запуски того же matcher (и любого другого matcher, использующего то же значение telegramTopic) публикуются в той же теме.

Требования активации

Все перечисленное должно быть выполнено; иначе поле тихо игнорируется, и сессия запускается без привязки к Telegram (как если бы поле отсутствовало):

  • Супергруппа Telegram настроена на Настройки → Сообщения → Telegram
  • Бот Telegram подключён
  • Бот имеет разрешение администратора Управление темами в супергруппе

Настройка супергруппы Telegram

Если вы ещё не настроили супергруппу, следуйте этим шагам. Весь процесс занимает около минуты.

1. Создайте супергруппу с включёнными темами

Обычная группа Telegram не может хостить темы — вам нужна супергруппа с включённым режимом «Темы».

  • Новая группа: Telegram → Новая группа → добавьте кого-либо (или себя для одиночного workspace) → задайте имя. Telegram автоматически преобразует группы в супергруппы, когда количество участников превышает порог или вы включаете темы.
  • Включите темы: Откройте группу → нажмите на имя группы → Изменить (значок карандаша на мобильном, ⋯ на десктопе) → переключите Темы включённым → Сохранить. Группа теперь является форум-супергруппой; вы увидите тему «Общие» и кнопку «+» для создания новых.

2. Добавьте бота в супергруппу

Откройте супергруппу → нажмите на имя группы → Добавить участников → найдите имя пользователя вашего бота (например, @CraftAgentsBot) → добавьте его.

3. Сделайте бота администратором с разрешением «Управление темами»

Это шаг, который чаще всего упускают — боту нужен явный доступ для создания новых тем, иначе вызовы создания тем возвращают 400: Bad Request: not enough rights to create a topic.

  1. В супергруппе нажмите на имя группы → ИзменитьАдминистраторы.
  2. Нажмите Добавить администратора → выберите бота.
  3. В списке разрешений включите Управление темами (другие разрешения, такие как Удаление сообщений или Закрепление сообщений, необязательны и не требуются функцией маршрутизации тем).
  4. Нажмите Сохранить / Готово.

Проверьте после настройки: в приложении AIKraft Agents откройте Настройки → Сообщения → Telegram и убедитесь, что строка «Супергруппа» отображает название группы. Первый запуск автоматизации выведет ошибку в ~/.craft-agent/logs/messaging-gateway.log, если бот всё ещё не имеет разрешения «Управление темами» — ищите automation_topic_bind_failed.

4. Настройте супергруппу с workspace

  1. В приложении AIKraft Agents: Настройки → Сообщения → Telegram → Настроить супергруппу.
  2. Диалог отображает 6-значный код, прямую ссылку на бота и обратный отсчёт 5 минут.
  3. В Telegram, в любой теме вашей супергруппы, введите /pair <code> (замените <code> на цифры из диалога).
  4. Бот отвечает подтверждением. Диалог закрывается автоматически, и строка Настроек обновляется названием супергруппы и ID чата.

Готово — автоматизации с установленным telegramTopic теперь создают темы в этой супергруппе.

Примечания

  • Имена тем 1–128 символов и чувствительны к регистру ("Reports" и "reports" — разные темы).
  • Два matcher-а с одинаковым значением telegramTopic используют одну тему — удобно для группировки связанных автоматизаций.
  • Если вы измените значение telegramTopic matcher-а, следующий запуск использует (или создаёт) новую тему; старая тема остаётся в Telegram с сохранённой историей.
  • Переименование темы в Telegram не синхронизируется обратно — привязка следует за ID темы, а не отображаемым именем.

Переменные окружения

Общие переменные

Доступны для всех команд:

ПеременнаяОписание
CRAFT_EVENTИмя события (например, LabelAdd, PreToolUse)
CRAFT_EVENT_DATAПолная полезная нагрузка события в формате JSON
CRAFT_SESSION_IDID текущей сессии
CRAFT_SESSION_NAMEИмя текущей сессии
CRAFT_WORKSPACE_IDID текущего workspace

Переменные App-событий

Динамически генерируются из полезных нагрузок событий:

События меток (LabelAdd, LabelRemove):

  • CRAFT_LABEL — ID метки, добавляемой/удаляемой

PermissionModeChange:

  • CRAFT_OLD_MODE — Предыдущий режим прав
  • CRAFT_NEW_MODE — Новый режим прав

FlagChange:

  • CRAFT_IS_FLAGGEDtrue или false

SessionStatusChange:

  • CRAFT_OLD_STATE — Предыдущий статус сессии
  • CRAFT_NEW_STATE — Новый статус сессии

SchedulerTick:

  • CRAFT_LOCAL_TIME — Текущее время (HH:MM)
  • CRAFT_LOCAL_DATE — Текущая дата (YYYY-MM-DD)

Переменные событий агента

События инструментов (PreToolUse, PostToolUse, PostToolUseFailure):

  • CRAFT_TOOL_NAME — Используемый инструмент
  • CRAFT_TOOL_INPUT — Параметры инструмента в формате JSON
  • CRAFT_TOOL_RESPONSE — Вывод инструмента (только PostToolUse)
  • CRAFT_ERROR — Сообщение об ошибке (только PostToolUseFailure)

События сессий (SessionStart):

  • CRAFT_SOURCE — Источник сессии (например, startup, resume)
  • CRAFT_MODEL — Имя модели

События субагентов (SubagentStart, SubagentStop):

  • CRAFT_AGENT_ID — ID субагента
  • CRAFT_AGENT_TYPE — Тип субагента

Режимы прав

Команды выполняются с проверками безопасности по умолчанию. Вы можете настроить это для каждого matcher:

РежимПоведениеСценарий использования
safeКоманды проверяются по списку разрешённогоПо умолчанию, рекомендуется
allow-allОбход проверок безопасностиТолько для доверенных автоматизаций

Только используйте allow-all для команд, которым вы полностью доверяете. Это позволяет выполнять произвольные shell-команды.

terminaljson
{
  "matcher": "^urgent$",
  "permissionMode": "allow-all",
  "actions": [
    { "type": "command", "command": "osascript -e 'display notification \"Urgent!\" with title \"Craft Agent\"'" }
  ]
}

Метки для запросов

Запросы могут прикреплять метки к создаваемым сессиям. Это упрощает фильтрацию и организацию плановых сессий:

terminaljson
{
  "cron": "0 9 * * *",
  "labels": ["Scheduled", "morning-briefing"],
  "actions": [
    { "type": "prompt", "prompt": "Give me today's priorities" }
  ]
}

Метки также поддерживают раскрытие переменных окружения: "priority::${CRAFT_LABEL}".

Ограничения скорости

Чтобы предотвратить бесконечные циклы (например, автоматизацию, которая косвенно запускает саму себя), шина событий навязывает ограничения скорости:

СобытиеМаксимальное количество запусков / минуту
SchedulerTick60 (1/сек)
Все остальные события10

Избыточные события тихо отбрасываются на оставшуюююю часть 60-секундного окна.

Примеры

Ежедневный утренний дайджест

Планирует запрос каждый будний день в 9:00:

terminaljson
{
  "version": 2,
  "automations": {
    "SchedulerTick": [
      {
        "cron": "0 9 * * 1-5",
        "timezone": "Europe/Budapest",
        "labels": ["Scheduled", "briefing"],
        "actions": [
          { "type": "prompt", "prompt": "Run the @daily-standup skill" }
        ]
      }
    ]
  }
}

Новости ИИ по будним дням (с условиями)

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

terminaljson
{
  "version": 2,
  "automations": {
    "SchedulerTick": [
      {
        "name": "Morning AI news",
        "cron": "0 9 * * *",
        "timezone": "Europe/Budapest",
        "conditions": [
          {
            "condition": "time",
            "weekday": ["mon", "tue", "wed", "thu", "fri"],
            "timezone": "Europe/Budapest"
          }
        ],
        "labels": ["Scheduled", "ai-news"],
        "actions": [
          { "type": "prompt", "prompt": "Run the @ai-news skill and summarize today's AI developments" }
        ]
      }
    ]
  }
}

Ворота режима прав (с условиями)

Уведомляйте только при изменении режима прав именно с safe на allow-all:

terminaljson
{
  "version": 2,
  "automations": {
    "PermissionModeChange": [
      {
        "conditions": [
          {
            "condition": "state",
            "field": "permissionMode",
            "from": "safe",
            "to": "allow-all"
          }
        ],
        "actions": [
          { "type": "command", "command": "osascript -e 'display notification \"Permission escalated to allow-all\" with title \"Craft Agent\"'" }
        ]
      }
    ]
  }
}

Журнал изменений меток

Отслеживайте, когда метки добавляются или удаляются:

terminaljson
{
  "version": 2,
  "automations": {
    "LabelAdd": [
      {
        "permissionMode": "allow-all",
        "actions": [
          { "type": "command", "command": "echo \"[$(date)] Added: $CRAFT_LABEL\" >> ~/label-log.txt" }
        ]
      }
    ],
    "LabelRemove": [
      {
        "permissionMode": "allow-all",
        "actions": [
          { "type": "command", "command": "echo \"[$(date)] Removed: $CRAFT_LABEL\" >> ~/label-log.txt" }
        ]
      }
    ]
  }
}

macOS-уведомление при срочной метке

terminaljson
{
  "version": 2,
  "automations": {
    "LabelAdd": [
      {
        "matcher": "^urgent$",
        "permissionMode": "allow-all",
        "actions": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Urgent session flagged\" with title \"Craft Agent\"'"
          }
        ]
      }
    ]
  }
}

Аудит изменений режима прав

terminaljson
{
  "version": 2,
  "automations": {
    "PermissionModeChange": [
      {
        "permissionMode": "allow-all",
        "actions": [
          {
            "type": "command",
            "command": "echo \"$(date): $CRAFT_OLD_MODE -> $CRAFT_NEW_MODE\" >> ~/mode-audit.log"
          }
        ]
      }
    ]
  }
}

Несколько расписаний с включением/выключением

Запускайте разные автоматизации в разное время и отключайте некоторые без удаления:

terminaljson
{
  "version": 2,
  "automations": {
    "SchedulerTick": [
      {
        "cron": "0 9 * * 1-5",
        "timezone": "Europe/Budapest",
        "labels": ["Scheduled"],
        "actions": [
          { "type": "prompt", "prompt": "Give me a morning briefing" }
        ]
      },
      {
        "cron": "0 17 * * 5",
        "timezone": "Europe/Budapest",
        "enabled": false,
        "labels": ["Scheduled"],
        "actions": [
          { "type": "prompt", "prompt": "Summarise this week's completed tasks" }
        ]
      }
    ]
  }
}

Вторая автоматизация (пятничный обзор) отключена и не запустится, пока "enabled" не будет установлен в true или удалён.

Запрос с пользовательским подключением, моделью и уровнем рассуждений

Переопределяйте провайдера, модель и уровень рассуждений для конкретной автоматизации:

terminaljson
{
  "version": 2,
  "automations": {
    "SchedulerTick": [
      {
        "cron": "0 8 * * 1-5",
        "timezone": "Europe/Budapest",
        "labels": ["Scheduled"],
        "actions": [
          {
            "type": "prompt",
            "prompt": "Review overnight @github pull requests",
            "llmConnection": "openrouter",
            "model": "anthropic/claude-sonnet-4.6",
            "thinkingLevel": "high"
          }
        ]
      }
    ]
  }
}

Проверка

Попросите AIKraft Agents проверить вашу конфигурацию автоматизаций:

terminalbash
Validate my automations configuration

Или используйте инструмент config_validate с target: "all".

Проверяющий скрипт проверяет:

  • Недопустимый синтаксис JSON
  • Неизвестные имена событий
  • Пустые массивы действий
  • Недопустимые cron-выражения или часовые пояса
  • Недопустимые или небезопасные regex-шаблоны (предотвращение ReDoS)
  • Ссылки на несуществующие метки
  • Недопустимые типы условий, имена полей или значения дней недели
  • Глубина вложенности условий, превышающая лимиты
  • Отсутствующие slug-и llmConnection (ошибка — не выполнится во время выполнения)
  • Несоответствия модели/провайдера при указании обоих llmConnection и model (предупреждение)
  • Недопустимые значения thinkingLevel (устаревшее "think" автоматически мигрируется в "medium")

Безопасность

Автоматизации включают несколько встроенных мер безопасности:

  • Предотвращение инъекций в shell — значения, управляемые пользователем, в переменных окружения (имена сессий, метки, запросы) автоматически экранируются
  • Защита от ReDoS — regex-шаблоны ограничены 500 символами и проверяются на катастрофические паттерны
  • Ограничение скорости — предотвращает бесконечные циклы от автоматизаций, которые запускают друг друга
  • Режимы прав — команды проверяются по списку разрешённого по умолчанию
  • Таймауты — команды завершаются после истечения таймаута (с запасным SIGKILL)

Лучшие практики

  • Начинайте просто — тестируйте с командами echo перед написанием сложных скриптов
  • Используйте метки — помечайте плановые сессии для удобной фильтрации
  • Устанавливайте таймауты — предотвращайте зависшие команды с помощью поля timeout
  • Записывайте ошибки — перенаправляйте stderr для отслеживания проблем: command 2>> ~/automation-errors.log
  • Будьте конкретны — используйте matcher-ы, чтобы избежать срабатывания на каждом событии
  • Тестируйте cron — используйте [crontab.guru](https://crontab.guru/), чтобы проверить выражения
  • Используйте enabled: false — временно отключайте автоматизации вместо удаления во время отладки

Устранение неполадок: автоматизация не срабатывает

  1. Проверьте имя события — должно быть точным (например, LabelAdd, а не labeladd)
  2. Проверьте matcher — regex должен совпадать со значением события
  3. Проверьте cron — для SchedulerTick проверьте cron-выражение
  4. Проверьте enabled — убедитесь, что matcher не имеет "enabled": false
  5. Проверьте логи — ищите [automations] в логах приложения

Устранение неполадок: команда заблокирована

Если вы видите ошибки «Bash command blocked»:

  1. Добавьте "permissionMode": "allow-all" в matcher
  2. Или упростите команду, чтобы избежать конструкций shell, таких как $()

Устранение неполадок: запрос не создаёт сессию

  1. Убедитесь, что событие является App-событием (запросы не работают с событиями агента)
  2. Проверьте, что текст запроса не пуст
  3. Проверьте, что @упоминания ссылаются на действительные источники или скиллы

Устранение неполадок: условие не совпадает

  1. Проверьте написание дней недели — должно быть 3-буквенным в нижнем регистре: mon, tue, wed, thu, fri, sat, sun
  2. Проверьте часовой пояс — используйте имена IANA (например, Europe/Budapest). Недопустимые часовые пояса тихо переходят к системному локальному
  3. Проверьте формат времени — должен быть HH:MM в 24-часовом формате (например, 09:00, а не 9:00 AM)
  4. Проверьте имена полей состояния — используйте permissionMode, sessionStatus, labels, isFlagged
  5. Проверьте глубину вложенности — условия, вложенные глубже 8 уровней, всегда вычисляются как false
  6. Проверьте логи — ищите записи [automations], упоминающие оценку условий

Нужен такой агент в вашей компании?

Устанавливаем под ключ: настройка на компьютерах сотрудников, единый аккаунт, интеграция с 1С и внутренними системами, обучение команды. Подробнее о внедрении →