DeepSeek Harness 加了 Claude Code Mods 兼容层,跨工具插件可以复用了

DeepSeek Harness 加了 Claude Code Mods 兼容层,跨工具插件可以复用了

10 月 3 日发布的 dsh v0.2.1-alpha.1 里,DeepSeek 把 Claude Code 插件里那套 Mod 机制接了进来,但官方明说这只是验证性兼容层。

阅读原文
发布日期2026-10-04
热度指数88
阅读时长4310 字

事件:dsh v0.2.1-alpha.1 加入 Claude Code Mods 兼容层

10 月 3 日,DeepSeek 开源智能体外壳 DeepSeek Harness(下文简称 dsh)放出 v0.2.1-alpha.1 版本,GitHub Release 页面标注的发布时间是 UTC 10 月 3 日 06:42,也就是北京时间当天下午两点四十二分。这条 Release 列出的第一条新增功能就是:新增实验性的 Claude Code Mods 兼容层。

官方给的措辞相当克制:目前阶段的主要目的是验证 Claude Code Mods API 功能大致为 DeepSeek Harness 插件的一个子集,而不是为用户提供实际的完整兼容性。这句话值得逐字读——它说明这不是「dsh 现在能跑 Claude Code 的插件」,而是「DeepSeek 想先确认自己这套插件架构到底覆盖了 Claude Code 插件能力的多少」。

这个改动在代码里留下的痕迹很清楚。10 月 3 日凌晨合入的提交叫 feat(experimental): add Claude Code mods bridge,来自名为 feat/experimental-claude-code-mods-20261002 的分支,一个提交动了 121 个文件,新增了一份 146 行的 docs/subsystems/claude-code-mods.md 专门逐条对比两边行为差异。也就是说,这不是随手加的几个 hook,而是有人把差异写成了文档。

Mods 是什么:Claude Code 2.1.287 刚放出来的那层机制

要理解这次兼容,得先知道 Mods 是什么。Claude Code 2.1.287 版本的更新日志第一句就是 Added Claude Mods: plugins may now modify deeper behavior——插件从此不只是往会话里挂命令,而是可以修改更底层的行为。同一个版本还内置了一个叫 You should know 的官方 Mod,它派一个旁路智能体盯着你,替你和你自己都可能漏掉的点做提醒,启用方式是 /plugin enable cc-plugin-you-should-know@builtin。

Anthropic 在 10 月 1 日的官方博客 Getting started with Claude Code mods 里给了一句定义:Mods 是打包在插件内部、在你的 Claude Code 会话里运行的 hooks。关键在 hooks 这个词——它意味着 Mod 能挂在会话生命周期的具体事件上,而不是只能在用户敲回车之后被动响应。

DeepSeek 的兼容文档正是以 Claude Code 2.1.287 为基准写的。文档里有一张对照表,逐行说明每个事件在这个桥接层下的实际行为。比如 session.start 在 Claude Code 里是每个会话在第一条提示词之前触发一次;在桥接层里,它由 agent/created 派生出来,给根智能体触发,子智能体不触发。

这个桥接层能做什么,不能做什么

官方文档里最值得看的是「不能做什么」那一半。结论大致是:一个 Claude Code 插件装进 dsh 之后,plugin.json 和 hooks.json 都不再被读取,Mod 会被 defineMod({ name, version, root, userConfig, register }) 包一层,然后通过 cordis.yml 挂载——也就是走 DeepSeek Harness 所有插件共用的那一条组合机制。示例目录保留了原始清单文件,所以它们在 Claude Code 那侧仍然能直接用。

差异集中在几处。权限层级上,Claude Code 有 user、project、managed 三档,桥接层一律按 user 加载,测试里的 tier() 会被接受然后忽略,next.to 直接拒绝。命令层面,claude plugin validate、claude plugin test、类型生成都没有,取而代之的是在 Vitest 里用 createModTestKit 做测试。热重载也不是原来那套——重新挂载会在同一个已求值的模块上重跑 register,所以模块级变量会保留原来的值。

还有一条更硬的安全差异,值得单独标出来。文档写得很直接:Mod 与 Claude Code 一样在进程内运行,但这里能拿到 Node 的全部全局对象和进程的完整权限,$.env 能读写 harness 的环境变量,$.http.fetch 能请求任意 URL,$.fs 和 $.tool.call 直接以当前会话的身份操作。文档末尾那句提醒是:No sandbox is applied to mods; mount only mods you would run as a plugin。装第三方 Mod 之前,请按运行任意本地代码的标准来审查它。

怎么验证:本地跑起来看行为差异

如果你想自己确认这套兼容层的实际边界,最快的路径是官方 README 给的两行命令。先装 Node.js,然后执行 npx @deepseek-ai/dsh web,默认会在 http://127.0.0.1:3080 启动 Web 界面并自动打开浏览器;加 --no-open 可以只起服务不开浏览器。SSH 场景下它只打印主机地址,因为本地端口转发由你的 SSH 客户端或编辑器掌握。

想从源码验证的话,README 给的顺序是 clone 仓库、pnpm install、pnpm run build,然后 pnpm dsh web——最后这条会直接复用已构建的产物,不再重新打包。对写插件的人来说,更实用的验证点是那份对照文档本身:它列出了桥接层里所有与参考实现不一致的地方,没列出来的行为就按 Claude Code 的说明走。

另一个判断真假的信号是错误信息。如果某个 Mod 调用了桥接层没有提供的 $ 方法,请求会直接被拒,并给出 no implementation for <namespace>.<method>;如果 Mod 挂了一个宿主根本不会触发的事件,加载时会有警告点名。这两条机制的存在,说明开发者自己也知道这是个半成品。

同一个版本里另外几处更实用的改动

如果 Mods 兼容层还太实验性,同一个版本里有几条改动对日常使用更直接。插件管理页新增了「让 Agent 创建插件」入口,进入创造模式时会先保留草稿,只有把需求发出去才开始执行——这意味着你可以描述需求、审一遍草稿、再让它动手,而不是一开始就让它写。

Web 端新增了 --public-url 参数,用来指定展示、打开并提供给模型的对外访问地址,并且支持带路径前缀的反向代理入口。对把 dsh 部署在自己域名下的团队来说,这条比图标之类的东西有用得多。另外还多了一个可选的开发者工具组合包,提供会话原始日志、聊天分组与正文的双向定位,以及内嵌的宿主诊断工具,内嵌 DevTools 目前只有英文界面。

会话体验上也有几处:新会话支持预填未发送的提示,恢复草稿或切换工作区时会保留文件、目录和会话引用;Markdown 文件预览会把 YAML 头部元数据显示成清晰的字段列表。工具调用在准备阶段就能显示已到达的命令说明、文件路径和内容生成进度,不必等它跑完才知道在干什么。考虑到 dsh 目前仍是官方明示的 developer preview 状态,这些体验修正的实际价值,可能高过那个需要你理解「子集」概念的兼容层。

破坏性变更清单:升级前必须过一遍

这一版里有三处明确标注为破坏性变更,升级前建议先读完。第一,运行时 invariant 插件及各包的 ./invariant 导出被移除,依赖这些诊断入口的扩展和自定义 profile 需要调整。第二,输入区的统计扩展从一整行 stats 拆成 activity 和 usage 两个独立入口,覆盖旧 stats 整行的插件需要更新注册 ID。第三,子路径插件不再读取独立的 package.json,显示文本和图标必须通过对应子路径导出,插件开发模板也同步补齐了本地化信息与图标。

还有两处行为变化容易被忽略。一是自动化任务改为 Web 内置能力,提醒工具按模式提供:标准、创造和 PTC 模式可用,极简模式和子代理不可用;旧的实验组合包选择会被自动清理,但已有任务保留。二是关闭代码工作视图后仍可选择标准、创造和自定义模式,内置的 PTC 和极简默认值改为标准,不过已有会话会保持原模式。Replace 版本这件事官方也提醒了:替换已安装的包版本仍需重启。

需要说清楚的是,这些变化的根源是这个项目自己的定位。dsh 的 README 里写着一句很不客气的警告:THERE WILL BE COMPATIBILITY-BREAKING CHANGES。官方把兼容层标记为 experimental,破坏性变更放在同一个版本里发布,都属于这个阶段的正常节奏——但也意味着如果你的生产环境跑在 dsh 上,升级节奏要自己控住。

谁该现在跟进,谁可以先等等

编辑判断先说结论:这次改动对谁有影响、影响多大,判断依据是它落在哪一层。结论是普通用户和只在应用里聊天、写点代码的人,这一版可以完全跳过。它不影响任何模型能力,也不改变 API 定价,dsh 本来就是需要自己跑的开发工具。

值得跟进的是三类人。第一类是在 dsh 上写插件、又不想被锁死在 DeepSeek 生态里的开发者——这次留了一条把插件复用到 Claude Code 的路径,但要清楚它现在是子集关系,别按完整兼容去做产品设计。第二类是把 Claude Code 当主力、同时想试试国产开源外壳的团队,可以拿这份对照文档当评估清单,先跑一遍再看要不要迁。第三类是维护自己内部 harness 的人,121 个文件、专门写一份行为差异文档这个做法本身就值得抄——跨工具兼容最怕的就是「基本能用」这种含糊承诺。

如果你已经用 Claude Code Mods 做了一些小工具,这次提供了一个提前试错的位置:不用真换主力工具,在 dsh 里就能验证哪些 Mod 依赖的是宿主特有行为。反过来,如果你依赖的是 next.to 分层下发权限,或者重度依赖 claude plugin test 这套命令链,桥接层目前给不了,别硬迁。

下一步我会盯两件事:一是这份兼容层会不会从 experimental 摘掉,以及摘掉时官方补上哪些差异行;二是 Claude Code 侧 Mods 的迭代速度,毕竟 2.1.287 才是几天前的事,Mods 这块现在还处在快速变动期,今天的子集关系三个月后可能就不成立了。

来源与说明

本文由 AI 潮汐编辑部基于官方公告与公开资料整理,补充了行业影响、适用场景和行动建议,帮助你在阅读原文前先理解这条信息为什么重要。

原始来源:https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.1

如发现事实、价格或链接有误,可通过 联系我们 提交更正。

常见问题

DeepSeek Harness 现在能直接装 Claude Code 的插件吗?

不能完整地装。这次加的是实验性兼容层,官方目标只是验证 Claude Code Mods 的功能大致是 DeepSeek Harness 插件能力的子集。plugin.json 和 hooks.json 不再被读取,Mod 会被 defineMod 包一层后通过 cordis.yml 挂载;权限层级一律按 user 处理,next.to 会直接拒绝,claude plugin validate 和 claude plugin test 这些命令也都没有对应实现。

把 Claude Code 的 Mod 装进 dsh 安全吗?

官方文档写得很直接:Mod 在进程内运行,能拿到 Node 的全部全局对象和进程完整权限,$.env 可以读写 harness 环境变量,$.http.fetch 可以请求任意 URL,$.fs 和 $.tool.call 直接以当前会话身份操作,并且明确说明没有对 Mod 施加沙箱。文档给的操作建议是只挂载那些你本来就会当插件运行的 Mod——也就是说按运行任意本地代码的标准审查来源。

这次升级会破坏我现有的 dsh 插件吗?

有可能。v0.2.1-alpha.1 里有三处明确标注的破坏性变更:运行时 invariant 插件及各包的 ./invariant 导出被移除;输入区统计扩展从 stats 拆成 activity 和 usage,覆盖旧 stats 整行的插件需要更新注册 ID;子路径插件不再读取独立的 package.json,显示文本和图标必须走子路径导出。另外自动化任务改成 Web 内置能力,提醒工具在极简模式和子代理下不可用。dsh 官方本身仍标注为 developer preview,README 里直接写着会出现兼容性破坏变更。

这个版本里哪个功能对日常使用最实用?

如果只用得上插件管理,插件页新增的「让 Agent 创建插件」入口比较实际——它会先保留草稿,发送需求后才开始执行,可以先审草稿再让它动手。Web 端的 --public-url 参数则让自建部署能指定对外地址并支持带路径前缀的反向代理入口。此外还有可选的开发者工具组合包,提供会话原始日志和内嵌宿主诊断工具。

怎么自己验证 Mod 到底能不能跑?

装好 Node.js 后执行 npx @deepseek-ai/dsh web,默认在 http://127.0.0.1:3080 启动 Web 界面;加 --no-open 可以不起浏览器。验证行为边界最快的办法是读仓库里的 docs/subsystems/claude-code-mods.md,那份文档以 Claude Code 2.1.287 为基准逐行列出了两边不一致的地方,没列出来的行为就按 Claude Code 的说明走。如果 Mod 调用了未实现的 $ 方法,会被拒并返回 no implementation for <namespace>.<method>;如果挂了宿主不触发的事件,加载时会有警告点名。