Skip to content

Формат инвентаря

Skill Item

Путь:

text
skills/<name>.md

Пример:

md
---
name: create-spec
description: Написать лаконичное ТЗ для разработчика
targets:
  - claude-code
  - cursor
---

# Role

...

Поля:

ПолеОбязательноОписание
nameдаИдентификатор навыка; должен совпадать с именем файла
descriptionдаКороткое описание навыка; без него навык считается невалидным и не применяется
targetsнетСписок AI-сред, ограничивающий доставку навыка; см. ниже

Тело Markdown после frontmatter не должно быть пустым.

targets ограничивает доставку. Поле влияет на применение на всех путях — apply, sync, apply --loadout и pinned sync. Если поле отсутствует или список пуст, навык применяется во все обнаруженные AI-среды — это поведение по умолчанию. Если список непустой, навык устанавливается только в перечисленные среды из числа обнаруженных.

Это отличается от MCP Item, где targets обязателен: пустой список у MCP Item — ошибка валидации, у Skill Item — «применить везде». Асимметрия осознанная: превращение поля в обязательное сломало бы существующие инвентари, где навыки заведены без targets.

Имена сред в targets не валидируются: опечатка (например, claud-code) не даёт ошибки — навык просто не попадёт ни в одну среду.

Folder Skill

Skill Item может храниться в виде папки:

text
skills/<name>/SKILL.md
skills/<name>/agent-patterns.md   # опциональные справочные файлы
skills/<name>/delegation.md
skills/<name>/examples.md

SKILL.md — основной файл навыка с frontmatter и телом. Остальные файлы в папке — справочные: их можно упомянуть в SKILL.md через @mention. При установке навыка папка целиком копируется в AI-среду.

Приоритет: если одновременно существуют skills/<name>.md и skills/<name>/SKILL.md, используется плоский файл (<name>.md).

Для папочного навыка name берётся из имени директории, а не из frontmatter; description и непустое тело в SKILL.md обязательны так же, как у плоского навыка.

Ограничение: apply --dry-run и расчёт дельты сравнивают только хеш SKILL.md. Изменения в справочных файлах папки не отображаются в составе изменений. По той же причине aiman add skill <dir> и aiman import skill считают навык already identical, если SKILL.md не изменился, — изменения только в справочных файлах в инвентарь не переносятся.

Ограничение: права доступа к файлам не сохраняются ни при добавлении в инвентарь, ни при установке в AI-среду — все файлы записываются как 0644. Исполняемый бит скриптов внутри папочного навыка теряется.

MCP Item

Путь:

text
mcp/<name>.yaml

Пример:

yaml
name: context7
description: Документация библиотек через MCP
command: npx
args:
  - -y
  - "@upstash/context7-mcp"
targets:
  - claude-code
  - cursor
  - codex
env:
  - name: UPSTASH_REDIS_REST_URL
    description: URL Redis-хранилища Upstash
    required: true
    example: https://example.upstash.io

Поля:

ПолеОбязательноОписание
nameдаИдентификатор MCP-сервера
descriptionнетКороткое описание
commandдаКоманда запуска
argsдаСписок аргументов, может быть пустым
targetsдаСписок AI-сред
envдаСписок env-переменных, может быть пустым

Env variable

ПолеОбязательноОписание
nameдаИмя переменной
descriptionнетНазначение переменной
requiredдаТребовать значение при применении
exampleнетПример значения

Значения env-переменных не хранятся в MCP Item. Они задаются локально и сохраняются в aim.local.yaml.

Loadout Item

Путь:

text
loadouts/<name>.yaml

Пример:

yaml
name: Documentation Work
description: Навыки и MCP для работы с документацией
targets:
  - claude-code
items:
  - skill:create-spec
  - skill:wpage
  - mcp:context7

Поля:

ПолеОбязательноОписание
nameдаЧеловекочитаемый идентификатор loadout
descriptionнетНазначение набора; при отсутствии — предупреждение
itemsдаНепустой список ссылок skill:<name> или mcp:<name>
targetsнетОграничение допустимых AI-сред применения loadout

Инварианты:

  • items не может быть пустым;
  • каждая ссылка имеет префикс skill: или mcp: и непустое имя;
  • каждый skill:<name> существует как skills/<name>.md или skills/<name>/SKILL.md;
  • каждый mcp:<name> существует как mcp/<name>.yaml;
  • имя файла — нормализация поля name (пробелы → дефисы, нижний регистр); несовпадение — предупреждение.

Формат и ссылочная целостность проверяются при aiman push. aiman apply --loadout останавливается на первой ошибке формата; ссылка на исчезнувший или невалидный элемент инвентаря при применении даёт предупреждение, элемент пропускается.

Пересечение targets

targets на уровне loadout — ограничение допустимых сред (whitelist), а не селектор доставки:

  • targets указан — loadout применяется только в перечисленные среды из числа обнаруженных;
  • targets не указан — ограничения на уровне loadout нет, действует item-level targets каждого элемента;
  • loadout-level и item-level targets совмещаются как пересечение: элемент применяется в среду, только если она допустима на обоих уровнях. Это верно и для MCP Item (targets обязателен), и для Skill Item (targets опционален; отсутствие или пустой список на item-level не сужает пересечение — действует только loadout-level ограничение).

Два уровня ограничений ведут себя по-разному при удалении. Среда, отсечённая loadout-уровневым targets, в план не входит и не изменяется вовсе. Среда, оставшаяся в плане, приводится к желаемому набору целиком — поэтому элемент (навык или MCP-сервер), входящий в loadout, но не перечисливший эту среду в своём item-level targets, будет из неё удалён, если он там установлен. Для навыка это происходит только на declarative-пути (apply --loadout, pinned sync): на аддитивных путях (sync, apply без --loadout) навык только устанавливается в допустимые среды и никогда не удаляется, даже если targets впоследствии сузили.

Targets

Поддерживаемые значения:

  • claude-code;
  • cursor;
  • codex.

Released under the Apache 2.0 License.