CLI-Anything:开源软件转命令行

AI代理可以写代码、搜索网页、读取文件和运行shell命令。但它们无法打开GIMP并从照片中移除背景。

一个能访问所有npm包和互联网上所有API端点的编码代理,仍然做不了平面设计实习生第一天就能做的事:打开应用程序、点击一些按钮、导出结果。

现有的解决方案都很糟糕。屏幕抓取工具截取GUI的截图,试图找出该点击哪里。它们速度慢、脆弱,只要UI变化就会崩溃。RPA机器人记录的点击序列,一旦对话框位置略有不同就会失效。自定义API包装器只为少数流行应用存在,而且维护成本高昂,因为每次UI更新都可能破坏绑定。

更深层的问题是,桌面软件从来不是为非人类使用而设计的。Web应用之所以有API,是因为它们必须通过HTTP与前端通信。移动应用也是如此。桌面应用只与自己对话。渲染引擎、业务逻辑、文件I/O,一切都封装在GUI事件循环后面。如果你不是移动鼠标的人,你就不是用户。

大多数专业软件(Blender、GIMP、LibreOffice、Audacity、OBS Studio、Shotcut、Kdenlive)根本没有代理友好的接口。

香港大学的CLI-Anything采取了不同的方法。它不试图与GUI交互,而是读取应用程序的源代码,生成一个完整的命令行界面来包装应用程序的内部API。代理永远看不到一个像素,它只需要运行shell命令。

# 这就是代理控制GIMP的样子
cli-anything-gimp project new --width 1920 --height 1080 -o poster.json
cli-anything-gimp --json layer add -n "Background" --type solid --color "#1a1a2e"
cli-anything-gimp filter gaussian-blur --radius 4.0
cli-anything-gimp export --format png -o result.png

没有截图,没有像素搜索。只有返回JSON的结构化命令。

1、工作原理:七个阶段,一条命令

把CLI-Anything指向一个代码库,剩下的它来完成。

/cli-anything:cli-anything ./gimp

这一条命令触发一个七阶段的流水线:

第七阶段之后,系统上就有了一个可用的CLI。which cli-anything-gimp会返回一个路径。任何代理都可以调用它。

执行生成的AI代理(Claude Code、Codex、OpenClaw或任何运行流水线的工具)读取应用程序的源代码,理解其内部API接口,然后编写一个Python Click CLI来包装这些API。生成的CLI包括帮助文本、JSON输出、会话管理、撤销/重做和交互式REPL。

截至2026年3月,13个生成的应用程序通过了1,588个测试。这些不是hello-world测试。它们运行真实的软件:GIMP渲染图像,Blender创建3D场景,LibreOffice生成PDF。

2、代理实际获得什么

比较两种交互模式。

当代理抓取GUI屏幕时,它获得一张图像。它必须解析图像、识别UI元素、找出点击位置、处理加载状态、处理对话框,并希望分辨率和缩放比例与上次成功时一致。

当代理调用CLI-Anything命令时,它得到这个:

{
  "status": "success",
  "project": {
    "id": "poster-001",
    "width": 1920,
    "height": 1080,
    "layers": 3,
    "format": "xcf"
  },
  "message": "Project created"
}

结构化且确定性的。相同的输入,相同的输出,每次如此。不需要视觉模型,只需要JSON进,JSON出。

这很重要,因为错误处理完全改变了。当GUI抓取代理遇到意外对话框时,它必须对一个从未见过的图像进行推理。当CLI命令失败时,它返回带有消息和代码的JSON错误。代理可以解析错误,决定重试还是尝试不同方法,然后继续。失败模式是一个字符串,而不是神秘的截图。

--json标志在每个生成的CLI中都是标准的。代理使用JSON模式;人类默认获得人类可读的输出。

3、他们测试的13个应用

CLI-Anything已在从未设计为可编程访问的专业软件上进行了测试:

创意和媒体

生产力和通信

图表绘制

每个生成的CLI都是一个通过pip install -e .安装的Python包,可以从任何终端调用。代理不需要知道或关心它在与Blender对话。它只需要调用cli-anything-blender scene create --objects cube,light,camera并获得JSON返回。

4、优化循环

第一代覆盖最常见的操作。但专业软件有深层功能集。仅GIMP就有数百个滤镜、数十种颜色模式,以及一个可以进一步扩展功能的插件架构。初始过程不会覆盖所有内容,也不应该尝试。正确实现20个最常用的操作比半生不熟地实现200个操作更有价值。

CLI-Anything通过迭代优化处理长尾需求:

# 广泛优化:代理分析缺失内容并填补空白
/cli-anything:refine ./gimp
# 聚焦优化:针对特定领域
/cli-anything:refine ./gimp "batch processing and filters"

每次优化运行执行差距分析,将软件的全部功能与当前CLI覆盖范围进行比较,然后为缺失部分实现新命令、测试和文档。这个过程是非破坏性的、增量式的。运行五次,获得五层覆盖。

5、令人不安的论点

CLI-Anything文档中有一张幻灯片说得很清楚:

今天的软件服务于人类。明天的用户将是代理。

这对任何构建桌面软件的人来说都是令人不安的。如果代理成为专业工具的主要"用户",GUI就变成了可选的。不是无用的(人类仍然需要它来探索和创意工作),但变成了次要的。对于执行、批处理和自动化流水线,CLI成为真正的界面。

考虑营销团队每周运行的工作流程:

  1. 从共享驱动器下载活动图片
  2. 将每张图片调整为三种不同尺寸
  3. 添加水印
  4. 转换为WebP格式
  5. 上传到CDN

人类在GIMP中完成这些,对每张图片点击每个步骤。需要一个小时。

使用cli-anything-gimp的代理:

for img in campaign_*.png; do
  for size in 1200x628 1080x1080 1920x1080; do
    cli-anything-gimp resize "$img" --dimensions "$size" \
      | cli-anything-gimp watermark --logo brand.png --position bottom-right \
      | cli-anything-gimp export --format webp -o "output/${img%.png}_${size}.webp"
  done
done

四分钟。没有GUI。底层使用相同的GIMP渲染引擎。

这里的赌注很简单:专业软件有数十年积累的功能——渲染引擎、音频处理器、视频编解码器——都被锁定在鼠标驱动的界面后面。生成的CLI使这些功能对代理可用,而不需要软件供应商动一根手指。

这与ImageMagick(已经可以从命令行进行批处理图像处理)的区别在于范围。ImageMagick是一个进行图像处理的工具。CLI-Anything是一种为任何应用程序生成CLI包装器的方法。生成的GIMP CLI可以做ImageMagick做不到的事,因为它可以访问GIMP的完整插件生态系统、图层合成引擎和特定格式的导出选项。同样的逻辑适用于Blender与独立3D转换器,或LibreOffice与pandoc。被包装的应用程序总是比独立替代品更强大,因为独立替代品是重新实现,而包装器使用的是真正的工具。

6、理论上,任何有仓库的软件都可以

CLI-Anything不限于测试过的13个应用。只要有源代码,它就能获得CLI。

他们的文档列出了远超媒体和生产力的类别:

限制因素不是CLI-Anything本身,而是应用程序的源代码是否可用,以及它是否暴露了可以编程调用的内部API。具有结构良好的后端的开源软件效果最好。没有脚本接口的闭源软件是死路一条。

值得注意的是:"有源代码"和"容易包装"是两回事。一个没有Python绑定、GUI层紧密耦合的大型C++应用程序,比一个UI和逻辑清晰分离的Python应用程序更难包装。文档中列出的支持类别是理想化的。测试过的13个应用程序是经过验证的。

7、自描述技巧(这很聪明)

每个生成的CLI都在Python包内附带一个SKILL.md文件。当REPL启动时,横幅显示该文件的绝对路径。

这解决了发现问题,这是代理工具中不太明显但更重要的问题之一。被告知"编辑这张图像"的代理需要弄清楚如何做。如果系统上有工具可以做到这一点,代理需要找到该工具、理解其接口并正确调用它。没有发现,代理只能搜索文档或猜测。

有了SKILL.md,代理可以运行which cli-anything-gimp找到它,然后读取技能文件来了解存在哪些命令、它们返回什么以及如何将它们链接在一起。

$ cli-anything-gimp
Welcome to CLI-Anything GIMP v1.2.0
SKILL.md: /usr/local/lib/python3.10/cli_anything/gimp/skills/SKILL.md
Type 'help' for commands, 'exit' to quit.
gimp>

代理读取SKILL.md,知道工具能做什么,就开始工作了。不需要单独的文档步骤,不需要网络查询。工具自带手册。

8、不足之处

演示结果看起来不错,但诚实的情况包括值得了解的差距。

生成的CLI依赖于目标应用程序已安装且可访问。cli-anything-blender调用Blender的Python API,这要求Blender已安装。没有Blender,就没有渲染。CLI是包装器,不是重新实现。

有些应用程序有Python API。有些有脚本接口。有些两者都没有。应用程序内部暴露得越好,生成的CLI就越完善。像Blender或LibreOffice这样支持无头模式的应用产生的CLI,比需要运行GUI才能做任何事的应用要强大得多。

七阶段流水线是代理驱动的,这意味着它继承了代理的局限性。如果编码代理误解了源代码或错过了API接口,CLI就会有差距。优化循环有帮助,但初始质量取决于代理理解可能庞大而复杂的代码库的能力。

性能是另一个问题。应用高斯模糊的cli-anything-gimp命令必须启动GIMP后端、加载图像、应用滤镜并序列化结果。对于一次性操作,没问题。对于批处理中的数千张图像,启动开销会累积。目前还没有持久服务器模式,添加这种模式将是一项重要的工程工作,因为它需要会话管理、连接池和当前架构没有考虑的清理逻辑。

还有正确性验证的问题。1,588个通过的测试是自生成的,这意味着编写CLI的同一AI也编写了测试。这不是毫无价值(测试确实运行真实的应用程序并检查真实输出),但这与由了解应用程序边缘情况的人编写的独立测试套件不同。如果代理误解了API调用的作用,它可能会编写验证错误行为的测试。

9、更大的图景

桌面应用自诞生以来就很难自动化。AppleScript在macOS上有效,但出了名的脆弱和冗长。COM自动化需要Windows和深入了解应用程序的对象模型。辅助功能API是为屏幕阅读器设计的,不是为驱动复杂工作流设计的。

CLI-Anything的方法(读取源代码、理解API、生成结构化CLI)是第一个不需要应用供应商配合就能扩展的方法。它之所以有效,是因为开源应用将其内部暴露为代码,而AI代理擅长阅读代码。

如果这种模式流行起来,"桌面应用程序"和"API"之间的界限就消失了。任何开源应用都变成了代理可以从shell脚本或流水线调用的东西,就像curlffmpeg一样。

这改变了专业人士的工作方式。它也为那些对基于GUI的工具收费的公司提出了难题——底层渲染引擎可以从终端免费调用。例如,Adobe花了多年时间围绕其Creative Cloud订阅建立护城河。如果像GIMP或Inkscape这样的开源替代品对代理来说变得像Photoshop或Illustrator一样容易访问,那么在任何人类不需要握鼠标的工作流中,专有GUI的价值主张就会被侵蚀。

10、试一试

# 在Claude Code中:
/plugin marketplace add HKUDS/CLI-Anything
/plugin install cli-anything
/cli-anything:cli-anything ./gimp

或手动方式:

git clone https://github.com/HKUDS/CLI-Anything.git
cd CLI-Anything
# 按照README中的平台特定设置操作

原文链接: CLI-Anything turns Photoshop into a terminal command. Blender too. And GIMP. And Zoom.

汇智网翻译整理,转载请标明出处