Настройка лейблов
Лейблы — это дополнительные теги для сессий, поддерживающие иерархическую структуру и автоматическое применение на основе регулярных выражений или семантического анализа.
Настройка лейблов
Лейблы — это дополнительные теги, которые можно применять к сессиям. В отличие от статусов (которые являются взаимоисключающими — один на сессию), лейблы допускают множественный выбор (многие на сессию). Они поддерживают иерархическую организацию через вложенные JSON-деревья.
Рекомендуемый рабочий процесс через CLI: Используйте команды
craft-agent label ...вместо прямого редактирования JSON.
craft-agent label --help- Справочник команд: craft-cli.md
Места хранения
- Конфигурация:
~/.craft-agent/workspaces/{id}/labels/config.json
Отсутствие значений по умолчанию (обычные лейблы)
В отличие от статусов, обычные лейблы изначально пусты. Пользователи создают те лейблы, которые им нужны. Встроенных или обязательных обычных лейблов нет.
Визуальное представление
Лейблы представлены только цветом — в интерфейсе они отображаются как цветные круги. Иконки и эмодзи не поддерживаются.
Иерархические лейблы (вложенное дерево)
Лейблы образуют вложенное JSON-дерево. Иерархия — это сама структура: отношения «родитель/потомок» выражаются через массив children. Позиция в массиве определяет порядок отображения (поле order не требуется).
Пример:
{
"version": 1,
"labels": [
{
"id": "eng",
"name": "Engineering",
"color": "info",
"children": [
{
"id": "frontend",
"name": "Frontend",
"children": [
{ "id": "react", "name": "React", "color": { "light": "#3B82F6", "dark": "#60A5FA" } }
]
},
{ "id": "backend", "name": "Backend" }
]
},
{ "id": "bug", "name": "Bug", "color": "destructive" }
]
}Это отображается как дерево в боковой панели:
Engineering
├─ Frontend
│ └─ React
└─ Backend
BugПравила:
- ID — это простые слаг (строчные буквы, цифры и дефисы)
- ID должны быть глобально уникальными во всем дереве
- Максимальная глубина вложенности: 5 уровней
- Позиция в массиве = порядок отображения (поле
orderотсутствует) - Фильтрация по родительскому лейблу включает всех потомков
Схема config.json
{
"version": 1,
"labels": [
{
"id": "bug",
"name": "Bug",
"color": "destructive"
},
{
"id": "feature",
"name": "Feature",
"color": "accent",
"children": [
{ "id": "ui", "name": "UI", "color": { "light": "#6366F1", "dark": "#818CF8" } },
{ "id": "api", "name": "API", "color": { "light": "#10B981", "dark": "#34D399" } }
]
}
]
}Свойства лейбла
| Свойство | Тип | Описание |
|---|---|---|
id |
string | Уникальный слаг, глобально уникальный в дереве (например, "bug", "frontend"). Строчные буквы, цифры и дефисы. |
name |
string | Отображаемое имя |
color |
EntityColor? | Необязательный цвет. Строка системного цвета (например, "accent", "info/80") или объект с кастомным цветом ({ "light": "#hex", "dark": "#hex" }). Отображается как цветной круг в интерфейсе. |
valueType |
'string' | 'number' | 'date' | 'link'? |
Необязательный тип значения. Указывает интерфейсу, какой виджет ввода показать, и агентам — в каком формате записывать. Значения link отображаются как кликабельная плашка, открывающаяся в браузере. Пропустите для булевых (только наличие) лейблов. |
children |
LabelConfig[]? | Необязательные вложенные дочерние лейблы. Позиция в массиве = порядок отображения. |
Формат цвета
Аналогично статусам — см. документацию по статусам для подробностей о поддерживаемых форматах и частых ошибках.
Системные цвета: "accent", "info", "success", "destructive", "foreground" (с необязательным /opacity 0–100)
Кастомные цвета: { "light": "#EF4444", "dark": "#F87171" } — поддерживаются форматы hex, OKLCH, RGB, HSL
Лейблы сессий
Сессии хранят лейблы как массив строк. Булевы лейблы — это просто ID; лейблы со значениями используют разделитель :::
{
"labels": ["bug", "priority::3", "due::2026-01-30", "linear::https://linear.app/issue/ENG-456"]
}- Лейблы являются аддитивными (у сессии может быть ноль или много лейблов)
- Булевы лейблы:
"bug"— только наличие, без значения - Лейблы со значениями:
"priority::3"— ID + значение, разделенные:: - Разделение по
::происходит только по первому вхождению (в значении может содержаться::) - Невалидные ID лейблов молча отфильтровываются при чтении
- Удаление лейбла автоматически удаляет его из всех сессий (дочерние лейблы также удаляются)
- Иерархическая фильтрация: клик по родительскому лейблу показывает сессии, помеченные им или любым потомком
Типы значений
Значения выводятся из исходной строки при разборе:
| Тип | Формат | Пример |
|---|---|---|
number |
Конечное число | "priority::3", "effort::0.5" |
date |
ISO-дата (YYYY-MM-DD) | "due::2026-01-30" |
link |
URL (открывается в браузере по клику; схема необязательна) | "docs::https://example.com" |
string |
Все остальное | "team::platform" |
Порядок вывода: проверка ISO-даты → проверка числа → запасной вариант string.
Необязательный valueType в конфигурации — это лишь подсказка — парсер всегда выводит тип из исходного значения независимо от этого. link — это подсказка для отображения/возможностей (кликабельная плашка, без схемы, открывается в браузере); значение ссылки все равно хранится и разбирается как обычная строка.
Добавление лейблов
Предпочтительно использовать команды craft-agent:
craft-agent label create --name "Bug" --color "destructive"
craft-agent label create --name "Priority" --color "accent" --value-type number
craft-agent label create --name "Due Date" --color "info" --value-type date
craft-agent label create --name "Docs" --color "info" --value-type link
craft-agent label create --name "Project" --color "foreground/60"
craft-agent label create --name "Alpha" --color "info" --parent-id project
craft-agent label create --name "Beta" --color "success" --parent-id projectИспользуйте прямое редактирование JSON только для пакетных/ручных операций, где CLI недостаточно.
Соглашения по цветам
При создании или изменении лейблов следуйте этим соглашениям, если пользователь явно не запросил иного:
- Всегда добавляйте цвета. Каждый лейбл должен иметь
colorдля визуальной идентификации (отображается как цветной круг). - Используйте комплементарные цвета внутри категории. Соседние лейблы (дети одного родителя) должны использовать цвета из одной семьи или диапазона оттенков, создавая цельную визуальную группу. Например, группа "Backend" может использовать зеленые/бирюзовые цвета для своих детей (API, Database), тогда как "Frontend" использует индиго/синие (React, CSS).
- Используйте семантические цвета для семантических смыслов:
- Баги/ошибки →
"destructive"или красные оттенки - Функции/улучшения →
"accent"или синие/индиго оттенки - Успех/выполнено →
"success"или зеленые оттенки - Информация/метаданные →
"info"или небесно-голубые/циановые оттенки - Нейтральное/разное →
"foreground/60"или серые оттенки
- Баги/ошибки →
Напоминание о формате цвета: Используйте кастомные объекты { "light": "#hex", "dark": "#hex" } для подлейблов, чтобы получить точный контроль над цветом. Резервируйте системные цвета ("accent", "info", "destructive" и т.д.) для верхнеуровневых родительских категорий.
Валидация
ВАЖНО: Всегда выполняйте валидацию после создания или редактирования лейблов:
config_validate({ target: "labels" })Это проверяет:
- Валидный JSON и рекурсивную структуру схемы
- Глобально уникальные ID во всем дереве
- Валидный формат слага (строчные буквы, цифры и дефисы)
- Максимальную глубину вложенности (5 уровней)
Авто-правила лейблов
Авто-правила лейблов автоматически сканируют сообщения пользователей и применяют лейблы с извлеченными значениями. Настройте регулярные выражения на любом лейбле для запуска автоматической разметки.
Конфигурация
Добавьте autoRules к любому лейблу в config.json:
{
"id": "linear-issue",
"name": "Linear Issue",
"color": "purple",
"valueType": "string",
"autoRules": [
{
"pattern": "linear\\.app/[\\w-]+/issue/([A-Z]+-\\d+)",
"valueTemplate": "$1",
"description": "Matches Linear issue URLs"
},
{
"pattern": "\\b([A-Z]{2,5}-\\d+)\\b",
"valueTemplate": "$1",
"description": "Matches bare issue keys like CRA-123"
}
]
}Свойства AutoLabelRule
| Свойство | Тип | Описание |
|---|---|---|
pattern |
string | Обязательно. Регулярное выражение с группами захвата. Использует flags (по умолчанию: gi). |
flags |
string | Флаги регулярного выражения (по умолчанию: gi — глобальный, без учета регистра). Флаг g всегда применяется. |
valueTemplate |
string | Шаблон с использованием $1, $2 для подстановки групп захвата. Если опущено, используется первая группа захвата. |
description |
string | Человекочитаемое описание того, что соответствует этому правилу. |
Регулярные выражения
Правила используют регулярные выражения JavaScript с группами захвата:
{
"pattern": "github\\.com/([\\w-]+/[\\w-]+)/pull/(\\d+)",
"valueTemplate": "$1#$2",
"description": "Matches GitHub PR URLs"
}- Глобальное соответствие: Флаг
gвсегда применяется, поэтому находятся все вхождения в сообщении - Группы захвата:
$1,$2и т.д. заменяются на соответствующие группы вvalueTemplate - Несколько совпадений: "CRA-1 and CRA-2" создает два элемента лейбла на одном лейбле
- Удаление блоков кода: Содержимое внутри блоков кода с забором и инлайн-кода игнорируется
Нормализация значений
Извлеченные значения нормализуются на основе valueType лейбла:
| valueType | Сырой захват | Нормализовано |
|---|---|---|
string |
CRA-123 |
CRA-123 (пропуск как есть) |
number |
$45,000 |
45000 (удаление символа + запятые) |
number |
1.5M |
1500000 (расширение суффикса) |
number |
50k |
50000 (расширение суффикса) |
date |
2026-01-30 |
2026-01-30 (пропуск как есть) |
Поведение оценки
- Время: Правила оцениваются при отправке сообщения пользователем (как новых, так и поставленных в очередь)
- Только сообщения пользователей: Вывод ассистента и результаты инструментов не сканируются
- Удаление кода: Блоки кода с забором и инлайн-код удаляются перед оценкой
- Дедупликация: Один и тот же лейбл+значение не будет добавлен дважды в сессию
- Лимит совпадений: Максимум 10 совпадений на сообщение (предотвращает взрыв лейблов от вставленных данных)
- Сохранение: Автоматически примененные лейблы хранятся в сессии
- Несколько правил: Оцениваются все правила на лейбле; собираются все совпадения
- Валидация: Паттерны валидируются при сохранении конфигурации (невалидные регулярные выражения и паттерны ReDoS отклоняются)
- Обработка ошибок: Невалидные паттерны регулярных выражений пропускаются во время выполнения (логируются как предупреждения)
Семантические правила (требуется Decision Model)
Семантическое правило — это вопрос «да/нет» вместо регулярного выражения. Модель принятия решений (Jev, Настройки > AI > Модель принятия решений) отвечает на него для каждого сообщения пользователя, и лейбл применяется, когда вероятность «да» достигает порога. Регулярное выражение не может выразить «это сообщение о биллинге»; семантическое правило может.
{
"id": "billing",
"name": "Billing",
"autoRules": [
{ "semantic": "Is the user asking about billing, invoices or charges?", "threshold": 0.9 }
]
}| Свойство | Тип | Описание |
|---|---|---|
semantic |
string | Обязательно. Вопрос «да/нет», на английском. Держите его конкретным. |
threshold |
number | Вероятность «да», необходимая для применения лейбла, 0 < threshold <= 1. По умолчанию 0.9. |
value |
string | Фиксированное значение для лейблов со значениями (area::mobile-app). Если опущено → применяется простой id лейбла. |
description |
string | Человекочитаемая заметка. |
- Неактивно без модели принятия решений: когда пользователь не включил ее (или отключил переключатель функции
semanticLabels), семантические правила валидируются и хранятся, но никогда не оцениваются. - Вне критического пути: правила регулярных выражений выполняются до начала хода; семантические правила выполняются в фоне, и их лейблы появляются чуть позже. Сообщения короче 20 символов ("ok", "thanks") пропускаются, как и правила, лейбл которых уже есть в сессии (без вызова модели); лейбл, который пользователь удалил, пока оценка была в процессе, не добавляется снова. Системно сгенерированные сообщения (повторы активации источника, фоновые напоминания) никогда не оцениваются.
- Ровно один вид на правило: правило содержит либо
pattern, либоsemantic, никогда оба (валидация отклоняет гибриды). - Автоматизации: семантическое совпадение запускает автоматизации
LabelAdd, как любое другое изменение лейбла. Именно поэтому порог по умолчанию высокий — снижайте его только для лейблов, которые не запускают ничего важного. - Конфиденциальность: сообщение (с удаленными блоками кода, обрезанное до 8k символов) отправляется настроенному провайдеру решений; каждый вызов записывается в
~/.craft-agent/logs/decisions.jsonlбез текста. - CLI:
craft-agent label auto-rule-add <id> --semantic "Is …?" [--threshold 0.9] [--value "…"]
Полный пример
Workspace, который автоматически размечает задачи Linear, дедлайны, контакты и бюджеты:
{
"version": 1,
"labels": [
{
"id": "linear-issue",
"name": "Linear Issue",
"color": "purple",
"valueType": "string",
"autoRules": [
{ "pattern": "linear\\.app/[\\w-]+/issue/([A-Z]+-\\d+)", "valueTemplate": "$1", "description": "Linear URLs" },
{ "pattern": "\\b([A-Z]{2,5}-\\d+)\\b", "valueTemplate": "$1", "description": "Bare issue keys" }
]
},
{
"id": "deadline",
"name": "Deadline",
"color": "orange",
"valueType": "date",
"autoRules": [
{ "pattern": "(\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2})?)", "valueTemplate": "$1", "description": "ISO dates" }
]
},
{
"id": "contact",
"name": "Contact",
"color": "blue",
"valueType": "string",
"autoRules": [
{ "pattern": "([\\w.+-]+@[\\w.-]+\\.[a-zA-Z]{2,})", "valueTemplate": "$1", "description": "Email addresses" }
]
},
{
"id": "budget",
"name": "Budget",
"color": "green",
"valueType": "number",
"autoRules": [
{ "pattern": "\\$([\\d,.]+[kKmMbB]?)", "valueTemplate": "$1", "description": "Dollar amounts" }
]
}
]
}Поведение боковой панели
Лейблы появляются в левой боковой панели как многоуровневый раскрываемый раздел:
All Sessions (flat, total count)
Flagged (flat, flagged count)
States (expandable → status sub-items)
Labels (expandable)
├─ Views (expandable → view sub-items)
├─ Engineering (label)
└─ Bug (label)
────────────
Sources (expandable → API/MCP/Local)
Skills (flat)
────────────
Settings (flat)Клик по лейблу фильтрует список сессий. Клик по родительскому лейблу включает сессии, помеченные любым потомком.
Проектные решения
- Вложенное JSON-дерево: Иерархия — это сама структура — нет соглашений, которые нужно учить
- Позиция в массиве = порядок: Поле
orderне требуется, позиция в массиве определяет порядок отображения - Глобально уникальные ID: Простые слаги, уникальные во всем дереве
- Только цвет визуально: Лейблы используют цветные круги — без иконок, сохраняя интерфейс чистым и последовательным
- Нет категорий: Лейблы не влияют на фильтрацию инбокса/архива (для этого есть статусы)
- Нет значений по умолчанию: Workspaces начинаются с нулевым количеством лейблов
- Нет фиксированных лейблов: Все лейблы полностью контролируются пользователем (удаляемые, переименовываемые)
- Множественный выбор: Сессии хранят
labels: string[], а не одно значение - Каскадное удаление: Удаление лейбла удаляет его и всех потомков из сессий
- Макс. глубина 5: Предотвращает чрезмерно глубокие иерархии
- Иерархическая фильтрация: Клик по родительскому лейблу включает все сессии-потомки
- Значения через разделитель
::: Простое, плоское хранение строк — без изменений схемы формата сессии - Вывод типа при разборе: Парсер всегда выводит (дата → число → строка),
valueType— это просто подсказка для UI - Только дата: ISO
YYYY-MM-DD— без временной части, избегает сложности с часовыми поясами
Нужен такой агент в вашей компании?
Устанавливаем под ключ: настройка на компьютерах сотрудников, единый аккаунт, интеграция с 1С и внутренними системами, обучение команды. Подробнее о внедрении →