前言¶
DeepSeek Harness(以下简称 DSH)的核心理念是「一切皆插件」:模型、工具、会话、沙箱都可以在配置层替换,而不必去改框架源码。它目前仍是开发者预览版,仓库在 deepseek-ai/deepseek-harness。社区里也出现了一批第三方插件目录,例如 DeepSeek Harness 插件库——需要说明的是,这类目录是独立站点,和 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。
真正上手之后,一个很具体的缺口很快会冒出来:DSH 内置的 read 只处理 UTF-8 文本。工作区里常见的 .xlsx、.pdf、.docx、.pptx、.ipynb,直接当文本打开是打不开的。Claude Code 原生能读 PDF 和笔记本,Codex 这边则几乎没有对应能力。dsh-cowork 做的就是把这一层补上:给智能体一对受控的 doc_read / doc_write,按单元格、页、幻灯片或笔记本单元格去读写,而不是把整份二进制文件塞进上下文。
这是什么¶
dsh-cowork 是一款工作流与自动化类插件,由 Jesse-njx 维护,仓库地址是 Jesse-njx/dsh-cowork,许可证为 MIT,主要语言是 TypeScript。根包版本号目前是 0.1.0,要求 Node.js 20+。截至 2026-08-18,GitHub 上的星标为 4。插件库目录页收录于 2026-08-14,安装命令里的仓库名为 Jesse-njx/dsh-cowork。
它解决的问题可以收成一句话:让 DSH(以及其他走 MCP / CLI 的智能体)在有界窗口里读写办公文档和 Jupyter 笔记本,读写共用同一套稳定地址,而不是各写各的解析器。
目录页上有一段 FAQ 写成了「多智能体协作」,和仓库 README、GitHub 简介以及目录页「更多介绍」都不一致。后三者都明确说这是文档读写插件。下文以仓库 README 与源码为准。
核心功能¶
仓库把能力拆成两个工具,而不是五个格式各做一套 API。
1、doc_read:按窗口抽取内容。xlsx 返回带单元格引用的表格(如 A1、C12);ipynb 返回单元格和内联输出;PDF 按 pages 取文本窗口;docx 取段落和字数;pptx 取幻灯片和形状 id。
2、doc_write:v1 只覆盖两种格式。xlsx 按单元格引用新建或编辑;ipynb 按单元格下标新建或编辑。PDF、docx、pptx 目前只读,README 把表单填写和文档生成放在 v2。
「Cowork = READ + WRITE」能合成一套工具,靠的是两个设计:
- 稳定地址。 行号对二进制格式没有意义。
doc_read给出的单元格引用、形状 id、单元格下标,可以直接交给doc_write使用。 - 有界窗口,并且截断必须说出来。 每次读取都有上限(页 / 行 / 幻灯片 / 单元格 / 字节)。窗口被截短时会出现
> Truncated:,而不是悄悄丢掉后半段。
仓库是 pnpm monorepo,和文档读写直接相关的包如下:
| 包 | 作用 |
|---|---|
packages/core |
纯 TypeScript,不依赖 DSH:嗅探、抽取、构建、窗口化和安全上限 |
packages/dsh |
DSH 插件包,注册 doc_read / doc_write,包名 @dsh-cowork/plugin |
packages/mcp |
基于 stdio 的 MCP 服务器,给 Codex、Claude Code 或其他 MCP 客户端用 |
packages/cli |
doc-read / doc-write 命令行,附带一份 SKILL.md |
英文 README 还列出了 packages/chatnode-wechat,用来通过微信会话节点查看和批准 DSH 智能体。这和文档读写不是同一条能力线,中文 README 的包表里没有写它,这里不展开。
安全模型在 README 里写得很具体,不是口号:
- OOXML 归档在解压前检查条目数和解压后大小,用来挡住 zip 炸弹。
- 含
vbaProject.bin的宏格式(.xlsm/.docm/.pptm)一律拒绝,插件不读写这类文件。 - 沙箱处于
read-only时,doc_write被硬性禁止,doc_read仍可用。 - 编辑前必须在本会话读过该文件(
expected_version),还可以加内容哈希(expected_sha256)。 - 覆盖已有文件:在 DSH 里需要先读过;CLI / MCP 则要显式
force。 - 写入走临时文件再重命名,避免留下半成品。
- 被改过的 xlsx 会清掉缓存的公式结果,让 Excel / LibreOffice 打开时重算(exceljs 本身不算公式)。
- 公式、隐藏工作表、演讲者备注只当数据展示,不执行。
DSH 插件包读文件走 ctx.fs(有界 readBytes、沙箱路径解析、fs/observed 事件)。因为 fs 服务只支持文本写入,字节写入由插件自己做原子重命名,写完再观察真实版本号,好让内置策略继续生效。
安装与启用¶
插件库目录页给出的安装命令是:
dsh plugin add github:Jesse-njx/dsh-cowork
需要可复现安装时,目录页建议固定 commit 哈希:
dsh plugin add github:Jesse-njx/dsh-cowork#commit
把上面的 commit 换成实际哈希即可。
仓库 README 和 docs/shipping.md 写得更细:当前没有发布到 npm,分发渠道是 GitHub;真正给 DSH 用的插件包在 packages/dsh,不是仓库根目录。仓库推荐的安装步骤是先克隆、安装依赖并构建,再按 profile 添加本地路径:
git clone https://github.com/Jesse-njx/dsh-cowork.git
cd dsh-cowork
pnpm install
dsh plugin --profile <你的profile> add ./packages/dsh
pnpm install 会触发根包的 prepare,把各包构建出来。开发依赖里能看到 @deepseek-ai/dsh-* 的版本是 0.1.0-rc.6,说明它是对着当前 DSH 预览版写的,后续接口若有破坏性变更,需要再核对兼容性。
装好之后,模型侧会出现 doc_read / doc_write。README 建议用一次真实会话验证:让模型对一份 .xlsx 调用 doc_read。
可选配置写在 profile 的 cordis.patch.yml 里,覆盖 cowork-docs 这一行。下面这些是 README 给出的默认值,都可以改:
- id: cowork-docs
name: '@dsh-cowork/plugin'
config:
maxInputBytes: 67108864
maxOutputBytes: 262144
maxDecompressedBytes: 536870912
maxZipEntries: 4096
maxPages: 20
maxSheetRows: 200
maxSheets: 1
maxSlides: 20
maxCells: 200
含义大致是:单次输入上限 64 MiB,面向模型的窗口 256 KiB,解压上限 512 MiB(zip 炸弹防护),PDF 每窗口最多 20 页,xlsx 每窗口 1 张表、200 行,pptx 最多 20 页幻灯片,ipynb 最多 200 个单元格。
典型用法¶
装进 DSH 之后,优先让模型走工具,而不是自己在 shell 里拆 OOXML。xlsx 读出来是带单元格引用的 Markdown 表,后续编辑直接用这些引用,不要靠「第几行第几列」去猜。
如果智能体不在 DSH 里跑,同一套核心库还提供 MCP 和 CLI。MCP 配置示例(把路径换成你的克隆目录):
{
"mcpServers": {
"cowork": {
"command": "node",
"args": ["<repo>/packages/mcp/lib/index.js"],
"cwd": "<工作目录>"
}
}
}
命令行由 @dsh-cowork/cli 提供,二进制名是 doc-read 和 doc-write。仓库给出的例子:
doc-read report.xlsx --sheets Data --rows 50
doc-write edit report.xlsx --spec edit-spec.json
packages/cli/SKILL.md 把参数写得更完整。读取侧常用窗口参数包括 --page / --pages、--sheets、--row-offset / --rows、--slide / --slides、--cell / --cells、--max-bytes;加 --json 会输出带地址、公式和提示的结构化窗口,而不是 Markdown。
写入侧分创建和编辑:
doc-write create <file> <xlsx|ipynb> --spec spec.json [--force]
doc-write edit <file> --spec spec.json [--force]
规格文件的形状以 CLI 文档为准,例如:
- 新建 xlsx:
{"sheets":[{"name":"S1","cells":[{"ref":"A1","value":42}]}]},值可以是字符串、数字、布尔、null,或{"formula":"SUM(A1:A2)"}。 - 编辑 xlsx:
{"format":"xlsx","edits":[{"sheet":"S1","ref":"A1","value":"x"}]}。 - 新建 ipynb:
{"cells":[{"type":"markdown","source":"# Hi"},{"type":"code","source":"print(1)"}]}。 - 编辑 ipynb:
{"format":"ipynb","edits":[{"op":"replace","cell":0,"source":"..."}]},op可以是replace、insert、delete。
覆盖已有文件时,CLI / MCP 需要 --force。编辑完成后,文档建议再 doc-read 一次,确认结果后再告诉用户已经改好。出现 > Truncated: 时,应提高 offset 继续读,而不是把没看到的部分补完。
适用场景与注意事项¶
比较适合这几类工作:
- 让 DSH 智能体读报表、改单元格、抽 PDF 文本、看幻灯片结构,或改 Jupyter 笔记本里的某个 cell。
- 已经在用 Codex / Claude Code,希望用同一套文档能力,通过 MCP 接进去。
- 只想在终端里对二进制文档做有界抽取或按规格编辑,用 CLI 即可。
使用前有几件事需要先看清楚。
第一,插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前应检查源代码仓库和许可证;目录页也写了同样的警告。本仓库是 MIT,源码公开,但仍建议先看 packages/dsh 和 packages/core,确认读写边界可以接受。
第二,v1 的写入范围只有 xlsx 和 ipynb。不要默认它能生成 Word、PPT 或填写 PDF 表单,那些在路线图里标成 v2。
第三,宏启用格式会被直接拒绝。需要保留宏的工作簿、文档、演示文稿,不要交给这个插件改。
第四,默认窗口很小:xlsx 默认一次只看 1 张表、200 行。大表要靠 offset 分段读。截断提示是机制的一部分,不是出错。
第五,DSH 仍在快速迭代,仓库也标明预览期可能有破坏性变更。@dsh-cowork/plugin 目前按 0.1.0-rc.6 的 DSH 包来写 peerDependencies,升级 DSH 之后应再跑一遍 doc_read / doc_write。
小结¶
dsh-cowork 没有去改 DSH 源码,而是按官方 CONTRIBUTING 推荐的路径,做成仓库外插件:用 doc_read / doc_write 给智能体补上办公文档和笔记本的受控读写。读五种格式,写两种;地址稳定,窗口有界,宏文件和 zip 炸弹有明确拒绝规则。同一套核心还可以经 MCP 和 CLI 接到别的 harness 上。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-cowork/
GitHub:https://github.com/Jesse-njx/dsh-cowork