DeepSeek Harness Hub
← 返回列表

插件固化器swaylq/dsh-genie

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

把 agent 临时写的动态插件一键固化为永久插件

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/15 · 已提供中文文档

超越会话的愿望——将 DeepSeek Harness 代理的运行时插件变为永久安装的插件。无需 pnpm,无需网络,无需构建授权。

综合分
27.5
GitHub 分
27.5
用户评分
★ Stars
1
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add swaylq/dsh-genie
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

🪔 dsh-genie

让愿望活过这一次会话。

DeepSeek Harness 本来就会自己写插件,
只是留不住。这个包补的是后半截。

缺的那一半

DeepSeek Harness 自带一套自引用工具集 —— cordis_inspect、cordis_define、cordis_run ——
agent 可以现场写一个插件,热挂进正在跑的进程。你说一句想要什么,它当场造出来,当场就能用。

然后你一重启,没了。这是那套工具集官方 README 的原话:

动态包只存在于共享 DSH 进程内存中。……它不会创建插件文件、安装任何包、修改 cordis.yml
或个人/项目配置、跨重启存续,也不能自动转为正式插件。若要保留实验结果,应让 agent
通过常规开发流程实现普通的本地、项目或仓库插件。

dsh-genie 就是把这句「常规开发流程」压成了一次工具调用。

完整闭环

你   ▸ 以后我每次说「发车」,就把改动全暂存、生成 message 提交

▸ agent 写好插件,cordis_run 挂上                    ← DSH 自带
▸ 你试了一下,好用
▸ 「留着」
▸ genie_keep dyn-1 → dsh-wish-ship-it                ← 本包

▸ 重启
▸ 还在。

两个让这件事真正舒服的细节:

- 不用 pnpm、不联网、不需要构建授权。 实现的愿望直接写进 $DSH_HOME/genie/,
再软链到启动器本来就会查找模块的地方。对比一下从 git 装插件的常规路径:作者得提供
prepare 脚本,你还得给一次 allowBuilds 授权 —— 那等于允许该包的代码在安装时于你机器上执行,
而且不在 agent 的任何沙箱里。
- 它就是一堆文件。 每个愿望都是一个能读的目录,里面是 package.json、cordis.patch.yml
和 index.js。你可以读它、改它、git init 它、发布它。授予之后 dsh-genie 再也不碰它。

安装

dsh plugin --profile web add github:swaylq/dsh-genie

然后重启 dsh。就这样 —— 纯 JavaScript,没有构建步骤,所以没有 prepare 脚本,
也没有任何东西需要你授权。

已经自己挂了 @deepseek-ai/dsh-tool-cordis?见组合。

装完多了什么

| | |
|---|---|
| genie_keep | 把 agent 刚验证好的动态包变成永久插件。只在动态包 runner 已组合时出现。 |
| genie_wish | 同样的事,但直接从 agent 写的代码来,跳过原型步骤。 |
| genie_list | 本机所有愿望,以及它在当前 profile 里是否生效。 |
| genie_revoke | 撤销一个愿望。默认保留源码。 |
| /wish | 给人看的那一面:授予了什么、哪些在生效、代码在哪。 |

这个组合包还会挂上 @deepseek-ai/dsh-tool-cordis,也就是 DeepSeek Harness 自带的那套自我改造工具集。
它随每份安装一起发货,但官方 web profile 默认不挂 —— 它的 runner 倒是挂着的,
所以打开它一个包都不用装。

原理

关于启动器的三个事实,全部来自公开文档,没有用任何私有接口:

1. profile 解析组合包有两个锚点 —— 先是 dsh 安装目录,然后是 profile 目录。
Node 从 /package.json 开始的父级查找会走到 $DSH_HOME/profiles/node_modules,
那是启动器维护的扁平回退目录,让内置插件从任意 profile 都能解析到。
2. 那个目录实际上只增不减。 healProfilesModuleFallback 会保留正确的链接、
给搬过家的重新指向,但从不清理不归它管的东西 —— 所以种在那儿的软链能活过每一次启动。
3. dsh plugin 不会回收这个层。 它的对账逻辑只移除「名字曾经或现在是 profile
dependencies 键」的组合包。dsh-genie 只写 dsh.profile.bundles,从不写 dependencies,
所以你之后 dsh plugin add 别的东西,愿望不受影响。

于是「实现一个愿望」就是:写包 → 软链进回退目录 → 往 profile 的有序组合包列表尾部追加一个名字。
没有安装器,没有注册表,没有构建。

有一个坑值得单独说,因为每个人都会踩一次:Node 解析一个包自己的 import 时,
用的是它的真实目录,不是找到它的那条软链。 放在 $DSH_HOME/genie/ 的愿望,
父级查找会走 genie → $DSH_HOME → ~,永远碰不到回退目录。所以 dsh-genie
在愿望旁边种了一条 $DSH_HOME/genie/node_modules → $DSH_HOME/profiles/node_modules,
把所有内置包重新放回查找路径上。同样的道理,dsh-genie 自己不声明任何运行时依赖 ——
它通过 profile 去加载 @deepseek-ai/dsh-tools,和启动器解析自家组合包的方式一样,
所以无论你是 link: 本地检出、git 安装、npm 安装,还是手动丢一个目录进去,它都能跑。

信任立场

这一节请在安装前读,不要装完再读。

一个被实现的愿望,就是每次启动都会执行的普通代码,拿着 harness 的完整上下文。
这既是本包的意义,也是它的全部风险。dsh-genie 并没有给 agent 增加它原本没有的能力 ——
一个有 bash 权限的 agent 本来就能写出这些文件 —— 但它确实把这件事从「一串看得见的操作」
压成了「一次工具调用」,而这种便利恰恰值得说清楚。

设计上做了这些事:

- 写它的那次会话里,什么都不会跑起来。 一次授予只是写文件加改一份 manifest。
代码要到下次重启才加载,而重启只有你能做。那次重启就是检查点,每个工具结果都会这么说。
- 验证不靠执行。 生成的模块用 node --check 做解析检查,只解析不求值。
解析不过的愿望什么都装不上。
- 一切可列举、可撤销。 /wish 和 genie_list 会列出每个愿望和它的源码路径;
genie_revoke 负责移除。撤销只接受 dsh-wish-* 开头的名字,所以打错一个参数
也不可能把 dsh-base 从列表里删掉。
- 愿望名是一个校验过的路径段。 没有 scope、没有点号、没有路径穿越。

它不做的事:不给愿望加沙箱、不替你审代码、不会再问你第二遍。
如果换成一个 agent 写的脚本你不读就不敢跑,那就在重启之前把愿望读一遍 ——
工具结果把确切路径交给你,就是为了这个。

上游对它所依赖的那套工具集,立场是一样的,值得复述一次:cordis_run 背后的 vm 沙箱
「隔离全局变量,但不是安全边界……应当像对待 bash 访问一样对待该工具集」。

组合

这个组合包插入两行:genie-tool-cordis 和 genie。如果你 profile 里已经有别的东西挂了
@deepseek-ai/dsh-tool-cordis,两次注册会抢同一批工具名,加载会大声失败(这是 DSH 有意为之)。
在你自己 profile 的 cordis.patch.yml 里关掉我们这行即可:

- id: genie-tool-cordis
disabled: true

genie 行上的配置:

| 键 | 默认 | 含义 |
|---|---|---|
| allowUpdate | true | 是否允许 mode: "update" 覆盖已有的愿望 |

已知限制

- 保留下来的动态包换了 realm。 cordis_define 的代码跑在 vm 沙箱里,那里 Node 全局变量
要么不存在、要么被重定向到 Cordis 服务。留下来的愿望跑在普通 Node 里,所以针对那些
façade 写的代码可能需要改。genie_keep 会要求模型在代码碰到这些东西时主动说明,
但它没法替你改代码。
- 层是追加的。 一个愿望叠在 dsh-base、模式组合包和它之前装的每个插件之上。
patch 是整个 config 替换而不是深合并,所以想覆盖已有行的愿望必须把那行需要的每个键都重写一遍。
- DSH 还是开发者预览。 上游明说会有破坏性变更。本包依赖的是有文档的启动器行为而不是内部实现,
但「有文档」和「稳定」现在还不是一回事。
- 浏览器半只存不挂。 genie_keep 会把 client.js 存在 host 半旁边备查,
把浏览器半接进 Web UI 目前仍是手工活。

开发

npm test          # 19 个测试,跑在真实的一次性 Harness home 上,不联网

lamp.js 是全部安装机制,不 import 任何 DSH 的东西 —— 纯 node:fs,可以单独测。
index.js 是插件那一面。

许可证

MIT

基于 DeepSeek Harness(MIT)与
Cordis 构建。与 DeepSeek 官方无关联。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(swaylq)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群