不截图也能让 AI 出 PDF:CLI-Anything 上手实测与 5 个坑
想让 AI 帮你出一份 PDF 周报,不用截图点按钮,也不用写一堆 API 胶水:港大数据智能实验室(HKUDS)开源的 CLI-Anything 把 LibreOffice、Blender、GIMP 这些软件包成了 Agent 能直接调用的命令行。我在自己的 Linux 机器上从安装到导出 PDF 跑了一遍,下面只写跑出来的结果。

项目地址 HKUDS/CLI-Anything,Apache-2.0 协议,GitHub 显示 2026 年 3 月建仓,截至 10 月 19 日约 5.4 万 star,配套技术报告 arXiv:2606.03854。本文核对的是 9 月 22 日的提交 34f5195,包管理器 cli-anything-hub 用的是 PyPI 上的 0.4.1。
思路很简单:Agent 最会用的界面是命令行
GUI 自动化要截图、找按钮、点像素,界面一改就崩;很多软件又没有像样的 API。CLI-Anything 的做法是读软件源码,找到它背后真正干活的引擎(LibreOffice 的 headless 模式、blender --background、ffmpeg、sox),再在外面包一层 Click 写的命令行:
- 每条命令都支持
--json,Agent 拿到的是结构化数据,不用自己解析表格; --help自描述,Agent 靠which和--help就能发现能力;- 状态存在一个 JSON 项目文件里,带撤销/重做,不加子命令直接运行就进 REPL;
- 导出一律交给真软件渲染。方法论文档 HARNESS.md 写得很死:不许用 Pillow 冒充 GIMP,软件没装就报错,不降级。
它不重写软件,只给软件装一个 Agent 看得懂的「遥控器」,真正渲染的还是 LibreOffice 和 Blender 本身。
和 MCP、GUI Agent 比,它适合什么
GUI Agent(看截图点鼠标)最通用,但慢、贵、容易点错;MCP 要软件方或社区先写好服务端,覆盖面看运气。CLI-Anything 卡在中间:只要有源码,就能生成一套命令,Agent 调用时只吃文本、不吃截图,token 也省。它也不排斥 MCP,插件的 guides/mcp-backend.md 专门讲了软件只提供 MCP 服务时,怎么把 MCP 当后端包成 CLI。
所以最适合它的是两类活:一是本来就有开源桌面软件、要批量重复操作的,比如出报告、转格式、批量修图、渲染 3D 预览;二是零散 Web API 很多、想统一成一个有状态工具的。临时点几下就完的事,直接让 GUI Agent 做更省心。
前置条件
- Python 3.10+(我用的是 3.13),建议单独开一个虚拟环境;
- 目标软件本体已安装:本文用 LibreOffice(我机器上是 25.2.3),
soffice要在 PATH 里; - 任意一个能跑命令的 Agent:Claude Code、Cursor、OpenCode、Codex 都行。只用现成 CLI 的话,连 Agent 都不是必需的。
第一步:装 cli-hub,看看有哪些现成 CLI
python3 -m venv ~/.venvs/cli-anything
source ~/.venvs/cli-anything/bin/activate
pip install cli-anything-hub
cli-hub list # 按类别列出全部 CLI
cli-hub info libreoffice
我这次 cli-hub list 列出了 100 多个条目,分 3D、AI、音频、办公、自动化等类别,其中一部分是社区收录的第三方 CLI(标 npm、go 的那些),不全是 CLI-Anything 生成的。info 会显示依赖、入口命令和 SKILL.md 的位置。
第二步:装 LibreOffice 的 CLI,生成一份 PDF
cli-hub install libreoffice
L=cli-anything-libreoffice
$L document new -n 周报 -o report.json --type writer
$L --project report.json writer add-heading -t "本周进展" --level 1
$L --project report.json writer add-paragraph -t "新增 2 篇文章,部署正常。"
$L --project report.json export render report.pdf -p pdf --overwrite
$L --json --project report.json document info
我这边建文档、加标题这类命令不到 1 秒返回,导出 PDF 约 2 秒。导出结果里会写明 method: libreoffice-headless 和 LibreOffice 版本号,生成的文件开头是 %PDF-,中文标题正常显示。最后一条的 JSON 里有 content_count,Agent 可以靠它确认内容真的写进去了。
表格用 Calc:document new --type calc 之后用 calc set-cell A1 产品、calc set-cell B2 120 --type float 写单元格,再 export render s.xlsx -p xlsx。想改动之前先演练一遍,就在命令前加全局参数 --dry-run,我试过,项目文件不会变。
第三步:交给 Agent
每个 CLI 都附带一份 SKILL.md,装好后在包目录 cli_anything/libreoffice/skills/SKILL.md,仓库里也有 skills/cli-anything-libreoffice/。在 Claude Code 里可以直接说:
读一下 cli-anything-libreoffice 的 SKILL.md,然后用它把下面三条进展
写成一页 Writer 文档并导出 PDF;每步都加 --json,导出后检查文件头是 %PDF-。
提示词里写清两件事:一是每步都加 --json,Agent 拿到的结果才好判断;二是给出验收办法,别让它看到「Exported」就宣布完成。仓库还提供了一个 cli-hub-meta-skill,让 Agent 自己 cli-hub search 找工具、按需安装,适合你也不确定该用哪个软件的时候。
进阶:给你自己的软件生成 CLI
Claude Code 里两条命令装插件:/plugin marketplace add HKUDS/CLI-Anything,然后 /plugin install cli-anything。之后 /cli-anything ./你的软件源码 或者跟一个 GitHub 地址,插件按 HARNESS.md 走 7 个阶段:
| 阶段 | 做什么 | 产物 |
|---|---|---|
| 1 分析 | 找后端引擎,把 GUI 操作映射到 API | 架构笔记 |
| 2 设计 | 命令分组、状态模型、输出格式 | 命令清单 |
| 3 实现 | Click CLI + REPL + 撤销/重做 | cli_anything 包 |
| 4 测试计划 | 先写测试计划再写代码 | TEST.md |
| 5 写测试 | 单元测试 + 调真软件的端到端测试 | tests/ |
| 6 文档 | 回填测试结果,生成 SKILL.md | TEST.md、SKILL.md |
| 7 发布 | setup.py,pip 安装到 PATH | cli-anything-<软件名> |
第一次生成不全,就用 /cli-anything:refine ./源码 "我要批量滤镜相关命令" 做差距分析、增量补命令。README 的测试汇总表里,19 个 CLI 合计 1,955 项测试全部通过;OpenCode、Codex、Cursor 也有对应的安装方式,见 README。
常见坑
- 公式导出后变成 #VALUE!:我用
calc set-cell B3 0 --formula "=B2*2"写公式,导出 xlsx 后单元格是#VALUE!。换成SUM(B2:B2)等三种写法结果都一样(harness 1.0.1)。需要公式的话,先在 Agent 里把值算好再写进去,或者导出后用 LibreOffice 打开核对。 - 表格只有空格子:
writer add-table只收行数和列数,不能直接填数据。要带数据的表,用 Calc 写好再导出,或者先生成文档再让 Agent 改 ODF 文件。 - 只给软件名不行:
/cli-anything gimp会被拒绝,必须给源码路径或仓库地址。只有二进制的闭源软件,README 自己也承认效果会明显变差。 - 模型要够强:README 写明生成 harness 依赖前沿模型,小模型做出来的 CLI 可能不完整,要多跑几轮 refine。
- Windows:Claude Code 通过 bash 执行命令,没装 Git for Windows 或 WSL 会报
cygpath: command not found。
完成标准
which cli-anything-libreoffice有输出,--help能列出 writer / calc / impress / export 等命令组;report.pdf的前 5 个字节是%PDF-,打开能看到中文标题和正文;--json document info返回的content_count和你加的内容条数一致;- Agent 不看你的提示,只靠 SKILL.md 就能自己重复一遍上面的流程。
HARNESS.md 里有一句值得记住:进程退出码是 0,不代表导出成功。上面那个 #VALUE! 就是例子,命令全部成功返回,文件里却是错的,所以验收要看文件内容本身。
最后
今天就做一件事:用 cli-hub install libreoffice 装上,让你的 Agent 把这周的待办导出成一份 PDF,看它能不能不靠截图独立跑完。
- GitHub:HKUDS/CLI-Anything(README_CN、HARNESS.md、commands/,核对提交 34f5195)
- PyPI:cli-anything-hub 0.4.1
- arXiv:2606.03854:CLI-Anything 技术报告
- 实测环境:Linux、Python 3.13、LibreOffice 25.2.3,2026-10-19 运行