vlln/dsh-skills/make-dsh-plugin

Claude Code and agent skill by vlln/dsh-skills

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

当用户要为 DeepSeek Harness(dsh)开发插件、或搭一个垂直 Agent 产品时使用本 skill。先给 dsh 的概念地图(一切皆插件;profile / bundle / plugin / agent preset / skill 五种装配单位;宿主树与 per-Agent 树),再引导三种活:加一个 工具或界面、发一个新的 Agent 模式(preset)、用「工具 → preset → UI + 新 profile」从零搭垂直 Agent。覆盖形态选择(bundle 组合层 / 纯 cordis / 纯 skill 包 / MCP)、npm 包与 Cordis entry、client half 与设置页、安装与验证 纪律、UI 风格、多语言、README 与发布规范、门禁与决策记录。

Install

npx vskill@latest install vlln/dsh-skills/make-dsh-plugin

SKILL.md

创建 dsh 插件

dsh(DeepSeek Harness)是 agent harness——一个 Cordis 运行时加一套内置能力 (工具、会话、设置、Web GUI)。插件就是给它加能力的 npm 包:注册工具 / 服务 / 事件 / 命令 / prompt,或者往 Web GUI 里加界面。插件经 web profile 安装, 用户用 dsh plugin --profile web add <包> 装卸、在官方 Plugins 页查看与配置。

代码插件的分发形态有两种,选型只看是否需要"组合层"(判据见 Step 0): bundle——声明 dsh.bundle.patch,自带一层组合 patch(多行 insert/config/disabled 随包分发);纯 cordis——单个 Cordis 插件包,装完在 profile 的 cordis.patch.yml 里写一行 insert。两者都能带 client half(dsh.client)往 Web GUI 加界面。 纯 skill 包(无代码)走文件系统发现根,不属于这两类。注意:bundle 是分发单位, plugin 是功能单位——同一个包可以只当其一,也可以两者兼任(见 01-concepts.md L1)。

本 skill 的路线:Step 0 选形态 → Step 1 仓库布局 → Step 2 manifest → Step 2b 图标 → Step 3 Node half → Step 4 client half(可选)→ Step 5 安装与验证 → Step 5b 交付检查与发布 (发布可选)→ Step 6 README 与开发规范。要从零搭一个垂直 Agent,先读 [03-vertical-agent-recipe.md](references/03-vertical-agent-recipe.md) 的三步法。

权威契约内嵌在本 skill 的 `references/`,按主题编号取用(01 概念 · 02 装配 · 03 配方 · 04 契约 · 05 bundle · 06 UI · 07 设置 · 08 i18n · 09 纪律 · 10 验证 · 11 发布 · 12 生态 · 13 证据池 · 14 Desktop)——不必线性读,按第 2 节的边界地图取一篇即可; 开发不需要任何仓库文档(06-ui-style.md 是查阅型手册,按章查)。

0. 30 秒版(够开工)

一切皆插件:插件声明自己提供的服务与 inject 依赖,Cordis 牵线并管理生命周期。 在此之上只有五种装配单位:

你会听到单位落点一句话
运行方式(web / headless)profile$DSH_HOME/profiles/<name>/装哪些 bundle + 用户 patch;也是安装与解析边界
插件包 / 一组插件bundledsh.bundle.patch(可为数组)可复用的 patch 层,可只分发别人的行
插件 / 组件pluginnpm 包 + Cordis entry功能零件:工具 / 服务 / 命令 / 事件 / UI
模式(标准 / 极简 / 创造)agent presetpreset-<id> 行每个 Agent 的工具 + 人设 + 技能组合
技能skill 包.dsh/skills 等发现根无代码,不进 profile 装配

两棵树——本 skill 里所有"该放哪"的判断都来自这里:

  • 宿主树:一个进程一棵,由 profile 层栈决定。模型路由、Agent 循环、会话、设置、

沙箱/审批、工具注册表本体都在这里,所有 preset 共享。

  • Agent 树:每个会话按选中的 preset 分出一棵隔离子树,装 persona、instructions、

工具行、技能——只有该 Agent 看得见。

一句话记住:profile 决定装了什么,preset 决定 Agent 看得见什么。 preset 不拥有模型与 Agent 循环(那是宿主);权限预设是第三件事。展开见 01-concepts.md。

1. 先选一条路线(不必线性读)

每一步只需要读一个文件;读完就能动手,细节留到碰到时再展开。

路线顺序
A 加一个工具 / 命令 / 面板04 →(有 UI)06 → 10
B 发一个新的模式(preset)02 §2 → 03 第 2 步 → 新开会话验证
C 从零搭一个垂直 Agent03 全文 → 04 / 05 写包 → 06 做 UI → 10 装
D 发布与被发现11 交付/发布 → 12 市场与社区
E 装不上 / 行为怪10 排查 → 13 对症状
F 理解 dsh 机制01 概念 → 02 装配
G 在 Desktop 上装 / 调14(应用内插件页、版本跟应用走、DevTools)

2. 边界地图(一个问题 = 一个文件)

每个 reference 开头都有同样的「本文件回答 / 不回答」框;这里是一张总表。

#文件回答什么不回答 → 去
01concepts为什么分层、五种单位、两棵树、生命周期、术语命令与字段 → 02;搭产品 → 03
02profile-and-presetprofile 目录/层栈/解析;preset 声明/选择/分发/覆盖从零搭产品 → 03;entry 字段 → 04
03recipe三步法、每步检查点、常见返工字段细节 → 02 / 04;UI 规格 → 06
04plugin-contractdsh 字段、entry、client、skill、MCP 契约打包 → 05;安装验证 → 10
05bundle-pluginsbundle 形态、patch 数组、依赖解析、Git 安装preset → 02;市场 → 12
06ui-style *token / 控件 / 落位 / 视觉自检设置面 → 07;文案 → 08
07settings-panelConfig + 配置卡片契约与验证UI 视觉 → 06;字典 → 08
08i18n客户端字典 / 包元数据 / 宿主文案设置面 → 07
09dev-conventions11 条纪律 + 门禁 / 决策 / 兼容性证据 → 13;操作 → 10
10install-and-verify安装、验证、负控、图标验收、排查发布 → 11;纪律 → 09
11publish交付清单、description / topics市场社区 → 12;验证 → 10
12ecosystem市场索引机制、社区入口、生态目录与工具、参考实现发布纪律 → 11
13gotchas实测坑与症状纪律 → 09;验证 → 10
14desktopDesktop 的安装归属 / 版本 / 调试 / 恢复通用安装验证 → 10;UI → 06
15product-boundaries产品边界:数据放哪、向 agent 暴露什么、工具面还是 skill+命令、面板与会话的关系字段与契约 → 04;验证 → 10

3. Step → 文件

Step本步只读产出
0 选形态01 / 02(做内容型插件再加 15)形态 + 安装通道(三判据)
1 仓库布局04目录骨架
2 manifest04(+05 打包时)package.json + patch
2b 图标10(图标节)icon.svg + 真实加载验证
3 Node half04entry + 工具/服务
4 client half06(+04/07/08)client bundle + UI
5 安装验证10(+02 通道)装上 + 真调一次
5b 交付发布11(+12 推广)清单过 + 发布
6 README / 规范09(+11)README + 门禁

4. 纪律(11 条,动手前扫一眼)

逐条有反例与细节指针(09-dev-conventions.md);违反其中任何一条 都会在真实装载时暴露,且大多不会在 mock 单测里暴露。

#纪律为什么
1官方包 dependencies / peerDependencies / devDependencies 三处留空官方包自带整条 peer 闭包,声明必 ERESOLVE(13-gotchas.md 1)
2插件必须装进 profile 树内树外解析不到官方包 ⇒ 整棵 profile 起不来(13-gotchas.md 6)
3启停覆盖写 profile 层,不写进 bundle 包内产品层不该承载用户偏好(13-gotchas.md 1b)
4覆盖某行必须重述整块 configpatch 是整行替换,不是深合并
5config.id 是身份,发布后不改;行 id 用 preset-<id>老会话按 id 恢复,改了就拒绝恢复
6改动按改动面取最窄证据,并先做负控"干净日志"只有在故意弄坏会响亮报错时才算证据(10-install-and-verify.md)
7boot 干净 ≠ 功能可用:真调一次工具/命令服务惰性读取,服务名写错在 boot 期看不见
8资产从安装包解析,不读 profile / preset 目录preset 没有自己的目录(02-profile-and-preset.md §2.6)
9机制带版本号;渠道 / 社区 / 生态现状只进 12(时效数据),并写"是什么/怎么用"而不是"最新/N 个"无日期的时效断言会烂掉;实测记录不会
10README 只写使用者内容;工程备忘录进 AGENTS.local.md / docs/读者不对,关键信息会被淹掉(Step 6)
11开发实例 = 独立进程 + 持久的私有 `DSH_HOME`(~/.dsh-<插件>,建一次、复用、不删)+ 固定端口(只挑一次、存进 home、永远复用,避开 3080);永不指向 `~/.dsh`;URL + 测试点交给用户手动测试每次新建 home 会丢会话;每次换端口会让旧 URL 全部失效(用户以为进程死了);复用真实 home 会与主 GUI 抢写会话日志(10-install-and-verify.md「本地开发实例」)

何时使用

  • 用户想为 dsh 开发新插件(工具、skill 包、MCP server、事件监听、服务、

命令、prompt、浏览器 UI)。

  • 用户要 bundle 插件 / 纯 cordis 插件的脚手架 / 示例 / 模板。
  • 用户要新增一个 Agent 模式(preset),或把一套工具 + 提示词做成**垂直

Agent 产品**(读 03-vertical-agent-recipe.md)。

  • 用户要安装 / 分发 / 升级插件,或理解 profile 层栈与重启边界(读

02-profile-and-preset.md)。

  • 插件挂载失败且原因是 entry 契约或安装通道。

Step 0:选择插件形态

按插件分发什么选官方路径。dsh 字段 strict——能力面声明:

需求官方路径安装通道起点
纯 skill 包(无代码)skill 走文件系统发现根(dsh.skills 字段在当前基线无消费方,见 04-plugin-contract.md)复制/链接进发现根(<项目>/.dsh/skills、.agents/skills、$DSH_HOME/skills、~/.agents/skills)Step 2(skills)
MCP server不是包 manifest 字段:CLI 随附 @deepseek-ai/dsh-mcp-client 供 patch 层使用,默认禁用(每条服务器命令是 agent 沙箱之外的受信任可执行代码)patch 层 configapps/cli/reference/README.md
Node 工具 / 事件 / 服务npm 包 + Cordis entry(main)profile insert 行Step 3
Node + 浏览器 UInpm 包 + Cordis entry + dsh.clientbundleStep 3 + 4
带组合层(多行 insert/config/disabled 随包分发)npm 包 + dsh.bundlebundle 层栈读 references/05-bundle-plugins.md
新的 Agent 模式(preset:工具/人设/技能组合)npm 包 + dsh.bundle,patch 里 insert preset-<id> 行bundle(patch 可为数组)读 references/02-profile-and-preset.md §2

按三个判据选形态,按顺序问:

判据 A —— 有代码吗? 纯 skill(无代码)走文件系统发现根;MCP server 是 patch 层配置,不是包 manifest 字段; 其余都是 npm 包 + Cordis entry。

判据 B —— 需要组合层吗? 看包是否声明 dsh.bundle.patch。 声明 = 一层组合 patch(多行 insert/config/disabled,patch 可为数组)→ dsh plugin --profile web add 进层栈;无声明 = 单个 Cordis 插件 → profile cordis.patch.yml 写一行 insert。

先问一句:是原型还是产品? 只给本机用、还在试形态 → 直接用产品内的创造模式(cordis preset)做 bundle 并 install_bundle(见 05-bundle-plugins.md「创造模式」);要分发、要维护、要给别人装 → 按下面判据走仓库路径。

判据 C —— 给谁用? 只给宿主加服务 / 界面 → Host 行即可;要影响 Agent 看见什么 (工具、人设、技能)→ 落在 preset 行(web 的内置工具行就是按模式拆开的)。 装完不等于新模式出现:新增模式 = 新增一条 `preset-<id>` 声明行。

三者都按目标运行时的配置协调 / HMR 能力实测生效情况,不预设必须重启。 带 UI 的独立插件两类皆可(自渲染 client 在 bundle 里照常工作)——选型看是否需要组合层,而非 UI 形态。

Step 1:仓库布局

my-plugin/ 根即 npm 包(bundle 形态包根 = 仓库根):

my-plugin/
├── package.json # name/version + main/exports + icon + dsh.bundle/dsh.client
├── icon.svg # 必需:Plugins 页的插件标识(非功能截图)
├── cordis.patch.yml # dsh.bundle 声明的组合层(insert 挂载自身)
├── index.mjs # Node half 入口:完整 Cordis 插件(main/exports["."])
├── client/ lib/client.js # client bundle 源码 / 构建产物(dsh.client 通道)
└── scripts/ # 门禁 + 生成器(可选)

Step 2:package.json + 能力面

按 references/05-bundle-plugins.md 与 references/04-plugin-contract.md 的模板。 关键决策:

  • dsh.bundle.patch → cordis.patch.yml(组合层,含 - insert: - id: <自身> name: <包名>)
  • dsh.client 声明(platform web)+ exports["./client"](有 client half 时)
  • main/exports["."] 指向 Cordis entry(name/inject/Config/apply)
  • dependencies/peerDependencies/devDependencies 三处都留空——官方包由挂载环境注入(理由与本地 link 配方见 13-gotchas.md 1);唯一例外是 schema 要用 dsh 的 fork

@deepseek-ai/schemastery(公共 schemastery 没有 .volatile()),装成普通 dependencies

  • inject 声明 ctx.get 用到的全部服务(webServer/jobs 等)。严格注入两个方向都会出事:
  • 声明了但宿主没有(名字写错、或该服务已被新 rc 移除)→ 条目永久 pending,

boot 日志只有一行 warning: 1 entry did not activate,该插件的功能与 UI 一起消失;

  • 用到了却没声明 → apply 开头即抛 cannot get property without inject。

两种都照不出来于 mock ctx 单测——必须真启动一次 profile 才算验证过(Step 5)

  • 服务名与槽名以当前基线为准逐条核实:官方会跨 rc 改名(13-gotchas.md 7、8)
  • 包显示元数据(Plugins 页里的标题与一句话描述):locale/en.json + locale/zh.json 的

meta.title / meta.description,并把 "./locale/*.json" 同时加进 exports 与 files ——少了 files 发布出去就丢(写法与回退链见 08-i18n.md §2)

Skill 包(dsh.skills)与 MCP server(dsh.mcpServers)

声明写法(dsh.skills 相对路径列表 / dsh.mcpServers 的 server-id → 启动 配置映射)与 SKILL.md 写法规范(frontmatter / 正文模式 / <500 行,遵循 make-skill)见 references/04-plugin-contract.md 对应小节——不要发明竞争格式。

Step 2b:绘制插件图标(必做)

每个 npm 插件都要绘制并验证 Plugins 页图标,包括没有 client half 的插件; 仅走文件系统发现的纯 skill 包不适用。这是交付要求,不是运行时必填字段。

  • 先看几个已发布插件的图标(官方 Plugins 页里的、或你自己别的插件),按其简洁风格绘制

能表达本插件功能的 SVG。观测样式是 36×36 透明画布、主体约在 8..28、少量蓝/青渐变, 不是硬 API;不要照搬别的插件身份。用户指定的标记优先,例如 autofork 的 ⑂ 仅是该插件 的标记,需画成路径/几何形状,不把它变成所有插件的模板。

  • 使用显式填色/描边;SVG 作为 <img> 不继承宿主 `currentColor`。

不用字体字形、外链资源或脚本;不要把 README 功能截图当作插件图标。

  • 在 `package.json` 顶层写 "icon": "./icon.svg",不是 `dsh.icon`;图标限 SVG / PNG / JPEG / WebP、≤ 256 KiB,路径相对 manifest 且 realpath 后必须仍在包内;

files 打包白名单包含图标,并保留 exports["./package.json"] = "./package.json"。

验证打包结果、真实 Plugins 图片加载,并实际查看渲染图像;只证明文件存在不算完成。

Step 3:Node half——Cordis entry

index.mjs 导出完整 Cordis 插件(name/inject/apply)。用 defineTool 注册工具;服务/事件/命令/prompt 是完整 Cordis,无需声明。依赖解析是官方 运行时的职责(@deepseek-ai/*、cordis——profile pnpm 闭包注入,勿声明)。 在 ctx.effect()/ctx.on() 内注册,disable 时清理。

检查点:entry 可解析;工具已注册;inject 声明完整;在真实 profile 里启动过一次 (boot 不报 plugin tree failed to load)——缺 inject、服务名写错这类问题只有真启动才暴露。

Step 4:Client half(可选)——自渲染

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
5

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/vlln/dsh-skills/make-dsh-plugin/badge)](https://verified-skill.com/skills/vlln/dsh-skills/make-dsh-plugin)

Something wrong with this skill or its page? Tell us.