Skip to content

Безопасность и ограничения

Локальная модель

AIM Loadout работает локально. Он не требует облачного аккаунта и не отправляет инвентарь на внешние серверы.

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

Что хранится в Git

В Git попадают:

  • skills/*.md;
  • mcp/*.yaml;
  • loadouts/*.yaml;
  • aim.yaml;
  • .gitignore;
  • будущие публичные файлы инвентаря, если они будут добавлены в формат.

Что не должно попадать в Git

Локальные данные хранятся в aim.local.yaml и должны быть исключены через .gitignore.

Там могут быть:

  • пути к AI-средам на конкретной машине;
  • published_hash;
  • synced_hash;
  • значения env-переменных MCP-серверов.

В текущем MVP значения MCP env хранятся в aim.local.yaml открытым текстом. Это безопасно только при одном условии: файл не попадает в Git.

Что AIM пишет в AI-среды

AIM может:

  • создавать или обновлять файлы навыков в директориях AI-сред;
  • добавлять или обновлять запись MCP-сервера в конфигурационном файле AI-среды;
  • создавать нужные директории, если их нет;
  • при apply --loadout — удалять из сред навыки и MCP-записи, которые существуют в инвентаре, но не входят в применяемый loadout. Файлы, которых нет в инвентаре, не удаляются никогда.

Перед первым массовым применением используйте:

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

Discovery: aiman import без имени

aiman import без флагов, --dry-run и --yes сканируют только фиксированный набор путей, документированных для каждого адаптера (~/.claude, ~/.cursor, ~/.codex и соответствующие файлы MCP-конфигурации — см. Справочник CLI). Обход не выходит за пределы этих путей и не поддерживает project-scope.

Скан не выполняет ни одного сетевого запроса — первая строка плана явно перечисляет, что именно было просканировано, и подтверждает, что ничего не покидает машину:

text
Scanned: ~/.claude, ~/.codex, ~/.cursor — no network requests, nothing leaves this machine

Обход ресурсов папочного навыка при discovery подчиняется тем же лимитам, что и точечный aiman import skill/aiman add skill <dir>: не более 200 файлов, не более 1 МБ на файл, не более 5 МБ на пакет суммарно, глубина вложенности не более 5. Symlink и спецфайл (device, socket, FIFO) внутри пакета навыка отклоняются с явной причиной и никогда не читаются по цели. Превышение любого лимита делает элемент невалидным (invalid в плане) — остальные элементы это не затрагивает.

Значения env-переменных MCP-сервера, найденные при скане, существуют только в памяти на время выполнения команды. Они никогда не попадают в mcp/*.yaml, в план, в вывод --dry-run или в текст ошибки — ни в одном сценарии, включая source conflict и local-value conflict. При --yes однозначное новое значение записывается только в aim.local.yaml текущей машины, и только после проверки, что .gitignore активного репозитория покрывает aim.local.yaml; если нет — команда выводит предупреждение и не записывает значение (существующие элементы инвентаря при этом всё равно импортируются):

text
warning: aim.local.yaml is not in .gitignore — local config may be committed accidentally

aiman init добавляет эту запись в .gitignore автоматически; репозиторий, полученный не через aiman init, может её не иметь.

Ограничения текущего MVP

  • Поддерживаются Claude Code, Cursor и Codex CLI.
  • Для MCP поддерживается stdio-модель запуска: сервер с HTTP/SSE-транспортом ("type": "http", "type": "sse" или голый "url") не импортируется из среды и не устанавливается в неё.
  • Секреты MCP не хранятся в keychain.
  • Основной remote/branch рассчитан на origin/main.
  • AIM не выполняет автоматическое разрешение конфликтов Git.
  • aiman list не считается полноценной публичной командой, пока не реализован полный просмотр инвентаря.

Ограничения declarative-применения loadout

aiman apply --loadout удаляет из сред элементы инвентаря вне применяемого loadout. Два ограничения этой модели приняты осознанно; митигатор для обоих — aiman apply --loadout <name> --dry-run, который показывает строки D до любого удаления.

Name-collision. Навык, созданный в среде вручную, но совпадающий по имени с элементом инвентаря вне loadout, будет удалён при apply --loadout: AIM определяет «своё» по имени в инвентаре и не отличает свой материализованный файл от одноимённого ручного. Проверяйте план через --dry-run, если держите в средах ручные навыки с теми же именами, что в инвентаре.

Orphan. Навык, удалённый из инвентаря целиком, остаётся в средах: AIM перестаёт считать его своим и не удаляет при apply --loadout. Это не регресс — предыдущие версии вообще ничего не удаляли из сред. Уберите такой файл вручную; автоматическая очистка появится вместе с manifest применённого состояния (project-scope).

Что именно удаляется. Навык удаляется вместе со всей своей директорией в AI-среде (skills/<name>/, включая справочные файлы). Из конфигурации MCP убирается только запись нужного сервера — остальные записи и сам файл конфигурации сохраняются.

Если что-то пошло не так

Начните с:

bash
aiman status
aiman doctor

При проблемах с первым запуском см. Устранение проблем.

Released under the Apache 2.0 License.