本文是一份写给新手的 DeepSeek Harness(DSH)插件开发实战教程。我们会搞清楚插件到底是什么、一个插件必须包含哪些东西,然后用一个真实做出的"实时系统监控"插件走一遍完整流程,最后告诉你怎么启动、使用、更新、停止、卸载。
提示词模板(可直接使用)
让 AI 开发 DSH 插件和让 AI 写个脚本不一样——插件有自己的一套规范和文件结构。如果提示词里不交代清楚,AI 很容易写出"看起来对、但装不上"的代码。
请帮我为 DeepSeek Harness(DSH)开发一个插件,功能是:[你的功能描述]。
背景与规范:
1. DSH 是基于 Cordis 的插件框架,扩展功能只能通过写插件实现,不要修改平台核心代码。
2. 一个插件包必须包含:入口代码(export function apply(ctx),内部用 ctx.effect() 注册功能)、inject 声明需要的服务、package.json 里的依赖声明、tsconfig/tsdown 编译配置。
3. 先判断我的功能属于哪种居住形态,只写需要的部分:
- 纯 Host 端(后台能力,放 packages/host/ 下)
- 纯 Client 端(界面,放 packages/client/ 下)
- 两边都要(拆成 Host + Client 两个包,通过 RPC 通道连接)
4. 浏览器插件要在 package.json 里加 dsh.client 声明,界面通过槽位注册(ctx.slots.register)挂载。
5. 所有注册都要用 ctx.effect() 包裹,保证插件卸载时自动回收。
6. 网络/平台相关调用必须做容错:失败只返回空数据,不能拖垮整个插件。
请按以下步骤交付:
1. 先给设计方案:包结构、Host/Client 划分、数据流;
2. 再给完整代码:每个文件的路径 + 内容;
3. 给"接线清单":tsconfig 要加哪些引用、bundle 补丁要加哪些行、package.json 要加哪些依赖;
4. 给构建与测试命令;
5. 最后写一段"如何启动、使用、停止、卸载"的说明。
注意:如果你不确定 DSH 的具体 API 或规范,请先查阅项目的 docs/architecture.md、packages/AGENTS.md、docs/cookbook/adding-a-package.md,不要凭空假设接口。
第一部分:认识 DSH 插件
DSH 是一个开源的 Agent 开发框架。你可以把它想象成一个"搭积木的平台":平台本身提供了地基(和模型对话、执行命令、保存会话等能力),而插件就是一块块积木,想加功能就搭一块积木,不想要就拿掉,平台本身不用动。
每个插件还有"可撤销"特性:卸载时所有注册的东西(命令、界面、数据通道)都会被自动清理干净。
一个插件必须包含哪些东西
一个插件 = 插件本体 + 几份报名表:
- 入口代码:apply 函数,用 ctx.effect() 注册功能,卸载时自动回收
- inject 声明:声明需要什么服务,平台等它准备好再启动
- 配置补丁行:在配置里"点名",平台按名单逐个加载
- package.json 依赖:Web 界面用的话要在 Web 层包声明里写上
- tsconfig + tsdown:声明编译规则,加进构建清单
- 界面报名表(可选):package.json 声明 dsh.client,代码里用槽位注册挂界面

插件的三种居住形态
DSH 应用是"后台程序 + 浏览器页面"结构。插件住哪边由功能决定:
- 纯 Host 端:只在后台跑,不碰界面(如 webserver、插件清单)
- 纯 Client 端:只做界面展示(如主题皮肤、自定义 UI)
- Host + Client 两端:既要采集数据又要画界面,拆成两个包通过 RPC 通道连接
第二部分:实战——开发一个系统监控插件
我们做一个"实时系统监控"插件,能在浏览器侧边栏显示 CPU、内存、磁盘使用率。

第一步:创建 Host 端(后台数据采集)
Host 端负责采集系统数据,放在 packages/host/system-monitor/ 下。

第二步:创建 Client 端(浏览器界面)
Client 端负责在侧边栏显示监控面板,放在 packages/client/system-monitor/ 下。

第三步:配置与编译
添加 tsconfig 引用、tsdown 编译配置、package.json 依赖声明,然后执行构建命令。
第三部分:启动、使用、更新、卸载
插件开发完成后,可以通过 DSH 的插件管理界面进行启动、停止、更新和卸载操作。所有操作都是热更新的,不需要重启整个应用。

总结
DSH 插件开发的核心要点:用 ctx.effect() 包裹所有注册保证可撤销、先判断居住形态再动手、inject 声明依赖、通过 RPC 连接 Host 和 Client。掌握了这套流程后,开发任何 DSH 插件都是套用同样的模式。