dsh-plugin-practice: A DSH plugin practice repository that fits into your profile

前言

DeepSeek Harness(下文简称 DSH)的理念是「一切皆插件」:Tool、Config、Service、Event、middleware 最终都要以插件的方式接入。对刚开始接触插件开发的人来说,难点通常不是缺文档,而是缺一个把概念串起来、能装进 profile 跑通、每一步都有可观察输出的最小例子。

下面介绍 dsh-plugin-practice。它把插件开发的核心概念拆成六个递进的小课,代码按课程逐步累积,本身同时也是一个标准 DSH Bundle,可以用官方命令安装和卸载。

这是什么

dsh-plugin-practice 由 Ri0n72Y 维护,定位是用于学习 DeepSeek Harness / Cordis 插件开发的最小练习仓库,版本 0.1.0。它是 TypeScript 包,通过 prepare 脚本用 tsdown 从 src/ 构建到 lib/

它解决的具体问题是:每个概念都落成一段可运行代码,并给出从构建、安装、启动到验证的完整命令链;每课都有对应的 Agent 测试语句和预期输出,学完即可自行验证。

仓库里有两个 patch 文件,对应两种加载方式:cordis.patch.yml 供正式 Bundle 使用;cordis.dev.patch.yml 用于 overlay 模式直接加载本地 TypeScript 源码。

课程内容

当前内容覆盖六个小课:

Lesson 文件 核心概念
1 src/plugin.ts apply(ctx)ctx.effect()、disposer、插件生命周期
2 src/workspace-info.ts inject = ['tools']defineTool()、参数与 canonical output
3 src/configurable-greet.ts Config interface、Schemastery、默认值、运行时配置校验
4 src/workspace-name-service.ts + src/workspace-name-tool.ts Service Provider、Context declaration merging、Consumer / inject
5 src/workspace-event-* typed Events、ctx.emit()ctx.on()、松耦合广播
6 src/workspace-transform-* ctx.waterfall()next()、around middleware、短路

几点说明:

  • Lesson 1 的插件运行时每 5 秒输出一次 [practice-lifecycle] heartbeat,卸载时输出 disposed,用来观察 ctx.effect() 注册的副作用和 disposer 的清理时机。
  • Lesson 3 的 configured_greet 工具使用 Bundle patch 中的 greeting: Hi,对应 Config 默认值与运行时配置校验。
  • Lesson 4 通过 Context declaration merging 自定义 ctx.workspaceName Service,Provider 与 Consumer 分属两个文件。
  • Lesson 6 同时演示 around middleware 的包装与 block middleware 的短路:输入 hello 经 uppercase 后返回 HELLO;输入 blocked words 会在 block middleware 中短路默认处理,最终得到 ** BLOCKED **

环境要求

1、Node.js ^22.19.0 || >=24.0.0
2、pnpm(仓库声明 pnpm@11.7.0);
3、本机已安装可直接执行的 dsh CLI。

先运行下面命令确认 CLI 可用,再进行后面的步骤:

dsh --help

本地开发与一键部署

克隆仓库并安装依赖:

git clone https://github.com/Ri0n72Y/dsh-plugin-practice.git
cd dsh-plugin-practice
pnpm install

日常开发完成后执行:

pnpm deploy

deploypackage.json 中定义为:

{
  "scripts": {
    "deploy": "pnpm run prepare && dsh plugin --profile practice add ."
  }
}

也就是先用 tsdown 从 src/ 构建出 lib/,再把当前 checkout 安装或更新进 practice profile。然后启动 DSH:

dsh --profile practice

如果想先检查最终组合配置:

dsh --profile practice --dump-config

默认开发 profile 固定为 practice,需要换名字时直接调整 package.json 中的 deploy script。

用官方命令安装

pnpm deploy 只是把构建和官方安装命令串起来,插件安装和 profile 管理仍然由 DSH 完成。也可以跳过本地步骤,直接安装 Git 仓库:

dsh plugin --profile practice add github:Ri0n72Y/dsh-plugin-practice

本仓库是 TypeScript 包,package.json 提供了 prepare,Git 安装后会自动从 src/ 构建 lib/。注意 pnpm 10+ 第一次安装 Git 依赖时,可能需要在 profile 的 pnpm-workspace.yaml 中通过 allowBuilds 授权构建脚本。

能被这样安装,是因为 package.json 按官方约定声明了 Bundle manifest:

{
  "dsh": {
    "bundle": {
      "patch": "./cordis.patch.yml"
    }
  }
}

安装链路是:dsh plugin add 读取 dsh.bundle 指向的 cordis.patch.yml,patch 再通过包导出路径加载构建后的 lib/*.js

源码开发 / overlay 模式

改源码时如果不想每次都构建,可以走 overlay 模式直接加载 .ts 文件。先把 cordis.dev.patch.yml 中的 /ABSOLUTE/PATH/TO/dsh-plugin-practice 替换为仓库真实绝对路径,然后运行:

dsh web --patch /ABSOLUTE/PATH/TO/dsh-plugin-practice/cordis.dev.patch.yml

如果是从 DeepSeek Harness 源码仓库运行 CLI,则使用:

pnpm dsh web --patch /ABSOLUTE/PATH/TO/dsh-plugin-practice/cordis.dev.patch.yml

安装后测试

经过上面的步骤部署并启动后,在 Agent 中逐条测试:

Use the workspace_info tool and tell me the current workspace.
Use configured_greet to greet Ada.
Use workspace_name and return only the workspace name.
Use announce_workspace to announce the current workspace.
Use waterfall_demo with input "hello".
Use waterfall_demo with input "blocked words".

预期行为:

  • workspace_info 返回当前 DSH Node 进程的 cwd 和目录名。
  • configured_greet 使用 patch 中的 greeting: Hi,例如返回 Hi, Ada!
  • workspace_name 通过自定义的 ctx.workspaceName Service 获取目录名。
  • announce_workspace 发出 practice/workspace-announced 事件,监听插件在终端输出 [workspace-event] announced: <name>
  • waterfall_demo("hello") 返回 HELLOwaterfall_demo("blocked words") 返回 ** BLOCKED **
  • 后台每 5 秒输出一次 [practice-lifecycle] heartbeat,卸载时输出 disposed

六个小课对应的运行时行为都能直接观察到。

卸载与常用命令

卸载插件:

dsh plugin --profile practice remove dsh-plugin-practice

常用开发命令:

pnpm run typecheck
pnpm run build
pnpm run check
pnpm deploy

dsh --profile practice --dump-config
dsh --profile practice

适用场景与注意

适合想上手 DSH / Cordis 插件开发的开发者,尤其是希望按 lifecycle → Tool → Config → Service → Event → middleware 的顺序把概念过一遍的人。仓库体量小,主要依赖为 @deepseek-ai/cordis ^4.0.1@deepseek-ai/dsh-tools ^0.1.0-rc.5@deepseek-ai/schemastery ^3.18.1,适合直接读源码。

使用前注意:

1、插件以当前 dsh 进程的权限运行。安装任何第三方插件前都应先检查源码;本仓库的许可证在抓取的资料中没有明确声明(package.json 的 files 中列有 LICENSE 文件),以仓库实际内容为准。

2、DSH 仍处于快速迭代阶段,如果 API 发生 breaking change,应优先对照官方开发文档和当前 TypeScript 接口调整,不要假设仓库代码始终可用。

3、本文命令统一使用 practice profile;与现有 profile 冲突或需要隔离时,对应调整 deploy script 及安装命令中的 --profile 参数。

结尾

dsh-plugin-practice 的价值在于「可运行」:每个概念对应一段源码、一条测试语句和一份预期输出,学习路径闭环。如果你在找 DSH 插件开发的第一个练手项目,可以从它开始。

  • 社区目录页(独立站点,与 DeepSeek / 幻方无官方从属关系):https://www.skillhub.cn/plugins/Ri0n72Y/dsh-plugin-practice
  • GitHub 仓库:https://github.com/Ri0n72Y/dsh-plugin-practice
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye