Claude Code 学习 DeepSeek Harness?Mods 能力背后的开源圈风向
【免费下载链接】claude-code-templatesCLI tool for configuring and monitoring Claude Code项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-templates
过去两周,中文社区里流传着一条耐人寻味的动态:Claude Code 最新版更新了 Mods 能力,有自媒体直接打出"致敬 DeepSeek Harness"的标题;英文圈里,remio 则用"自定义 UI 拥有完整机器访问权限"来提醒这个新功能的双刃剑属性。而在人人都是产品经理的一篇实测里,作者给 Claude Code 装了一个"雨姐"Mod——它坐在终端右侧面板里看着 Claude 跑每一条命令,拦下rm -rf,用东北话汇报工作。
三个来源、三种态度,指向同一个事实:Claude Code 从 2.1.287 起默认开启的 Mods,不再是一次小版本迭代,而是把 AI 编程代理从"黑盒执行器"推向"可编程、可观测、可接管的行为系统"。本文不站队猜测,直接从 claude-code-templates 仓库里真实存在的 mods 目录出发,拆解 Mods 到底改了什么,再回到 DeepSeek Harness 的联想上做一个事实辨析。
一、Mods 能力到底改了什么
从"外挂"到"进程内":扩展模型的一次质变
要理解 Mods 改了什么,先看它和既有扩展方式的区别。在 claude-code-templates 的组件体系里,这四种东西长期并存且容易被混为一谈:
- Skills:给 Claude 的一份"说明书",靠提示词指导行为,站在引擎外面;
- MCP:给 Claude 接上外部工具服务器,站在引擎外面;
- settings 里的 hooks:在固定时机(PreToolUse/PostToolUse 等)跑一段 shell 脚本,站在引擎外面;
- Mods(function hooks):一段跑在 Claude Code 进程内部的 TypeScript 代码,以
register(on, options)为入口,直接挂接引擎事件。
仓库在 mods 目录说明 里把定义写得很清楚:"Claude Mods are Claude Code plugins whose behaviour lives in a function-hooks module: oneregister(on, options)entry that hooks the engine's events as functions($, e, next)。" 一个$是引擎暴露给插件的能力面(UI、状态、HTTP、进程、存储、模型分类),e是事件负载(被视为只读),next是事件链上的下一环。
这四个字决定了能力边界:Skill 只能"说",Mods 能"做"。这也是雨姐那篇文章反复强调的分界线——Mod 是跑在 Claude Code 进程里的 JavaScript/TypeScript 代码,所以它能画面板、改系统提示词、在命令执行前把它拦下来。
一个最小的 Mod 长什么样
仓库里每一只 Mod 都是一个完整插件目录,严格遵循 Anthropicmods/的布局:
{category}/{name}/ .claude-plugin/plugin.json name, version, description, author, license, userConfig, types hooks/hooks.json { "description", "modules": ["./register.ts"] } hooks/** 任意数量的 .ts/.tsx 文件,相对导入 types/*.d.ts 可选:Mod 给 $ 添加的名词契约 tests/** 可选:插件测试 README.md 站点展示的说明核心只有两个文件。hooks.json声明代码位置,比如 npm-to-pnpm-rewriter 的 hooks.json 只写了两行:描述 +"modules": ["./npm-to-pnpm-rewriter.ts"]。register.tsx才是干活的函数。
版本门槛也很明确:Mods 在 Claude Code2.1.287 及以后默认开启;2.1.259 到 2.1.286 需要环境变量CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1。仓库里所有 mod 的 README 都把这一条写在 Requirements 里,例如 git-sidebar 的安装说明。
三种放置位:旁观、改写、接管
Mod 挂上事件后,对每件事有三种处置方式,这也是整个机制最精髓的部分。仓库里的安全类 mod block-destructive-commands 是最干净的"接管"示范:它挂tool.call事件并限定{ tool: 'Bash' },内置一批危险命令正则——递归删根目录的rm、git push --force、git reset --hard、DROP/TRUNCATE、mkfs、写/dev/的dd——一旦命中就返回{ deny }且不调用 next:
on('tool.call', { tool: 'Bash' }, ($, e, next) => { for (const { pattern, reason } of rules) { if (pattern.test(e.command)) { $.ui.log(`[block-destructive-commands] denied Bash call: ${reason}`) return { deny: `Blocked by block-destructive-commands (${reason}). ...` } } } return next(e) })注意它的失败策略:检查过程一旦出错,命令也不会放行(fail closed),而.catch分支保证了模型拿到的错误信息足以理解边界。这与雨姐"拦下rm -rf node_modules"的演示如出一辙,只是仓库版本更工程化——正则覆盖rm -r -f的多种变体,而不是DANGER.test()的一次性玩具。
"改写"的代表是 npm-to-pnpm-rewriter:它在命令执行前把npm/npx改成项目实际使用的包管理器(pnpm/yarn/bun),通过next转发一份改了command的事件副本,再用context告诉模型实际跑的是什么——这样模型的tool_use块保持原样,prompt cache 不被破坏。
"旁观"则是最常见的用法:await next(e)放行,拿到结果再做反应。cc-arcade 的宠物就是这么"活着"的——它挂tool.call观察 Claude 的每次测试、提交、编辑,按规则给宠物喂经验值,全程不消耗 token、不联网、不留存命令文本。
UI 与热重载:把终端变成可编程界面
Mods 最直观的冲击来自 UI。仓库的 ui/git-sidebar 是一个 lazygit 风格的侧边栏:列出当前仓库所有 worktree 和分支,点击即可/cd切换或git switch;integrations/linear-tickets 把 Linear 工单和燃尽图直接画进侧边面板。它们都用$.ui.open({ id, title })打开 Pane,用$.ui.status写状态栏,用$.ui.toast弹提示,用$.ui.resolve取到Box/Text组件。
雨姐的实测还展示了另一个硬核细节:Raster 字符画布。一个字符格装"上下两个像素"(0x2580上半块 + 前景色 + 背景色),像素图就能逐格搬进终端。这让 Mods 能渲染头像、棋盘甚至整个游戏界面——仓库 games 目录下的 cc-arcade 一口气带了九款游戏和一个养成宠物,Tetris、扫雷、打字测试,甚至一个用半块字符光线投射渲染的走廊射击游戏。
更实用的是热重载:改完register.tsx一保存,会话里立刻出现yujie: reloaded (7 hooks…),不用重启。按官方说法,Claude Code 自己就是这套机制的第一批用户——/diff命令的面板、AGENTS.md 加载、遥测上报,都是内置 Mod。
二、与 DeepSeek Harness 的对比联想
"致敬 DeepSeek Harness"这个说法传得广,但值得掰开看。DeepSeek Harness 是深度求索开源的强化学习训练/评测框架:让 agent 在 Python 环境里解决真实编程任务,通过执行结果和语言模型打分做自我博弈,进而训练出更强的推理与工具使用能力。它的关键词是"训练时",作用对象是模型权重。
Claude Code Mods 的关键词是"运行时":不改变权重,只改变 agent 与环境交互的那一层。两者一个是炼模型,一个是装脚手架,机制并不相同。
但社区把它俩并列并非毫无道理,它们共享一个底层判断:agent 的能力边界正在从"模型权重"让渡给"环境、工具与策略层"。DeepSeek Harness 证明了"环境即数据"——把执行结果喂回训练循环,模型的工具能力可以凭空长出来;Mods 则证明了"环境即产品"——把引擎的每个事件、每段 UI 开放成可编程接口,agent 的行为就可以被外部策略精确定义。一个在训练期用 harness 塑形,一个在运行期用 hooks 塑形,方向是同一个。
这个联想真正有价值的部分,是它提醒我们注意 Anthropic 对开源社区的敏感度。Claude Code 的 Skills 机制就脱胎于社区先做的技能目录(claude-code-templates 正是其中最大的聚合者之一),如今 Mods 又迅速把社区玩法(自定义面板、游戏、安全拦截、模型路由)吸收进官方框架。当一个闭源工具的路线图开始密集回应开源社区的玩法时,"致敬"与否已经不重要,重要的是风向本身。
三、开源 AI 编程工具互相学习的趋势
把视线拉远,Mods 只是这一轮"互相学习"的一小块拼图。
其一,组件库成为实验场。claude-code-templates 的 mods 目录本身就是生态互学的标本:games/cc-arcade是 vendored 自第三方作者(MIT 协议、作者署名、LICENSE 保留在目录内),integrations/pi-agent-for-claude来自外部贡献,官方声明的types/claude-code.d.ts则直接对应 Anthropic 的插件类型声明。第三方 mod 以"原样收纳 + 归属声明"的方式进入官方布局,这正是开源目录该有的样貌。
其二,能力模块化成为标配。仓库里 productivity/jev-model-router 展示了"模型路由"这类能力如何变成即插即用组件:它用一个轻量决策模型在prompt.submit时给任务分类,机械任务降级到低成本档位、困难任务升级,子代理的模型和主循环的 reasoning effort 分别可控,所有失败路径 fail-open 且带超时预算。而 security/secret-redactor(工具结果脱敏)、observability/universal-audit-log(全事件审计日志)、enterprise/admin-capability-lockdown(能力锁定)则指向另一条主线:随着 Mods 拿到"完整机器访问权限",安全与治理组件会从可选项变成必选项。这恰好回应了 remio 那条报道的警告——能力越靠近进程,权限越大,审计和信任成本也越高。
其三,事件模型正在趋同。Skill 是 Anthropic 先向社区学的,Mods 的 hook 事件模型(session.start、prompt.submit、tool.call、ui.render、turn.complete)又与 OpenCode、Windsurf 等开源/竞品代理的事件系统在结构上彼此呼应。Cursor 靠编辑器深度绑定,Copilot 靠模型与 IDE 生态,Claude Code 押注"进程内可编程 + 终端 UI",DeepSeek 押注"环境内强化学习"——四家路径不同,却都在做同一件事:把 agent 的行为从不可预测的提示词对话,改造成可定义、可验证、可拦截的工程系统。
回到开头那个问题:Claude Code 是不是"学习"了 DeepSeek Harness?从机制上不是,从方向上可能是。Mods 让每一个终端用户都能像训练时给 agent 设计环境那样,在运行时给 agent 设计行为边界。无论灵感来自哪里,这场由 Skills、Mods、harness 们共同推起来的"agent 行为工程化"浪潮,已经不再属于任何单一项目——它是整个开源 AI 编程圈正在共同回答的下一道考题。
【免费下载链接】claude-code-templatesCLI tool for configuring and monitoring Claude Code项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-templates
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考