CLI-Anything — генератор CLI-обвязок, через которые AI-агент управляет обычным софтом

· 3 мин чтения
ai-agents cli agent-harness tools automation
📂 Исходный код на GitHub

Методология и генератор CLI-обвязок: плагин для Claude Code, Cursor, OpenCode, Codex и других агентов запускает семифазный пайплайн и превращает исходный код любой программы в CLI с REPL, JSON-выводом и тестами. Поставляется вместе с CLI-Hub — реестром готовых обвязок. Python 3.10+, Apache-2.0.

CLI-Anything — генератор CLI-обвязок, через которые AI-агент управляет обычным софтом

CLI-Anything решает простую, но неприятную проблему: AI-агент умеет рассуждать и писать код, а вот пользоваться профессиональным софтом он не умеет. GIMP, Blender, LibreOffice, Inkscape, OBS Studio — у всего этого есть интерфейс, но нет интерфейса для агента. Проект берёт такую программу, разбирает её исходный код и собирает поверх неё командную строку. Такая надстройка из обычных команд над чужой программой называется обвязкой. Операции, файлы проектов и движок рендеринга остаются настоящими: меняется только способ управления, а результат возвращается в JSON.

В проекте два входа в одну задачу. Первый — CLI-Hub, реестр уже собранных обвязок: ставится через pip и позволяет искать, ставить и запускать готовые CLI одной командой. Второй — генератор: плагин для вашего агента, который берёт исходный код программы и за один запуск делает новую обвязку. Оба входа решают одну задачу, но с разных сторон: первый экономит время, второй закрывает то, чего в реестре ещё нет.

Почему именно командная строка

Логика проекта простая: командная строка — единственный интерфейс, который одинаково удобен и человеку, и модели.

  • Текстовые команды совпадают с форматом, в котором LLM работает лучше всего, и их можно ставить в цепочку.
  • Набор команд описывает сам себя: --help даёт документацию, которую агент читает сам.
  • Результат предсказуем. Один и тот же вход даёт один и тот же выход, а это главное условие, чтобы агент не зацикливался.
  • Каждый инструмент ставится через pip без дополнительных обвязок, а агент находит его обычной командой which.
  • JSON на выходе избавляет от разбора текста. Человек читает таблицу, агент читает структуру.

CLI-Hub: взять готовое

CLI-Hub — это реестр на PyPI. После установки доступны семь команд:

Команда Что делает
cli-hub list Показать содержимое реестра
cli-hub search <query> Найти по ключевому слову
cli-hub info <name> Посмотреть карточку одной обвязки
cli-hub install <name> Установить
cli-hub update <name> Обновить
cli-hub uninstall <name> Удалить
cli-hub launch <name> [args...] Запустить установленное
pip install cli-anything-hub

cli-hub list
cli-hub search image

cli-hub install gimp
cli-hub info gimp
cli-hub launch gimp

В реестре лежат не только обвязки этого проекта. Там есть и сторонние CLI, которые ставятся через pip, npm или brew, включая системные утилиты. Веб-версия реестра лежит на hkuds.github.io/CLI-Anything.

Отдельная деталь: многие обвязки — это тонкий слой поверх настоящей программы. Если вы ставите обвязку для GIMP, сам GIMP тоже должен быть установлен.

Чтобы агент умел пользоваться реестром сам, ему нужен мета-скилл — файл с инструкцией, как искать и ставить обвязки. Ставится он через npx:

npx skills add HKUDS/CLI-Anything --skill cli-hub-meta-skill -g -y

После этого агенту достаточно поставить задачу словами, без единой команды:

Найди подходящую CLI-программу в CLI-Hub и выполни задачу: ...

Мета-скилл указывает агенту на живой каталог, тот выбирает обвязку, ставит её и читает её собственный SKILL.md, чтобы понять, как ей пользоваться.

Генератор: собрать обвязку самому

Когда в реестре нужного нет, генератор делает обвязку с нуля. Нужен Python 3.10 или новее, локальная копия исходников (или ссылка на репозиторий) и агент, который поддерживает плагин или скилл.

Самый короткий путь — через Claude Code:

/plugin marketplace add HKUDS/CLI-Anything
/plugin install cli-anything

После этого одна команда запускает пайплайн:

# Generate a complete CLI for GIMP (all 7 phases)
/cli-anything ./gimp

Внутри — семь фаз:

  1. Analyze. Сканирует исходный код и сопоставляет действия из меню и GUI с вызовами API.
  2. Design. Проектирует группы команд, модель состояния и форматы вывода.
  3. Implement. Собирает CLI на Click: REPL, JSON-вывод, отмена и повтор действий.
  4. Plan Tests. Пишет TEST.md с планом юнит- и сквозных тестов.
  5. Write Tests. Реализует сам тестовый набор.
  6. Document. Заносит результаты прогонов в TEST.md.
  7. Publish. Создаёт setup.py и ставит команду в PATH.

Дальше обвязку можно расширять. Команда refine сравнивает возможности самой программы с тем, что уже есть в CLI, и закрывает разрыв:

# Broad refinement — agent analyzes gaps across all capabilities
/cli-anything:refine ./gimp

# Focused refinement — target a specific functionality area
/cli-anything:refine ./gimp "I want more CLIs on image batch processing and filters"

Каждый запуск refine ничего не ломает и добавляет понемногу, поэтому его можно повторять, пока покрытия будет хватать.

Под какие агенты это работает

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

Агент Как подключить
Claude Code Плагин из маркетплейса на GitHub, команды вида /cli-anything
Cursor Скрипт cursor-plugin/scripts/install.sh либо install.ps1 для PowerShell
OpenCode Копирование opencode-commands/*.md и HARNESS.md в каталог команд — появляется пять слэш-команд
Codex Скрипт codex-skill/scripts/install.sh ставит скилл в $CODEX_HOME/skills/cli-anything
GitHub Copilot CLI copilot plugin install ./cli-anything-plugin
Goose, Qodercli Плагины и скиллы от сообщества
Pi Расширение из .pi-extension/cli-anything/
OpenClaw Копия SKILL.md в каталог скиллов OpenClaw
Hermes, Reasonix Отдельные скиллы с собственными установщиками

Для OpenCode нужна свежая версия: в старых каталог назывался command, а не commands. Файл HARNESS.md обязателен — команды ссылаются на него как на описание метода, и он должен лежать рядом.

Отдельная заметка про Windows. Claude Code выполняет shell-команды через bash, поэтому в Windows нужен Git for Windows (он даёт и bash, и cygpath) либо WSL. Без этого команды будут падать с cygpath: command not found.

Что получается на выходе

Готовую обвязку ставят обычным способом, после чего команда доступна из любого места:

cd gimp/agent-harness && pip install -e .

cli-anything-gimp --help
cli-anything-gimp project new --width 1920 --height 1080 -o poster.json
cli-anything-gimp --json layer add -n "Background" --type solid --color "#1a1a2e"

# Enter interactive REPL
cli-anything-gimp

У каждой обвязки два режима. REPL держит состояние между командами и показывает, в каком проекте вы находитесь, а флаг --json отдаёт те же данные в виде структуры:

$ cli-anything-libreoffice --json document info --project report.json
{
  "name": "Q1 Report",
  "type": "writer",
  "pages": 1,
  "elements": 2,
  "modified": true
}

Пять правил, из которых собрана методология

Всё это держится на одном файле — HARNESS.md. На этот файл опирается весь проект.

  1. Настоящая программа, а не её замена. CLI собирает корректные файлы проектов (ODF, MLT XML, SVG), а рендеринг отдаёт настоящему приложению. Своих замен для GIMP и Blender в проекте нет.
  2. Два режима работы. REPL для диалога с агентом, подкоманды для скриптов и пайплайнов. Запустили команду без аргументов — попали в REPL.
  3. Единый интерфейс. Все обвязки делят один repl_skin.py: баннер, приглашения, история команд, индикаторы прогресса.
  4. JSON по умолчанию. На каждой команде есть --json, а человек читает привычные таблицы.
  5. Без запасных путей. Настоящее приложение — обязательное условие. Если бэкенда нет, тест падает, а не пропускается. Так проверка не может пройти вхолостую.

Отсюда же выросли уроки, которые авторы собрали при создании 18 готовых обвязок:

  • Разрыв между файлом и картинкой. Программы с GUI применяют эффекты в момент рендеринга. Если обвязка правит файл проекта, но экспортирует его сторонним инструментом, эффекты молча теряются. Нужен путь «родной рендерер → перевод фильтров → скрипт рендеринга».
  • Перевод фильтров. При переносе эффектов между форматами (MLT в ffmpeg) сталкиваешься со слипанием фильтров, порядком потоков и разными диапазонами параметров.
  • Точность таймкода. Дробные частоты кадров вроде 29.97 fps накапливают ошибку округления. Нужен round() вместо int(), целочисленная арифметика и допуск в один кадр в тестах.
  • Проверка результата. Код возврата 0 ничего не доказывает. Проверяют магические байты файла, структуру ZIP, пиксели, уровень звука и длительность.

Что уже сделано

Проверено на 18 приложениях из самых разных областей: от растровой графики до анализа облаков точек и профилирования GPU. Несколько строк из таблицы:

Приложение Обвязка Бэкенд Тестов
GIMP cli-anything-gimp Pillow + GEGL/Script-Fu 107
Blender cli-anything-blender bpy 208
Inkscape cli-anything-inkscape правка SVG/XML напрямую 202
Audacity cli-anything-audacity Python wave + sox 161
LibreOffice cli-anything-libreoffice генерация ODF + headless LibreOffice 158
s&box cli-anything-sbox прямой доступ к JSON-файлам Source 2 244
Kdenlive cli-anything-kdenlive MLT XML + melt 155
Shotcut cli-anything-shotcut прямой MLT XML + melt 154
OBS Studio cli-anything-obs-studio JSON-сцены + obs-websocket 153
NSLogger cli-anything-nslogger протокол NSLogger + Bonjour 139
Draw.io cli-anything-drawio mxGraph XML + CLI draw.io 138
Joplin cli-anything-joplin CLI Joplin как subprocess 134
Ollama cli-anything-ollama REST API Ollama 98
FreeCAD cli-anything-freecad FreeCAD 258 команд

Сумма по таблице — 2 461 тест. Отдельно проект приводит разбивку: 1 732 юнит-теста, 579 сквозных и 19 тестов на Node.js. Сквозные тесты бьют по настоящему софту: LibreOffice должен выдать PDF с верными магическими байтами в начале файла, Blender — отрендеренный PNG.

Показательные демонстрации авторы выложили отдельно. Агент собирает марсоход в духе «Кьюриосити» в FreeCAD, выращивает орбитальный релейный дрон в Blender, рисует схему HTTPS-рукопожатия в Draw.io примерно за четыре минуты, проходит партию в Slay the Spire II и накладывает двуязычные субтитры через VideoCaptioner. Отдельный интерес представляет ArcGIS Pro: обвязка не генерируется из исходников, а работает через MCP-мост с уже запущенной сессией Esri.

SKILL.md рядом с каждой обвязкой

Отдельная деталь, полезная для оркестрации. На промежуточном шаге 6.5 генератор создаёт для каждой обвязки файл SKILL.md с YAML-шапкой, списком групп команд, примерами и подсказками по JSON-выводу. Данные для шапки берутся прямо из декораторов Click, setup.py и README. Каноническая копия лежит в skills/cli-anything-<software>/SKILL.md, а установленная обвязка везёт с собой вторую копию для офлайн-работы.

Ограничения, о которых стоит знать заранее

Проект честно перечисляет то, что у него не получается.

  • Нужны самые сильные модели. Надёжная генерация обвязок получается на моделях фронтирного уровня — авторы называют Claude Opus 4.6, Claude Sonnet 4.6 и GPT-5.4. Более слабые модели дают недоделанный или неверный CLI, который потом приходится чить руками.
  • Нужен исходный код. Пайплайн анализирует код. Если у программы есть только собранные бинарники и их нужно декомпилировать, качество и покрытие заметно падают.
  • Одного прогона мало. Первый запуск обычно закрывает не всё. Чтобы довести обвязку до продакшн-уровня, refine приходится запускать несколько раз.

В планах разработчиков — поддержка CAD, DAW, IDE и научных инструментов, набор бенчмарков для оценки успешности задач, сборка обвязок для закрытого софта и веб-сервисов, а также упаковка API сторонних сервисов в CLI.

Короткий итог

Главная идея CLI-Anything в том, чтобы не выбрасывать профессиональный софт и не писать урезанные его копии. Агент получает полный доступ к возможностям программы через обычные команды, а программа продолжает делать свою работу по-настоящему. Отсюда и семифазный пайплайн, и отказ от запасных путей, и требование проверять результат по магическим байтам, а не по коду возврата.

Дальше по теме: краткое руководство на пять минут, полная методика в HARNESS.md, правила публикации своей обвязки и технический отчёт на arXiv. Лицензия — Apache-2.0.

Источник: https://github.com/HKUDS/CLI-Anything