Главная/Документация/Справочник агента/Настройка меток
Справочник агента

Настройка меток

Метки — дополнительные теги для сессий. В отличие от статусов они многозначные, не имеют значений по умолчанию и поддерживают иерархию через вложенные JSON-деревья.

Рабочий процесс с приоритетом CLI (рекомендуется): используйте команды craft-agent label ... вместо прямого редактирования JSON.

  • craft-agent label --help
  • Канонический справочник команд: craft-cli.md

Места хранения

  • Конфигурация: ~/.craft-agent/workspaces/{id}/labels/config.json

Нет значений по умолчанию (обычные метки)

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

Визуальное представление

Метки — только цвет: в UI они отображаются как цветные круги. Иконки и эмодзи не поддерживаются.

Иерархические метки (вложенное дерево)

Метки образуют вложенное JSON-дерево. Иерархия — это сама структура: отношения «родитель/потомок» выражаются через массив children. Позиция в массиве определяет порядок отображения (поле order не нужно).

Пример:

terminaljson
{
  "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" }
  ]
}

В боковой панели это отображается как дерево:

terminalbash
Engineering
  ├─ Frontend
  │    └─ React
  └─ Backend
Bug

Правила:

  • Идентификаторы — простые слаги (строчные буквы, цифры и дефисы)
  • Идентификаторы должны быть глобально уникальными во всём дереве
  • Максимальная глубина вложенности: 5 уровней
  • Позиция в массиве = порядок отображения (без поля order)
  • Фильтрация по родителю включает всех потомков

Схема config.json

terminaljson
{
  "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" }). В UI отображается как цветной круг.
valueType 'string' | 'number' | 'date' | 'link'? Необязательная подсказка о типе значения. Сообщает UI, какой виджет ввода показать, а агентам — в каком формате писать. Значения link отображаются как кликабельный чип, который открывается в браузере. Для булевых (только наличие) меток опустите.
children LabelConfig[]? Необязательные вложенные дочерние метки. Позиция в массиве = порядок отображения.

Формат цвета

То же, что и для статусов — см. документацию по статусам для полных деталей о поддерживаемых форматах и типичных ошибках.

Системные цвета: "accent", "info", "success", "destructive", "foreground" (с необязательным /opacity 0–100)

Кастомные цвета: { "light": "#EF4444", "dark": "#F87171" } — поддерживаются форматы hex, OKLCH, RGB, HSL

Метки сессий

Сессии хранят метки как массив строк. Булевы метки — это просто идентификаторы; метки со значением используют разделитель :::

terminaljson
{
  "labels": ["bug", "priority::3", "due::2026-01-30", "linear::https://linear.app/issue/ENG-456"]
}
  • Метки дополнительные (у сессии может быть ноль или много меток)
  • Булевы метки: "bug" — только наличие, без значения
  • Метки со значением: "priority::3" — идентификатор и значение разделены ::
  • Разделение по :: выполняется только по первому вхождению (значение может содержать ::)
  • Некорректные идентификаторы меток тихо отфильтровываются при чтении
  • Удаление метки автоматически удаляет её из всех сессий (вместе с потомками)
  • Иерархическая фильтрация: клик по родительской метке показывает сессии, отмеченные ею или любым потомком

Типы значений

Типы значений выводятся из исходной строки при разборе:

Тип Формат Пример
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-даты → проверка числа → запасной вариант строка.

Необязательный valueType в конфигурации — только подсказка: парсер всегда выводит тип из исходного значения независимо от этого. link — это подсказка для отображения и взаимодействия (кликабельный чип, схема URL убирается, открывается в браузере); значение ссылки всё равно хранится и разбирается как обычная строка.

Добавление меток

Предпочитайте команды craft-agent:

terminalbash
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 недостаточно.

Соглашения по цветам

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

  1. Всегда добавляйте цвет. У каждой метки должен быть color для визуального опознавания (отображается как цветной круг).
  2. Используйте согласованные цвета внутри категории. Метки-соседи (дети одного родителя) должны использовать цвета из одной семьи или диапазона оттенков, формируя цельную визуальную группу. Например, группа «Backend» может использовать зелёные/бирюзовые цвета для своих детей (API, Database), а «Frontend» — индиго/синие (React, CSS).
  3. Используйте семантические цвета для семантических значений:
    • баги/ошибки → "destructive" или красные оттенки
    • функции/улучшения → "accent" или синие/индиго оттенки
    • успех/готово → "success" или зелёные оттенки
    • информация/метаданные → "info" или небесно-голубые/циановые оттенки
    • нейтральное/разное → "foreground/60" или серые оттенки

Напоминание о формате цвета: для подметок используйте кастомные объекты { "light": "#hex", "dark": "#hex" }, чтобы точно управлять цветом. Системные цвета ("accent", "info", "destructive" и т. д.) оставляйте для родительских категорий верхнего уровня.

Валидация

ВАЖНО: всегда выполняйте валидацию после создания или редактирования меток:

terminalbash
config_validate({ target: "labels" })

Это проверяет:

  • корректный JSON и рекурсивную структуру схемы
  • глобально уникальные идентификаторы во всём дереве
  • корректный формат слага (строчные буквы, цифры и дефисы)
  • максимальную глубину вложенности (5 уровней)

Правила автометок

Правила автометок автоматически сканируют сообщения пользователя и применяют метки с извлечёнными значениями. Настройте регулярные выражения на любой метке, чтобы запускать автоматическое помечание.

Конфигурация

Добавьте autoRules к любой метке в config.json:

terminaljson
{
  "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 с группами захвата:

terminaljson
{
  "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 отклоняются)
  • Обработка ошибок: некорректные регулярные выражения пропускаются во время выполнения (записываются как предупреждения)

Полный пример

Рабочее пространство, которое автоматически помечает задачи Linear, дедлайны, контакты и бюджеты:

terminaljson
{
  "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" }
      ]
    }
  ]
}

Поведение боковой панели

Метки появляются в левой боковой панели как многоуровневый раскрывающийся раздел:

terminalbash
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 не нужно, позиция в массиве определяет порядок отображения
  • Глобально уникальные идентификаторы: простые слаги, уникальные во всём дереве
  • Только цвет: метки используют цветные круги — без иконок, что сохраняет UI чистым и последовательным
  • Нет категорий: метки не влияют на фильтрацию входящих/архива (для этого есть статусы)
  • Нет значений по умолчанию: рабочие пространства начинаются с нулём меток
  • Нет фиксированных меток: все метки полностью контролируются пользователем (можно удалить, переименовать)
  • Многозначный выбор: сессии хранят labels: string[], а не одно значение
  • Каскадное удаление: удаление метки удаляет её и всех потомков из сессий
  • Максимальная глубина 5: предотвращает чрезмерно глубокие иерархии
  • Иерархическая фильтрация: клик по родительской метке включает все сессии потомков
  • Значения через разделитель ::: простое плоское строковое хранение — без изменения схемы формата сессии
  • Вывод типа при разборе: парсер всегда выводит тип (дата → число → строка), valueType — только подсказка для UI
  • Только дата: ISO YYYY-MM-DD — без временной части, что избегает сложности с часовыми поясами

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

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