本文由 莫潇羽@源码七号站(www.fuyuan7.com)撰写,转载请注明出处。
快速摘要
如果你只想要一个最短结论,先把这一段读完:harness-anything 是一个开源在 GitHub 上的「命令行驱动桌面软件」工具集,作者通过 Windows 的 COM 自动化接口,把 WPS Office(Writer/Calc/Impress)、Microsoft Office、Adobe Photoshop、Adobe Illustrator、Zotero 等本地软件,包装成一套约 47 个标准化 CLI 命令,并配套了 27 个面向学术写作和文献管理的高阶能力(项目自称为 Skill)。结合 Claude Code、Cursor、Codex 这一类 AI 编程助手,大模型可以像调用普通命令一样,直接驱动这些桌面软件生成 .docx、.xlsx、.pptx、.psd、.ai、.pdf 等真实文件,而不是仅仅返回一段文字。
真正值得关注的不是"AI 又能干新活了",而是这种"命令行 + COM 桥接"的思路:它把本来散落在各家软件里的能力,统一成了 Agent 友好的接口形态,让本地软件第一次具备了被 AI 编排的可能。 我自己在 Windows 11 + WPS + Python 3.10 的环境下跟着跑了一圈,从环境配置到生成第一份带表格的报告,整个过程比想象中流畅,但也踩到了几个让人想骂街的小坑。
本文会从项目定位 → 47 个命令拆解 → COM 自动化底层原理 → 完整上手流程 → AI Agent 接入方式 → 三类人群的使用姿势 → 局限与边界,一路把这个项目讲透。文中会插入若干代码块、表格和流程图,帮你直观看到「AI 怎么经过一层命令行,最后落到 PSD 文件里的某个图层上」。想看完整拆解,往下翻。
一、我为什么会盯上这个项目
一个老问题:AI 一直在"说",但很少真的"做"
这两年我一直在追各种 AI 产品的更新,从早期的纯聊天,到后来的"会上网会查资料",再到现在动不动就喊自己是 Agent。说实话,大部分时间我都有一种很别扭的感觉:AI 说得头头是道,但最后要把结果落到一份能交给客户的 Word、一张能投放的海报、一份能审的论文上,还是得我自己手动复制粘贴。
举个特别日常的例子。我想让 AI 帮我整一份 Q2 复盘文档,它给我的输出基本是大段 Markdown 文本,里面甚至连分级标题都很规整。但问题是,我领导要的是带封面、带页眉页脚、带表格、带图表的 .docx 文件。AI 写得再漂亮,我也得回到 WPS 里一行行复制、一个个调样式。 那 AI 给我的省力效果,差不多就被这一通操作抵消掉了。
设计场景更明显。我跟一些设计师朋友聊过,他们觉得"AI 出图"这事很热闹,但真正落到日常工作里,他们要的不是给一张漂亮但不能编辑的整图,而是要一份分好图层、能在 PS 里继续调的 PSD。文生图模型给不了这个,至少在 2026 年的当下,离设计师能拿来直接干活还有距离。
学术圈也一样。我有几个在读博的朋友,他们经常跟我吐槽:AI 帮他们做综述确实快,但真正写论文的时候,参考文献格式、Zotero 引用、期刊模板、图表编号,这些零零碎碎的事还得自己来。AI 写完一段、他们再格式化一段,活儿其实没省多少。
真正缺的那一环:本地软件的"AI 接口"
把这些场景拼在一起,你会发现一个共同的痛点:本地桌面软件长期是 AI 工作流里最后一公里的断点。
云端的 SaaS 服务这几年都在补 API 和 MCP,飞书、Notion、各种数据库都已经能被 AI 直接调用。但桌面软件这块就尴尬了——WPS、Word、Excel、PS、AI(Adobe Illustrator)、Zotero,它们都不是为"AI 调用"设计的,本质上还是面向人类用户的 GUI 程序。
我自己折腾过不少绕路方案:
- 让 AI 生成 VBA 宏脚本,手动拷进 Office 里跑——能用,但脚本经常报错,debug 比自己手动做还慢;
- 用 Selenium、Puppeteer 之类的工具去自动化 UI——脆得不行,软件一更新界面,脚本就全废;
- 用第三方 Python 库(比如 python-docx、openpyxl)去拼文件——能拼出来,但格式细节和真实软件渲染出来的效果差很多,复杂排版尤其难搞。
这些方案各有各的问题,但都没有解决一个根本问题:AI 没法直接、稳定地驱动本地软件的原生能力。
直到我刷到 harness-anything 这个项目,我突然意识到——有人开始认真做这一层桥接了。不是炫技,不是 demo,而是把 WPS、PS、AI、Zotero 这些日常工具,老老实实地一条条命令包出来,让 AI 可以用最朴素的方式调度它们。
不只是 harness-anything:一股正在成形的趋势
我顺着这个项目又往外摸了一圈,发现这不是孤立现象。莫潇羽@源码七号站 这边整理了一下:
- HKUDS 团队的 CLI-Anything:思路类似,目标是把任意软件包装成 Agent 原生的 CLI 工具,已经在 11 款开源软件上跑通;
- OpenCLI:把任意网站转成 CLI 工具,让 AI 直接接管浏览器和桌面端;
- 飞书 CLI:把整个飞书的办公能力开放为命令行,给 AI Agent 调用;
- Harness Engineering:OpenAI 在 2026 年初提出的工程范式,主张工程师不再写代码,而是设计环境、明确意图、构建反馈回路,让智能体可靠完成工作。
把这些放在一起看,你会发现一个非常清晰的方向:CLI(命令行界面)正在成为 AI Agent 和软件之间的"通用语"。原因也很简单——和 GUI 相比,CLI 结构化、可组合、确定性强、自描述,天生就适合大模型生成和调用。让一个大模型去精准点击屏幕上的某个像素?非常难。让它写一条 harness wps doc add-table --rows 4 --cols 3 这种命令?毫无难度。
harness-anything 就是这条路上一个非常具体、面向中文办公场景的实践。它把视角对准了 WPS、Office、Adobe 全家桶和 Zotero 这几个真正"日常都在用"的本地软件,关心的是大家每天都要做的事情,而不是炫技性的 demo。这是我盯上它的根本原因。
看清这个项目想解决的真问题
读到这里,你大概能体会到我的视角了。莫潇羽@源码七号站 的判断是:
harness-anything 不是一个让你"少打字"的工具,而是一个让 AI 第一次能"动手"的桥梁。
它的价值不在"功能多炫",而在"接口标准"。一旦本地软件都有了 Agent 友好的 CLI 接口,整个 AI 工作流的拼图就完整了——AI 不光能"想",还能"干"。这才是我愿意花一整篇长文把它讲清楚的原因。
下面进入第二章,先把"它到底是个什么东西"用一句话讲清楚。
二、一句话讲清 harness-anything 是个什么东西
最短定义:一套让 AI 能"亲自操作桌面软件"的命令行桥接层
如果只能用一句话概括,我会这样说:
harness-anything 是一组以 Python 实现、基于 Windows COM 自动化接口的 CLI 工具,它把 WPS Office、Microsoft Office、Adobe Photoshop、Adobe Illustrator、Zotero 这些本地桌面软件的能力,包装成一套统一、标准化、Agent 友好的命令行接口,方便 AI Agent 直接调用。
句子有点长,但每个词都不是多余的,我们一个个拆开:
- Python 实现:项目主体用 Python 写,依赖
pywin32这个 Windows 平台的扩展库; - Windows COM 自动化:这是底层桥梁,借助 COM(组件对象模型)和软件本身暴露的接口对话;
- CLI 工具:所有能力都以命令行形式暴露,比如
cli-anything-wps、cli-anything-photoshop、cli-anything-illustrator、cli-anything-zotero; - 标准化接口:不同软件之间命令风格统一,AI 学一套范式就能调多种工具;
- Agent 友好:命令的设计是为了让大模型容易生成和理解,输入输出都偏结构化。
项目结构:分模块、各管各家
从 GitHub 仓库 yb2460/harness-anything 里能看到,整个项目并不是一锅端的单一仓库,而是按软件家族切分成了若干个子项目:
|
子模块 |
对应软件 |
安装命令(示意) |
主要场景 |
|
cli-anything-wps |
WPS Office / MS Office |
|
文档、表格、演示文稿 |
|
cli-anything-photoshop |
Adobe Photoshop |
|
位图、海报、图层编辑 |
|
cli-anything-illustrator |
Adobe Illustrator |
|
矢量图、Logo、路径 |
|
cli-anything-zotero |
Zotero(文献管理) |
仓库内安装 |
学术写作、文献流水线 |
这种切分有它的合理性:不同软件背后的 COM 接口完全不同,硬塞进一个包里会让维护成本爆炸。把家族切开、各自维护,再用一致的命令风格统一对外,对使用者来说反而最舒服。
整体看下来,仓库给的数据是大约 47 个 CLI 命令和 27 个学术 Skill,前者覆盖办公和设计的常规操作,后者是把"做一篇综述"这种相对复杂的学术流程,整理成可以一键触发的流水线。
整体调用链:从一行命令到桌面软件里的一个动作
为了让你直观看到这件事是怎么发生的,我画了一张简化的调用流程图:
flowchart LR
A[AI Agent<br/>大模型] -->|生成命令| B[Shell / Bash]
B -->|调用 CLI| C[Click CLI<br/>命令解析]
C --> D[Core 核心模块<br/>参数校验 / 业务逻辑]
D --> E[COM Bridge<br/>pywin32]
E --> F[Photoshop.Application<br/>/ WPS.Application<br/>/ Illustrator.Application]
F --> G[(真实桌面软件<br/>执行操作)]
G -->|文件 / 状态| A
这套结构里,每一层都很薄但都很必要:
- Click CLI 层负责把人写的(或者 AI 写的)命令字符串解析成参数;
- Core 核心模块做参数校验、组合命令、把业务语义翻译成对软件接口的具体调用;
- COM Bridge通过
pywin32把 Python 对象和 Windows 的 COM 接口连起来; - 软件本体真正干活——打开文档、画图层、写入单元格、导出 PDF 等。
最后软件吐出来的文件、错误信息、状态码,又会沿着这条路反馈给 AI,让 AI 决定下一步要不要继续调命令。这就是 Agent loop 的最小闭环。
一段最短的对话示例
为了让你彻底进入状态,看一段我自己做过的最小演示(命令仅作示意,具体参数请以仓库最新文档为准):
# 1. 新建一个 1920x1080 的 PS 工程
cli-anything-photoshop project new poster.psd -w 1920 -h 1080
# 2. 加一个标题文字图层
cli-anything-photoshop text add --content "夏日新品上架" --font "微软雅黑" --size 96
# 3. 导出为 PNG
cli-anything-photoshop export png --output poster.png
三行命令,PS 在你眼前实实在在地新建了一个工程、加了文字图层、导出了图。你不需要去点任何菜单。 如果你愿意,把这三行交给 AI Agent 生成,它就完成了一个最朴素的"AI 做海报"工作流。
它和 MCP、Function Call 是什么关系
很多人可能要问:现在大模型不是已经有 MCP(Model Context Protocol)和 Function Call 了吗?为什么还要专门搞一套 CLI?
我自己理解下来,这两条路其实是互补的,不是替代关系:
- MCP / Function Call:更适合"结构化数据接口",比如查数据库、调一个 SaaS API、读一个 JSON 配置。它的优势是 schema 清晰、调用语义强;
- CLI 桥接:更适合"已经成熟的桌面软件",因为很多老牌软件根本没有现代意义上的 API,它们只有 COM、AppleScript、VBA 这种古老但稳定的接口。把这些接口包成 CLI,是接入 AI 的最低成本路径。
而且 CLI 还有一个非常隐蔽的好处:它天然适合被 shell 串联。你可以把 harness-anything 的命令和 ffmpeg、ImageMagick、Pandoc、curl、jq 这种老牌工具拼在一起,组装出非常复杂的自动化流水线,AI 写得出来,shell 跑得起来,工程师 debug 起来也清楚。
它不是什么:先打几个补丁
为了不让你产生不切实际的期待,莫潇羽@源码七号站 这里要先泼几瓢冷水:
- 它不是"零环境就能用"的产品:你得有 Windows、得装好 WPS 或 Office、得装好 Python、得装好 pywin32,缺一不可;
- 它不是跨平台的:本质上依赖 Windows 的 COM 自动化,macOS、Linux 上跑不起来(除非走虚拟机或者 Wine 类方案);
- 它不是"AI 替你想清楚"的工具:你(或者你背后的 Agent)还是要明确告诉它"我要一个 1920×1080 的画布""我要一份四列的表格",它不会替你想清楚需求;
- 它不是闭源软件的万能钥匙:能调到的能力,必须是软件本身通过 COM 暴露出来的;软件没暴露的功能,再聪明的 CLI 包装也变不出来。
把这几条放在心里再往下读,你会对它的能力边界有更准确的预期。
下一章,我们具体把 47 个命令掰开揉碎,看看到底覆盖了哪些场景。
三、47 个命令到底覆盖了哪些场景
上一章把项目长什么样讲清楚了,这一章我们把它能干什么的"清单"摊开来看。47 个命令听起来像随手凑的数字,但实际跑下来你会发现,它把日常会用到的能力切得相当细,又没有切得太碎。
三大场景,一张总表先看清
为了不让你迷路,我先把莫潇羽@源码七号站 整理的总表放在这里,下面再一类类展开:
|
场景大类 |
子模块 |
典型命令分组 |
大致命令数 |
|
办公文档 |
WPS / MS Word |
doc / heading / paragraph / table / image / find-replace / format |
约 15 |
|
办公表格 |
WPS / MS Excel |
sheet / cell / formula / chart / pivot / merge / batch-fill |
约 12 |
|
办公演示 |
WPS / MS PPT |
slide / textbox / shape / background / template / export |
约 10 |
|
位图设计 |
Photoshop |
project / layer / text / image / filter / export |
约 5 |
|
矢量设计 |
Illustrator |
document / path / shape / text / export |
约 5 |
|
学术 / 文献 |
Zotero + 27 Skill |
search / cite / format / pipeline |
27 个 Skill |
注:上面的命令数是按"主要分组"估的,实际仓库里每个分组下还有 add / update / list / delete 这样的子动作,加起来正好是仓库自己宣称的"约 47 个核心命令"。
办公场景:Writer / Calc / Impress 的命令地图
办公模块是整个项目里最厚的一块,原因也很现实——绝大多数中文用户每天都在跟 Word/Excel/PPT 打交道。莫潇羽@源码七号站 这边把它分成三个层次。
2.1 文字处理(对应 WPS Writer / Microsoft Word)
文字处理这块,命令分组围绕"一份文档里最常出现的元素"展开:
# 新建文档
cli-anything-wps writer document new report.docx
# 加一级标题
cli-anything-wps writer add-heading -t "Q2 工作复盘" --level 1
# 加段落
cli-anything-wps writer add-paragraph -t "本季度我们重点完成了以下几件事……"
# 插入表格
cli-anything-wps writer add-table --rows 5 --cols 4
# 插入图片
cli-anything-wps writer add-image --path ./assets/chart.png
# 全文查找替换
cli-anything-wps writer find-replace --from "Q2" --to "第二季度"
# 设置字体样式
cli-anything-wps writer set-font --name "微软雅黑" --size 12
把这几条命令串起来,就能让 AI 一气呵成生成一份"封面 + 章节 + 表格 + 图片"的报告。比起以前用 python-docx 那种"靠拼接 XML 生成 Word"的方式,最大的差别是:现在是真实的 WPS / Word 在跑,渲染出来的样式就是你打开软件看到的样式,不会出现"在 LibreOffice 里好好的、扔到 Word 里就乱"的情况。
2.2 电子表格(对应 WPS Calc / Microsoft Excel)
表格这块是我最喜欢的一块,因为做财务、做报表的同学多半天天在跟它打交道:
# 新建工作簿
cli-anything-wps calc workbook new sales.xlsx
# 新建工作表
cli-anything-wps calc sheet add --name "6月明细"
# 写入单元格
cli-anything-wps calc cell write --range "A1" --value "日期"
# 批量填充
cli-anything-wps calc cell batch-fill --range "B2:B31" --values-from ./june.json
# 写入公式
cli-anything-wps calc cell formula --range "C32" --formula "=SUM(C2:C31)"
# 合并单元格
cli-anything-wps calc cell merge --range "A1:D1"
# 生成图表
cli-anything-wps calc chart create --type column --data-range "A1:C31" --title "6月销售曲线"
# 创建数据透视
cli-anything-wps calc pivot create --source "Sheet1!A1:F100" --rows "区域" --values "销售额"
注意这里的批量填充和数据透视——这两类操作如果手动做,是会让人原地原地崩溃的。把它们命令化之后,让 AI 配合一份 JSON 数据直接生成完整报表,是非常实用的场景。
2.3 演示文稿(对应 WPS Impress / Microsoft PowerPoint)
PPT 这块的命令稍微少一点,但已经覆盖了常用动作:
# 新建演示文稿
cli-anything-wps impress presentation new deck.pptx
# 添加一张标题幻灯片
cli-anything-wps impress slide add --layout "title" --title "2026 年中规划" --subtitle "莫潇羽 · 源码七号站"
# 在指定页加文本框
cli-anything-wps impress textbox add --slide 2 --content "Q3 三大重点……" --x 50 --y 100
# 加形状
cli-anything-wps impress shape add --slide 3 --type "arrow" --x 200 --y 150
# 套主题背景
cli-anything-wps impress background set --slide all --template ./themes/clean.json
# 导出 PDF
cli-anything-wps impress export pdf --output deck.pdf
PPT 这块还有一个被低估的能力是——项目仓库本身宣称支持 SVG-to-PPTX。也就是说,你可以让 AI 先用 SVG 画好整页的"信息图风格"幻灯片,再让 harness-anything 把它转成可在 PPT 里继续编辑的格式。这对做技术分享或科普类内容的同学非常友好。
设计场景:让 PS / AI 接 AI
设计软件这块命令不多,但每一条都很关键。背后的原因是:Photoshop 和 Illustrator 都是 Adobe 全家桶的核心,它们的 COM 接口非常成熟,所以一旦能稳定调用,能力释放是质变。
3.1 Photoshop:图层、文字、滤镜、导出
# 新建一个海报工程
cli-anything-photoshop project new poster.psd -w 1080 -h 1920
# 加一个填色图层
cli-anything-photoshop layer add --type fill --color "#1E3A8A" --name "背景"
# 加一个文字图层
cli-anything-photoshop text add --content "夏日新品" --font "微软雅黑" --size 96 --color "#FFFFFF"
# 加一张产品图,并按比例缩放
cli-anything-photoshop image add --path ./assets/product.png --scale 0.6 --x 200 --y 800
# 批量导出多个尺寸
cli-anything-photoshop export png --output poster_1080.png
cli-anything-photoshop export png --output poster_720.png --width 720
这一组命令的杀手锏是保留可编辑性——它生成的是真实的 .psd 文件,每个图层都还在那里,设计师后续可以自由调整。和"AI 一键出图"那种不可编辑整图的方案完全不是一回事。
3.2 Illustrator:矢量图与路径
矢量这块更适合做 Logo、ICON、信息图,因为放大不失真:
# 新建一个矢量文档
cli-anything-illustrator document new logo.ai -w 1024 -h 1024
# 画一个圆
cli-anything-illustrator shape add --type circle --cx 512 --cy 512 --r 400 --fill "#FF6B35"
# 加一条路径
cli-anything-illustrator path add --points "[(200,200),(400,300),(600,200)]" --stroke "#FFFFFF" --width 8
# 加文字
cli-anything-illustrator text add --content "FY7" --font "Arial Black" --size 200 --x 380 --y 580
# 导出 SVG / PDF
cli-anything-illustrator export svg --output logo.svg
cli-anything-illustrator export pdf --output logo.pdf
矢量图的好处是文件小、随便缩放都清楚,所以这套命令配合 AI 做品牌设计草图非常顺手。当然,能不能做出一个"好看的 Logo",最后还是看审美和需求描述清不清楚,工具只负责把你说的事落到文件里,不负责替你拿主意。
学术场景:27 个 Skill 是怎么组织的
这块是整个项目最有意思的一部分,也是普通使用者最容易忽略的一部分。
cli-anything-zotero 集成了 27 个学术 Skill,它和办公命令的区别在于:它不是一个个原子动作,而是一段段"流水线"。 仓库里给的命令风格大致是这样:
# 列出所有学术 Skill
cli-anything-zotero skills list
# 跑一个"论著推荐"流水线
cli-anything-zotero skills pipeline original_article
# 跑一个 Meta 分析流水线
cli-anything-zotero skills pipeline meta_analysis
# 按某个期刊的图表规范处理图表
cli-anything-zotero skills journal "Nature"
把它放到学术写作的真实流程里看,大概能拆成这么几块(不是所有 27 个 Skill 都列了,挑代表性的):
|
Skill 分类 |
代表能力 |
|
文献检索 |
关键词搜索、按期刊筛选、按年份筛选 |
|
文献整理 |
摘要抽取、引文规范化、Zotero 库自动归档 |
|
写作辅助 |
大纲生成、章节衔接检查、术语统一 |
|
模拟审稿 |
逻辑链检查、统计方法合理性提示、缺失论据提示 |
|
排版输出 |
LaTeX 模板套用、图表编号、参考文献格式化 |
|
期刊适配 |
按 Nature / Cell / IEEE / 中文核心等不同规范出图、出文 |
这套 Skill 的核心思路是:把"做一篇综述""跑一个 Meta 分析"这种相对复杂的学术流程,提前固化成一段命令流,让 AI 通过一句话触发整个流水线。对 PhD、研究生、青年教师来说,这意味着他们可以把"格式化"和"流程化"的劳动外包出去,专心做真正需要脑子的事——研究本身。
一张思维导图收尾
把上面三类摆在一起看,整个能力地图大致是这样:
mindmap
root((harness-anything))
办公
Writer
文档/标题/段落
表格/图片/查找替换
Calc
工作表/单元格
公式/图表/数据透视
Impress
幻灯片/文本框
形状/背景/导出
设计
Photoshop
项目/图层/文字
滤镜/导出
Illustrator
矢量文档/路径
形状/导出
学术
文献检索
模拟审稿
LaTeX 排版
期刊规范
Meta 分析流水线
这就是 47 个命令 + 27 个 Skill 大致的全貌。下一章,我们沉到底层,看它到底是怎么"跨进"桌面软件里去的。
四、底层是怎么跑起来的:COM 自动化原理拆解
上一章我们把命令清单摊开看了。但你心里大概还藏着一个问题:为什么 Python 写一行命令,WPS 或者 PS 就真的动起来了? 这背后没有黑魔法,全是 90 年代就有的成熟技术。这章莫潇羽@源码七号站 把这一层拆给你看。
先认识一个老朋友:COM
COM,全称 Component Object Model(组件对象模型),是微软在上世纪 90 年代提出的一套二进制接口标准。它解决的问题用一句白话说就是——让用不同语言写的软件组件能互相对话。
你可以把它想象成一种"软件圈的国际共通语"。一个用 C++ 写的 Word,可以通过 COM 接口和用 Python 写的脚本对话;一个用 Delphi 写的程序,也可以通过 COM 调一个用 .NET 写的库。只要双方都遵守 COM 这套规矩,就能聊得起来。
WPS、Microsoft Office、Photoshop、Illustrator 这些主流的 Windows 桌面软件,在设计之初都遵循了 COM 标准。它们把自己内部几乎所有的能力——从创建一个新文档,到改一个单元格颜色,到给某个图层加滤镜——都通过 COM 接口"暴露"了出来。这就给后来的自动化工具留出了一条非常稳定的通道。
pywin32:Python 走进 COM 世界的钥匙
那 Python 怎么跟 COM 对话?答案是 pywin32。
pywin32 是 Python 在 Windows 平台上调用 Win32 API 和 COM 组件的扩展库。它给 Python 提供了 win32com.client 这个模块,让你用最朴素的 Python 语法就能创建并控制 COM 对象。
下面是一段最经典的"Hello WPS"演示:
import win32com.client
# 启动 WPS 的 Application 对象
wps = win32com.client.Dispatch("wps.Application")
# 让它可见
wps.Visible = True
# 新建一个文档
doc = wps.Documents.Add()
# 写一段文字
doc.Content.Text = "Hello, 莫潇羽@源码七号站"
# 保存
doc.SaveAs("hello.docx")
这段代码跑起来的瞬间,你会看到 WPS 真的弹出来、新建文档、写好内容、保存。这就是 harness-anything 整个项目的最底层骨架。
类似地,操作 Word 是 Word.Application,操作 Excel 是 Excel.Application,操作 Photoshop 是 Photoshop.Application,操作 Illustrator 是 Illustrator.Application。每个软件都注册了自己的 COM ProgID(程序标识符),通过 Dispatch 就能拿到对应的应用对象。
从一行 CLI 命令到 COM 调用的完整链路
把这层原理放回 harness-anything 的整体结构里,一行命令的执行链路大致是这样:
sequenceDiagram
participant Agent as AI Agent
participant Shell as Bash / 终端
participant CLI as Click CLI
participant Core as Core 模块
participant Bridge as pywin32 / COM Bridge
participant App as 桌面软件
Agent->>Shell: cli-anything-wps writer add-heading -t "标题"
Shell->>CLI: 解析命令字符串
CLI->>Core: 调用 add_heading(text="标题", level=1)
Core->>Bridge: doc.Paragraphs.Add() / Range.Style 设置
Bridge->>App: COM IDispatch::Invoke
App-->>Bridge: 操作结果 / 状态码
Bridge-->>Core: Python 对象
Core-->>CLI: 结构化 JSON 输出
CLI-->>Agent: stdout 返回
最关键的一步是 Bridge → App 这一段。COM 在底层走的其实是 IDispatch::Invoke 接口调用,这是 COM 标准里专门为"动态语言"准备的入口。Python 这种解释型语言不需要事先编译就能调用 COM 对象,全靠 IDispatch 在运行时做方法分发。
这套机制的好处是稳定到夸张:
- COM 不会因为 Windows 升级而轻易改接口;
- WPS、Office 这类软件每次大版本更新,COM 接口几乎都是向后兼容的;
- 哪怕软件 UI 大改、菜单挪位置,底层的 COM API 名字基本不变。
对比那些靠模拟鼠标键盘点击的 UI 自动化方案,COM 这条路稳得不是一星半点。
一段稍微"硬核"一点的真实调用
为了让你看到这套链路在 harness-anything 内部大概长什么样,莫潇羽@源码七号站 仿照仓库风格写了一段示意代码(仅做讲解用,与仓库实现细节会有出入):
# core/writer/heading.py(示意)
import win32com.client
from typing import Optional
class WriterBridge:
def __init__(self, app_progid: str = "wps.Application"):
# 通过 ProgID 拿到 Application 对象
self.app = win32com.client.Dispatch(app_progid)
self.app.Visible = True
def open_or_create(self, path: Optional[str] = None):
if path:
self.doc = self.app.Documents.Open(path)
else:
self.doc = self.app.Documents.Add()
return self.doc
def add_heading(self, text: str, level: int = 1):
# 在文档末尾加一段
rng = self.doc.Range()
rng.Collapse(0) # 折叠到末尾
rng.InsertParagraphAfter()
rng.InsertAfter(text)
# 套标题样式
rng.Style = self.doc.Styles(f"Heading {level}")
return {"ok": True, "level": level, "text": text}
def save(self, path: str):
self.doc.SaveAs(path)
return {"ok": True, "path": path}
再配一段 Click 风格的 CLI 入口:
# cli/writer.py(示意)
import click
from core.writer.heading import WriterBridge
@click.group()
def writer():
"""WPS Writer / Word 操作"""
@writer.command("add-heading")
@click.option("-t", "--text", required=True, help="标题文字")
@click.option("--level", default=1, help="标题级别")
@click.option("--doc", default=None, help="可选:文档路径")
def add_heading(text, level, doc):
bridge = WriterBridge()
bridge.open_or_create(doc)
result = bridge.add_heading(text, level=level)
click.echo(result)
这两段拼在一起,就能在命令行里跑 cli-anything-wps writer add-heading -t "Q2 复盘" --level 1,最终在 WPS 里真的多出一个一级标题。整个项目就是把这种"COM 调用 → CLI 命令"的封装规整化、扩展到 47 个动作。
几个容易被忽略但很关键的细节
实际跑过这套东西之后,我有几个感受非常深,单独拎出来说一下:
- 对象生命周期一定要管好。COM 对象在 Python 里如果不显式释放,可能会导致 WPS / Office 进程在后台堆积。仓库里基本都做了上下文管理或显式
Quit(),但你自己扩展命令时要留意。 - 接口兼容性不是 100% 等同的。WPS 的 COM 接口对 MS Office 做了大量兼容,但总有一些边缘接口表现不一致,比如某些复杂的图表类型、某些特殊的字段。仓库里的命令大多是在"两边都能跑通"的子集上做的,碰到极端 case 还是得做条件分支。
- 可见性要按需关掉。开发的时候把
Visible=True留着方便调试,但批量跑的时候记得关掉,不然几十次 WPS 弹窗会让你电脑性能直接跳水。 - 错误处理必须严格。COM 调用一旦出错抛的是
pywin32的com_error,里面信息不是很直白,建议在 Core 层把它翻译成更有可读性的 JSON 错误,方便 AI 看懂下一步该怎么修。
把"原理"和"应用"接回去
讲到这里你应该能理解:harness-anything 并不是发明了什么新东西,它是把一套老技术(COM)+ 一个轻量 CLI 框架(Click)+ 一个面向 AI 友好的接口风格,重新组合成了一个适合大模型时代的工具。
这种"基于成熟技术做组合创新"的做法,往往比"硬上一套全新协议"更靠谱。因为底层稳定,上层就敢复杂。 当你看到 47 个命令、27 个 Skill 这种数量,背后其实是 COM 这一层底气足才撑得起来。
下一章,我们就拿一台真实的 Windows 机器,从零跑通整个流程。
五、我自己跑起来的完整流程
讲完原理,回到实操。这一章莫潇羽@源码七号站 把我自己跑通整套流程的过程整理出来,按步骤复述一遍。重点不是"按这个抄一遍",而是让你心里有数:从空白机器到 AI 真的能调命令,到底要经过哪些环节、容易在哪卡住。
环境前置:缺一不可的几样东西
先把硬性前置说清楚。莫潇羽@源码七号站 实测下来,下面这些一个都不能少:
|
项目 |
要求 |
说明 |
|
操作系统 |
Windows 10 / 11 |
macOS、Linux 跑不动,本质是 COM 的限制 |
|
Python |
3.10 及以上 |
项目用到了一些较新的类型注解和库版本 |
|
pywin32 |
最新稳定版即可 |
|
|
WPS Office |
2023 及以上 |
或 MS Office 2019+,二选一 |
|
Photoshop(可选) |
2023 + |
不做设计可以不装 |
|
Illustrator(可选) |
2023 + |
同上 |
|
Zotero(可选) |
6.x |
不做学术工作流可以不装 |
|
Git |
任意版本 |
拉仓库要用 |
如果你电脑上同时装了 WPS 和 MS Office,强烈建议先想清楚你想用哪个,因为两边的 COM ProgID 可能会"打架"——简单说就是 Dispatch("Excel.Application") 不一定指向你以为的那个软件,需要在配置里明确指定。
第一步:装 Python 和 pywin32
新机器的话,我一般推荐先装 Anaconda 或 Miniconda,省事。最小化做法是:
# 1. 装 Python(这里假设你已经在 PowerShell 里)
# 直接去 python.org 下 3.10+ 安装包
# 2. 装 pywin32
pip install pywin32
# 3. 跑 post-install(很多人卡在这里,必须做!)
python -m pywin32_postinstall -install
第 3 步是个大坑。pywin32 装完之后,有些 COM 接口在没跑 postinstall 的时候是注册不全的,会出现"明明装了 pywin32,但 Dispatch 死活拿不到 wps.Application"的诡异现象。这一步做完一般就好了。
第二步:拉仓库 + 安装子模块
拿 WPS 模块举例,安装的方式有两种:
方式 A:直接从 GitHub 装最新版
pip install git+https://github.com/yb2460/cli-anything-wps.git
方式 B:源码安装(推荐,方便后续改命令)
git clone https://github.com/yb2460/harness-anything.git
cd harness-anything/wps-harness/agent-harness
pip install -e .
-e 是 editable 模式,装完之后你改源码不需要重新 install。如果你想给项目提 PR,或者想给自己加几个定制命令,这种方式更顺手。
Photoshop 和 Illustrator 模块同理:
cd harness-anything/photoshop-harness/agent-harness
pip install -e .
cd ../../illustrator-harness/agent-harness
pip install -e .
装完之后,可以在 PowerShell 里跑一下:
cli-anything-wps --help
cli-anything-photoshop --help
cli-anything-illustrator --help
只要 --help 能正常输出,说明这一层就通了。
第三步:跑通"Hello World"
我个人的习惯是,任何新工具上手都先跑一个最小可行示例,确认整条链路是通的,再去玩复杂功能。
WPS 这边我跑的第一条命令是:
cli-anything-wps writer document new D:/tmp/hello.docx
cli-anything-wps writer add-heading -t "Hello, 莫潇羽@源码七号站" --level 1 --doc D:/tmp/hello.docx
跑完之后,WPS 真的弹了出来,新建了 hello.docx,里面是一个一级标题。那一刻我才真正确信,这套东西是能落地的,不是 README 吹的。
PS 这边我跑的是:
cli-anything-photoshop project new D:/tmp/poster.psd -w 1080 -h 1920
cli-anything-photoshop text add --content "FY7 Test" --font "Arial" --size 96 --color "#FFFFFF" --doc D:/tmp/poster.psd
cli-anything-photoshop export png --output D:/tmp/poster.png --doc D:/tmp/poster.psd
注意一点,PS 启动第一次的时候比较慢,命令可能要等十几秒才有响应,别以为它卡死了。
第四步:组合命令做一份真实文档
跑通 Hello World 之后,我马上试了一个稍微复杂一点的场景——让 AI 给我生成一份"6 月运营复盘"文档。我把它拆成了如下命令流:
# 新建文档
cli-anything-wps writer document new D:/work/202606_review.docx
# 加封面信息
cli-anything-wps writer add-heading -t "2026 年 6 月运营复盘" --level 1 --doc D:/work/202606_review.docx
cli-anything-wps writer add-paragraph -t "撰写人:莫潇羽 / 源码七号站" --doc D:/work/202606_review.docx
cli-anything-wps writer add-paragraph -t "时间:2026 年 7 月 5 日" --doc D:/work/202606_review.docx
# 一级章节:核心数据
cli-anything-wps writer add-heading -t "一、本月核心数据" --level 2 --doc D:/w