AI学习吧
📍 源码七号站 开源解码 让大模型亲自动手操盘 WPS、PS:harness-anything 开源项目深度拆解与上手实战

让大模型亲自动手操盘 WPS、PS:harness-anything 开源项目深度拆解与上手实战

摘要:harness-anything 是一个开源工具,通过Windows COM自动化接口,将WPS Office、Adobe全家桶、Zotero等本地桌面软件包装成约47个标准化CLI命令和27个学术Skill,让AI(如Claude Code、Cursor)能像调用普通命令一样直接生成.docx、.psd等真实文件,而非仅返回文本。项目将散落的桌面软件能力统一成Agent友好的接口,使本地软件首次具备被AI编排的可能,重点解决了“AI说得多、做得少”的痛点。
字号 100%
行距 2.05
当前可见 60% 的内容
本文由 莫潇羽@源码七号站(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-wpscli-anything-photoshopcli-anything-illustratorcli-anything-zotero
  • 标准化接口:不同软件之间命令风格统一,AI 学一套范式就能调多种工具;
  • Agent 友好:命令的设计是为了让大模型容易生成和理解,输入输出都偏结构化。

项目结构:分模块、各管各家

从 GitHub 仓库 yb2460/harness-anything 里能看到,整个项目并不是一锅端的单一仓库,而是按软件家族切分成了若干个子项目:

子模块

对应软件

安装命令(示意)

主要场景

cli-anything-wps

WPS Office / MS Office

pip install git+https://github.com/yb2460/cli-anything-wps.git

文档、表格、演示文稿

cli-anything-photoshop

Adobe Photoshop

pip install -e .(仓库内安装)

位图、海报、图层编辑

cli-anything-illustrator

Adobe Illustrator

pip install -e .(仓库内安装)

矢量图、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 调用一旦出错抛的是 pywin32com_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

最新稳定版即可

pip install pywin32 之后建议跑一遍 post-install

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
🔒
该内容仅对更高等级社区用户开放
请谨慎解锁时效性强且发布日期较早的文章
单篇解锁后若未显示全文请刷新页面
您当前:游客 · 可见 60% 内容 · 升级至 注册用户 可见 70%
👀
游客
可见 60%
✓ 当前
注册用户
注册用户
可见 70%
社区精英
社区精英
可见 100%
社区守护
社区守护
可见 100%
仅解锁本文,永久有效。如需PDF珍藏版,请联系站长获取。 当前单篇价格 ¥9.9
✏️ 发表评论

请先登录后发表评论

前往登录
📊 站点统计
今日发布0 篇
文章总数1316 篇
昨日发布2 篇
本月发布27 篇
建站时间420 天
🔍 搜索
📅 日历
« 2026 » « 09 »
 123456
78910111213
14151617181920
21222324252627
282930    
站长微语

联系站长

QQ:2805463528
AIGC 技术社区
致力于解码 AI前沿技术 与经验分享
纯粹的技术交流社区

💡 欢迎您的建议与反馈,让社区变得更好

快速通道
联系站长
站长QQ二维码
AI交流群
AI交流群
仍在路上

那些寒夜里追赶过的方向

那些冷眼下没放弃的理想

一篇一篇写到现在

仍在路上

"不羁放纵爱自由"

—— 致敬 Beyond
持续创作中 莫潇羽 · 源码七号站