Skip to content

Ошибки и failure modes

Общий формат

Пользовательские ошибки CLI выводятся в stderr в формате:

text
error: <message>

Команда завершается с ненулевым exit code.

Частые блокирующие ситуации

СитуацияЧто означаетЧто сделать
Неотслеживаемый файл конфликтует с remote при syncфайл в skills/, mcp/ или loadouts/ совпадает по имени с файлом из remoteпереименовать файл, опубликовать через aiman push или использовать --force (файл будет удалён)
Remote новее при pushопубликованное состояние ушло вперёдвыполнить aiman sync
История Git разошласьAIM не может безопасно выбрать состояниевосстановить Git вручную
AI-среда не найденаадаптер не нашёл base dirуказать путь в aim.local.yaml
MCP env не заданаrequired переменная отсутствуетввести при sync или добавить в aim.local.yaml
Невалидный Skillнет frontmatter, нет name, нет description или пустое телоисправить skills/<name>.md
Невалидный MCP Itemнет обязательного поля или YAML невалиденисправить mcp/<name>.yaml
Нет активного репозитория при import (точечном или без имени)репозиторий инвентаря не выбранвыполнить aiman init <url> или aiman switch <path>
Недопустимое имя элемента при importаргумент <name> пустой, содержит /, \, .., управляющие символы или длиннее 255 символовпередать имя элемента, а не путь к файлу; файл добавляется через aiman add
MCP-сервер с неподдерживаемым транспортом при import mcpсервер объявлен как http/sse или через url, а не через commandAIM управляет только stdio-серверами; оставить такой сервер настроенным в среде вручную
Неизвестная среда в --from при aiman importзначение --from не входит в claude-code, cursor, codexисправить значение флага; список доступных — в тексте ошибки
Опечатка в имени подкоманды importaiman import skil ...skil не распознан как skill/mcpпроверить написание подкоманды; aiman import без аргументов — это отдельный режим discovery, а не опечаточный skill/mcp
Loadout не найден при apply --loadoutв loadouts/ нет файла или поля name с таким именемпроверить имя; список доступных — в hint
Невалидный loadoutнет name, пустой items, неверный префикс ссылки или YAML невалиденисправить loadouts/<name>.yaml
Сломанная ссылка loadout при pushskill:<name> или mcp:<name> не существует в инвентареисправить items или добавить элемент в инвентарь
Пин указывает на несуществующий loadout при syncloadout, закреплённый через apply --pin, удалён, переименован или отсутствует в текущем репозиторииaiman apply --default или aiman apply --unpin, чтобы снять пин, либо восстановить/переименовать loadout обратно
Конфликт флагов apply (--pin/--default/--unpin)несовместимая комбинация флагов пинаиспользовать флаги по отдельности — см. Справочник CLI
Нет доступа к remoteGit не может прочитать или записать репозиторийпроверить сеть, credentials и права

Ошибки импорта

Все три ошибки ниже возникают до записи на диск: инвентарь и AI-среды остаются нетронутыми.

Нет активного репозитория инвентаря — aiman import skill и aiman import mcp не пишут в текущую директорию:

text
error: no active inventory repository; run 'aiman init' first

Подключите репозиторий (aiman init <url>) или переключитесь на существующий (aiman switch <path>). Проверка выполняется и с флагом --print.

Недопустимое имя элемента — имя проверяется до построения пути записи, поэтому импорт нельзя увести за пределы репозитория инвентаря:

text
error: invalid item name "../evil": must not contain "/" or "\"

Отклоняются пустое имя, ., .., имена с / или \, абсолютные пути, управляющие символы и имена длиннее 255 символов. Аргумент команды — это имя элемента в AI-среде, а не путь к файлу.

MCP-сервер использует неподдерживаемый транспорт — импортировать можно только stdio-серверы (те, у которых задан command):

text
error: MCP server "remote-tool": unsupported transport "http" (only stdio servers can be imported)

Такой сервер не создаётся в инвентаре пустой заготовкой: команда останавливается и называет причину. Остальные серверы того же конфига импортируются как обычно.

Discovery (aiman import без имени): ошибки и состояния плана

Два настоящих failure mode — до любого обращения к диску:

Неизвестная среда в --from:

text
Error: unknown environment: bogus; available: claude-code, cursor, codex

Опечатка в имени подкоманды — родительская команда объявлена с Args: cobra.NoArgs, поэтому нераспознанный первый аргумент не проваливается молча в discovery:

text
Error: unknown command "skil" for "aiman import"

Отсутствие активного репозитория — та же ошибка и то же требование, что и у точечных import skill/import mcp (см. выше), действует во всех режимах (--dry-run, --yes, без флагов).

Остальное ниже — не ошибки команды: exit code остаётся нулевым, discovery успешно построила план, а следующие состояния — это то, что в нём показано, и не блокируют весь план, только конкретный элемент.

Неполный скан. Если чтение или разбор одного источника не удалось (например, невалидный mcp.json), это не прерывает всю команду — план строится по остальным источникам, а в stderr печатается предупреждение:

text
warning: scan was incomplete — see per-source errors above

aiman import --yes при неполном скане отказывается писать что-либо вообще, пока источник не будет исправлен или исключён через --from.

Source conflict. Один и тот же ключ (<kind>:<name>) найден с разным содержимым в разных средах — ничего не выбирается по порядку обхода, элемент попадает в категорию conflicts плана:

text
conflicts: 1
  mcp:jira — found with different command/args/env across sources

У скилла отдельно выделяется policy conflict — тот же payload, но разные явные targets в frontmatter:

text
  skill:review-code — same skill content but different explicit targets across sources

Inventory conflict. Payload кандидата отличается от уже существующего элемента инвентаря с тем же именем, либо в инвентаре одновременно есть skills/<name>.md и skills/<name>/SKILL.md:

text
  skill:review-code — differs from the existing inventory item with the same name

Local-value conflict. Несколько источников расходятся в значении одной и той же MCP env-переменной — значение не заполняется автоматически на --yes, даже если сам payload элемента однозначен:

text
mcp:jira (local MCP value conflict: TOKEN — not auto-filled)

Unsupported transport — та же причина, что и у точечного aiman import mcp выше, показывается в плане отдельной категорией unsupported, а не как error:

text
unsupported: 1
  mcp:docs-site — unsupported transport "http" (only stdio servers can be imported)

Ни в одном из перечисленных сообщений — ни в плане, ни в предупреждениях, ни в --dry-run — не может оказаться реального значения MCP env-переменной: discovery либо не может его прочитать в принципе, либо не может определить, какое из нескольких значений верное.

Ошибки loadout

Loadout не найден (aiman apply --loadout):

text
hint: available loadouts: dev, docs
error: loadout "ghost" not found in loadouts/

Строка hint печатается, когда валидных loadout от одного до пяти, и перечисляет значения поля name, а не имена файлов. Отсутствующая или пустая директория loadouts/ даёт ту же ошибку not found, но без подсказки.

Loadout невалиден — apply --loadout останавливается на первой ошибке:

text
error: loadout "empty": items: cannot be empty

aiman push выводит все ошибки формата по всем файлам loadouts/ сразу (с полным путём к файлу):

text
error: /home/user/aim-inventory/loadouts/empty.yaml: items: cannot be empty

Сломанная ссылка на элемент инвентаря (aiman push, блокирует публикацию):

text
error: loadout "Documentation Work" references unknown skill "missing-skill"
  hint: check loadouts/documentation-work.yaml → items

Любую неуспешную валидацию push завершает общей строкой error: validation failed — fix errors before publishing.

Та же ситуация при apply --loadout — предупреждение, а не ошибка: элемент пропускается, применение продолжается:

text
warning: loadout "dev": no valid inventory item for skill:ghost (skipped)

Предупреждения loadout, не блокирующие ни push, ни apply: отсутствие description и несовпадение имени файла с нормализованным name.

Пин loadout

Пин указывает на loadout, которого больше нет — aiman sync останавливается, не тронув AI-среды и не обновив synced_hash:

text
error: pinned loadout "documentation-work" not found in inventory

Эта ошибка отличается от loadout "X" not found in loadouts/, которую выдаёт apply --loadout без пина — тексты различаются намеренно, чтобы источник ошибки было легко отличить в логах. Причины: loadout переименовали или удалили, репозиторий опубликовал более новое состояние с другой машины, либо aiman switch переключил на репозиторий, где такого loadout никогда не было. Чтобы восстановиться:

  • снять пин без применения чего-либо: aiman apply --unpin;
  • или вернуться к полному инвентарю: aiman apply --default;
  • или восстановить/переименовать loadout под ожидаемым именем в репозитории инвентаря и повторить aiman sync.

Конфликты флагов apply --pin / --default / --unpin — проверяются до чтения инвентаря, до диспетчеризации в apply:

КомбинацияОшибка
--pin без --loadouterror: --pin requires --loadout <name>
--default + --loadouterror: --default and --loadout are mutually exclusive
--default + --pinerror: --pin is redundant with --default
--unpin вместе с --loadout, --pin или --defaulterror: --unpin does not apply — combine only alone

Полное описание флагов — в Справочнике CLI, поле конфига — в Справочнике конфигурации.

--dry-run

Для опасных операций сначала используйте dry-run:

bash
aiman push --dry-run
aiman sync --dry-run
aiman apply --dry-run
aiman apply --loadout <name> --dry-run

Dry-run показывает план без записи в Git, репозиторий инвентаря или AI-среды. Для apply --loadout dry-run обязателен к привычке: строки D в плане показывают, что будет удалено из сред.

--force

aiman sync --force разрешает потерю локальных изменений при применении опубликованного состояния.

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

Released under the Apache 2.0 License.