CLI-Anything — генератор CLI-обвязок, через которые AI-агент управляет обычным софтом
📂 Исходный код на GitHubМетодология и генератор CLI-обвязок: плагин для Claude Code, Cursor, OpenCode, Codex и других агентов запускает семифазный пайплайн и превращает исходный код любой программы в CLI с REPL, JSON-выводом и тестами. Поставляется вместе с CLI-Hub — реестром готовых обвязок. Python 3.10+, Apache-2.0.
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
Внутри — семь фаз:
- Analyze. Сканирует исходный код и сопоставляет действия из меню и GUI с вызовами API.
- Design. Проектирует группы команд, модель состояния и форматы вывода.
- Implement. Собирает CLI на Click: REPL, JSON-вывод, отмена и повтор действий.
- Plan Tests. Пишет
TEST.mdс планом юнит- и сквозных тестов. - Write Tests. Реализует сам тестовый набор.
- Document. Заносит результаты прогонов в
TEST.md. - 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. На этот файл опирается весь проект.
- Настоящая программа, а не её замена. CLI собирает корректные файлы проектов (ODF, MLT XML, SVG), а рендеринг отдаёт настоящему приложению. Своих замен для GIMP и Blender в проекте нет.
- Два режима работы. REPL для диалога с агентом, подкоманды для скриптов и пайплайнов. Запустили команду без аргументов — попали в REPL.
- Единый интерфейс. Все обвязки делят один
repl_skin.py: баннер, приглашения, история команд, индикаторы прогресса. - JSON по умолчанию. На каждой команде есть
--json, а человек читает привычные таблицы. - Без запасных путей. Настоящее приложение — обязательное условие. Если бэкенда нет, тест падает, а не пропускается. Так проверка не может пройти вхолостую.
Отсюда же выросли уроки, которые авторы собрали при создании 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