Обзор автоматизаций
Автоматизации позволяют автоматически выполнять действия при событиях в AIKraft Agents — от реакции на метки и изменения статусов до планируемых задач и уведомлений. Всё настраивается в одном JSON-файле.
Автоматизации позволяют выполнять действия автоматически при наступлении событий в AIKraft Agents. Вы можете запускать shell-команды, отправлять запросы для создания новых сессий или планировать повторяющиеся рабочие процессы — всё это настраивается в одном JSON-файле.
Просто спросите своего агента. Фразы вроде «создай автоматизацию, которая уведомляет меня, когда сессия помечена как срочная» или «настрой ежедневный утренний дайджест в 9:00». Агент сам создаст и проверит конфигурацию.
Начало работы
Самый простой способ настроить автоматизацию — описать, что вы хотите, на простом языке. Вот несколько примеров запросов:
| Что вы хотите | Что сказать |
|---|---|
| Ежедневный дайджест | «Настрой ежедневный дайджест будничного стендапа в 9:00» |
| Уведомления на рабочем столе | «Уведомляй меня macOS-уведомлением, когда сессия помечена как срочная» |
| Аудит логов | «Записывай все изменения режима прав в файл» |
| Авто-метка | «Когда сессия начинается, запусти команду, которая проверяет рабочую папку и записывает её» |
| Повторяющийся отчёт | «Каждую пятницу в 17:00 создай сессию, которая подводит итоги завершённых задач за неделю» |
| Интеграция через вебхук | «Когда я помечаю сессию, отправь curl-запрос на мой вебхук» |
Первая автоматизация
Вот самая простая автоматизация — она записывает сообщение каждый раз, когда метка добавляется к сессии:
{
"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-выражением:
{
"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:
~/.craft-agent/workspaces/{workspaceId}/automations.jsonБазовая структура
{
"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, чтобы включить обратно.
{
"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-команду при срабатывании события. Данные события доступны через переменные окружения.
{
"type": "command",
"command": "echo \"Label $CRAFT_LABEL was added\" >> ~/automation-log.txt",
"timeout": 60000
}| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
type | "command" | Обязательно | Тип действия |
command | string | Обязательно | Shell-команда для выполнения |
timeout | number | 60000 | Таймаут в миллисекундах |
Запросы
Отправляет запрос в AIKraft Agents, создавая новую сессию. Работает только с App-событиями.
{
"type": "prompt",
"prompt": "Run the @weather skill and summarize today's forecast"
}| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
type | "prompt" | Обязательно | Тип действия |
prompt | string | Обязательно | Текст запроса для отправки |
llmConnection | string | По умолчанию для workspace | Slug LLM-подключения (настраивается в AI-настройках) |
model | string | По умолчанию для workspace | ID модели для создаваемой сессии |
thinkingLevel | "off" | "low" | "medium" | "high" | "xhigh" | "max" | По умолчанию для workspace | Уровень рассуждений для создаваемой сессии |
Функции:
- Используйте
@упоминаниядля ссылки на источники или скиллы (например,@github,@linear) - Переменные окружения раскрываются (например,
$CRAFT_LABEL,${CRAFT_SESSION_NAME}) - Упомянутые источники автоматически активируются для новой сессии
Переопределения на уровне действия: Вы можете переопределить AI-провайдера, модель и уровень рассуждений для сессии, создаваемой запросом. Каждое поле независимо — опустите любое из них, чтобы унаследовать значение по умолчанию для workspace.
{
"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-сопоставление со значением события:
{
"matcher": "^urgent$",
"actions": [
{ "type": "command", "command": "notify-send 'Urgent!'" }
]
}Опустите поле matcher, чтобы сопоставить все события этого типа.
Примеры:
| Шаблон | Совпадения |
|---|---|
^urgent$ | Точное совпадение с «urgent» |
bug\|feature | Либо «bug», либо «feature» |
^prod- | Любое значение, начинающееся с «prod-» |
| (опущен) | Все события этого типа |
Cron-сопоставление
Для событий SchedulerTick используйте cron-выражения вместо regex:
{
"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–59 | 0, */15 |
| Час | 0–23 | 9, 14 |
| День месяца | 1–31 | 1, 15 |
| Месяц | 1–12 | 1, */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-выражений.
{
"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." }
]
}Временные условия
Проверяет время суток и день недели в заданном часовом поясе.
{
"condition": "time",
"after": "09:00",
"before": "17:00",
"weekday": ["mon", "tue", "wed", "thu", "fri"],
"timezone": "Europe/Budapest"
}| Свойство | Тип | Описание |
|---|---|---|
after | "HH:MM" | Начало временного окна (включительно) |
before | "HH:MM" | Конец временного окна (эксклюзивно) |
weekday | string[] | Разрешённые дни: mon, tue, wed, thu, fri, sat, sun |
timezone | string | IANA часовой пояс. Переходит к часовому поясу matcher, затем к системному локальному |
Ночные диапазоны: Если
afterпозже, чемbefore(например,"after": "22:00", "before": "06:00"), диапазон переносится через полночь.
Состояние условий
Проверяет поля из полезной нагрузки события. Полезно для фильтрации по конкретным переходам или значениям.
{
"condition": "state",
"field": "permissionMode",
"from": "safe",
"to": "allow-all"
}| Свойство | Тип | Описание |
|---|---|---|
field | string | Имя поля полезной нагрузки (например, permissionMode, sessionStatus, labels, isFlagged) |
value | any | Точное совпадение |
from | any | Предыдущее значение (для событий перехода) |
to | any | Новое значение (для событий перехода) |
contains | string | Проверка принадлежности к массиву (например, проверка наличия метки) |
not_value | any | Совпадает с чем угодно, кроме этого значения |
Поля перехода: Для
permissionModeиsessionStatus,from/toавтоматически разрешаются в соответствующие ключи полезной нагрузки (oldMode/newMode,oldState/newState).
Логическая композиция
Комбинируйте условия с помощью and, or и not:
{
"condition": "and",
"conditions": [
{ "condition": "time", "weekday": ["mon", "tue", "wed", "thu", "fri"] },
{ "condition": "time", "after": "09:00", "before": "17:00" }
]
}{
"condition": "or",
"conditions": [
{ "condition": "state", "field": "permissionMode", "value": "allow-all" },
{ "condition": "state", "field": "isFlagged", "value": true }
]
}{
"condition": "not",
"conditions": [
{ "condition": "time", "weekday": ["sat", "sun"] }
]
}| Тип | Поведение |
|---|---|
and | Все под-условия должны пройти |
or | Хотя бы одно под-условие должно пройти |
not | Ни одно из под-условий не должно пройти |
Условия могут быть вложены до 8 уровней. Предупреждение о упрощении выводится на глубине 4. По возможности держите условия плоскими. Неизвестные типы условий закрываются (вычисляются как false).
Опции matcher-а
Каждая запись matcher поддерживает следующие необязательные поля:
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
matcher | string | Совпадает со всеми | Regex-шаблон для фильтрации событий |
cron | string | — | Cron-выражение (только SchedulerTick) |
timezone | string | Системный TZ | IANA часовой пояс для cron |
conditions | array | [] | Условия, которые должны пройти перед запуском действий (см. Условия) |
permissionMode | string | "safe" | Режим безопасности для команд |
labels | string[] | [] | Метки, применяемые к создаваемым сессиям |
telegramTopic | string | — | Маршрутизирует создаваемые сессии в тему форума Telegram — см. Маршрутизация тем Telegram |
enabled | boolean | true | Установите false, чтобы отключить без удаления |
actions | array | Обязательно | Массив действий команд/запросов |
Маршрутизация тем Telegram
Когда у вас есть супергруппа Telegram, настроенная в Настройки → Сообщения → Telegram, вы можете маршрутизировать сессии, создаваемые matcher-ом, в выделенную тему форума, установив поле telegramTopic.
{
"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.
- В супергруппе нажмите на имя группы → Изменить → Администраторы.
- Нажмите Добавить администратора → выберите бота.
- В списке разрешений включите Управление темами (другие разрешения, такие как Удаление сообщений или Закрепление сообщений, необязательны и не требуются функцией маршрутизации тем).
- Нажмите Сохранить / Готово.
Проверьте после настройки: в приложении AIKraft Agents откройте Настройки → Сообщения → Telegram и убедитесь, что строка «Супергруппа» отображает название группы. Первый запуск автоматизации выведет ошибку в
~/.craft-agent/logs/messaging-gateway.log, если бот всё ещё не имеет разрешения «Управление темами» — ищитеautomation_topic_bind_failed.
4. Настройте супергруппу с workspace
- В приложении AIKraft Agents: Настройки → Сообщения → Telegram → Настроить супергруппу.
- Диалог отображает 6-значный код, прямую ссылку на бота и обратный отсчёт 5 минут.
- В Telegram, в любой теме вашей супергруппы, введите
/pair <code>(замените<code>на цифры из диалога). - Бот отвечает подтверждением. Диалог закрывается автоматически, и строка Настроек обновляется названием супергруппы и ID чата.
Готово — автоматизации с установленным telegramTopic теперь создают темы в этой супергруппе.
Примечания
- Имена тем 1–128 символов и чувствительны к регистру (
"Reports"и"reports"— разные темы). - Два matcher-а с одинаковым значением
telegramTopicиспользуют одну тему — удобно для группировки связанных автоматизаций. - Если вы измените значение
telegramTopicmatcher-а, следующий запуск использует (или создаёт) новую тему; старая тема остаётся в Telegram с сохранённой историей. - Переименование темы в Telegram не синхронизируется обратно — привязка следует за ID темы, а не отображаемым именем.
Переменные окружения
Общие переменные
Доступны для всех команд:
| Переменная | Описание |
|---|---|
CRAFT_EVENT | Имя события (например, LabelAdd, PreToolUse) |
CRAFT_EVENT_DATA | Полная полезная нагрузка события в формате JSON |
CRAFT_SESSION_ID | ID текущей сессии |
CRAFT_SESSION_NAME | Имя текущей сессии |
CRAFT_WORKSPACE_ID | ID текущего workspace |
Переменные App-событий
Динамически генерируются из полезных нагрузок событий:
События меток (LabelAdd, LabelRemove):
CRAFT_LABEL— ID метки, добавляемой/удаляемой
PermissionModeChange:
CRAFT_OLD_MODE— Предыдущий режим правCRAFT_NEW_MODE— Новый режим прав
FlagChange:
CRAFT_IS_FLAGGED—trueили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— Параметры инструмента в формате JSONCRAFT_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-команды.
{
"matcher": "^urgent$",
"permissionMode": "allow-all",
"actions": [
{ "type": "command", "command": "osascript -e 'display notification \"Urgent!\" with title \"Craft Agent\"'" }
]
}Метки для запросов
Запросы могут прикреплять метки к создаваемым сессиям. Это упрощает фильтрацию и организацию плановых сессий:
{
"cron": "0 9 * * *",
"labels": ["Scheduled", "morning-briefing"],
"actions": [
{ "type": "prompt", "prompt": "Give me today's priorities" }
]
}Метки также поддерживают раскрытие переменных окружения: "priority::${CRAFT_LABEL}".
Ограничения скорости
Чтобы предотвратить бесконечные циклы (например, автоматизацию, которая косвенно запускает саму себя), шина событий навязывает ограничения скорости:
| Событие | Максимальное количество запусков / минуту |
|---|---|
SchedulerTick | 60 (1/сек) |
| Все остальные события | 10 |
Избыточные события тихо отбрасываются на оставшуюююю часть 60-секундного окна.
Примеры
Ежедневный утренний дайджест
Планирует запрос каждый будний день в 9:00:
{
"version": 2,
"automations": {
"SchedulerTick": [
{
"cron": "0 9 * * 1-5",
"timezone": "Europe/Budapest",
"labels": ["Scheduled", "briefing"],
"actions": [
{ "type": "prompt", "prompt": "Run the @daily-standup skill" }
]
}
]
}
}Новости ИИ по будним дням (с условиями)
Используйте временное условие, чтобы ограничить ежедневный график будними днями:
{
"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:
{
"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\"'" }
]
}
]
}
}Журнал изменений меток
Отслеживайте, когда метки добавляются или удаляются:
{
"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-уведомление при срочной метке
{
"version": 2,
"automations": {
"LabelAdd": [
{
"matcher": "^urgent$",
"permissionMode": "allow-all",
"actions": [
{
"type": "command",
"command": "osascript -e 'display notification \"Urgent session flagged\" with title \"Craft Agent\"'"
}
]
}
]
}
}Аудит изменений режима прав
{
"version": 2,
"automations": {
"PermissionModeChange": [
{
"permissionMode": "allow-all",
"actions": [
{
"type": "command",
"command": "echo \"$(date): $CRAFT_OLD_MODE -> $CRAFT_NEW_MODE\" >> ~/mode-audit.log"
}
]
}
]
}
}Несколько расписаний с включением/выключением
Запускайте разные автоматизации в разное время и отключайте некоторые без удаления:
{
"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 или удалён.
Запрос с пользовательским подключением, моделью и уровнем рассуждений
Переопределяйте провайдера, модель и уровень рассуждений для конкретной автоматизации:
{
"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 проверить вашу конфигурацию автоматизаций:
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— временно отключайте автоматизации вместо удаления во время отладки
Устранение неполадок: автоматизация не срабатывает
- Проверьте имя события — должно быть точным (например,
LabelAdd, а неlabeladd) - Проверьте matcher — regex должен совпадать со значением события
- Проверьте cron — для SchedulerTick проверьте cron-выражение
- Проверьте enabled — убедитесь, что matcher не имеет
"enabled": false - Проверьте логи — ищите
[automations]в логах приложения
Устранение неполадок: команда заблокирована
Если вы видите ошибки «Bash command blocked»:
- Добавьте
"permissionMode": "allow-all"в matcher - Или упростите команду, чтобы избежать конструкций shell, таких как
$()
Устранение неполадок: запрос не создаёт сессию
- Убедитесь, что событие является App-событием (запросы не работают с событиями агента)
- Проверьте, что текст запроса не пуст
- Проверьте, что
@упоминанияссылаются на действительные источники или скиллы
Устранение неполадок: условие не совпадает
- Проверьте написание дней недели — должно быть 3-буквенным в нижнем регистре:
mon,tue,wed,thu,fri,sat,sun - Проверьте часовой пояс — используйте имена IANA (например,
Europe/Budapest). Недопустимые часовые пояса тихо переходят к системному локальному - Проверьте формат времени — должен быть
HH:MMв 24-часовом формате (например,09:00, а не9:00 AM) - Проверьте имена полей состояния — используйте
permissionMode,sessionStatus,labels,isFlagged - Проверьте глубину вложенности — условия, вложенные глубже 8 уровней, всегда вычисляются как false
- Проверьте логи — ищите записи
[automations], упоминающие оценку условий
Нужен такой агент в вашей компании?
Устанавливаем под ключ: настройка на компьютерах сотрудников, единый аккаунт, интеграция с 1С и внутренними системами, обучение команды. Подробнее о внедрении →