前言¶
DSH 的理念是「一切皆插件」,代价是 skill 要靠自己去养:对话里反复出现的做法要写成 skill,否则每次重新从头想;写得多了又会堆出一堆语义重复的 SKILL.md。已有的 skill 管理做法多是「浏览、编辑、手工触发提取」,人不在电脑前就没人做判断。DSH Studio(samir2015dzh/dsh-studio)就是在这个位置上做无人值守的一环:它判断这一轮对话里有没有值得沉淀的东西,值得就写进 skill 库,并且和已有 skill 做语义归并;另一件同样占系统提示词的事是 MCP 工具 schema,它把「每轮都带全量 schema」改成「会话开头只给工具名,真正要用再取」。
下面介绍这个插件的定位、安装方式和主要用法。
这是什么¶
dsh-studio,维护者 samir2015dzh,分类为工作流。它是 zhengjy01/dsh-skill-studio 的 fork,不是 DeepSeek AI 官方产品。上游提供的是 skill 浏览、编辑与手工提取;这个 fork 补上了无人值守需要的四件事——逐轮判断、自动接收、语义合并、模型走 DSH 自带配置,另外还加了按需 MCP 加载、三层过滤、回收站和按用途分组。
目录页显示星标为 0(截至抓取时)。README 徽章标版本 0.7.0,仓库 package.json 标 0.8.0,以仓库文件为准,两者不一致这一点写在这里供读者自行判断。许可证 MIT。
逐轮判断与自动入库¶
它的工作方式是:留着它跑,它来决定这一轮教会了什么、该归到哪个已有 skill、合并会不会造出重复。
1、轮次结束后三秒,插件发一个 YES/NO 小问题,内容取最近一次会话的 10 条摘要。只有 YES 才触发完整提取。判断节流 90 秒,提取节流 5 分钟。
2、被接受的候选直接写入 ~/.agents/skills,下一轮即可加载。只有写入失败(名字冲突之类)才会把候选放进待审队列。
3、合并优先于堆文件:每个候选会与整个库对比,只有真正新的主题才会新建 skill。作者的实际观测是,同样的工作流换个说法,token 相似度只有 0.07–0.24,所以本地相似度只做预筛,最终归并与否由模型看完整目录来定。
4、模型不给插件自己配:面板里下拉列出 DSH 中已配置的 provider/model,留空则跟随触发本轮会话的那个配置。插件不存 API key,也不要求网关地址。
合并的四道闸¶
候选落盘前要过四道判断,任何一道说「不」,就转成新建 skill 或按规则丢弃。
new candidate
├─ ① Tombstone:这个名字此前被合并掉过(扫 ~/.dsh/skill-archive*/)
│ → 强制合并进同类别中内容最多的那个 skill
│ 合并失败就直接丢弃,避免再次写出重复
├─ ② 类别标签:目录读成 "- [decompile] name: description"
│ → 模型在正文之前先看到类别
├─ ③ 本地复检:FOLD_INTO 的判定再验一次
│ → 同类别直接接受;跨类别要求相似度 ≥ 0.5,否则 SAVE
└─ ④ 合并本身:模型把新经验折进已有小节
→ 重复小节截断,协议残留(如 MERGE:)剥掉,
结果短于原文 60% 的合并被拒绝
类别从 skill 名字推导(gui-* → gui,decompiled-* / java-decompile-* → decompile,portable-* / offline-* → portable 等)。别名表 CATEGORY_ALIASES 在 lib/extractor.js 里,加一行就能扩展。
写入侧还有两道清洁:重复段落截断、协议残留剥掉、合并后掉内容过多的被拒。另外,写入 SKILL.md 会把该 skill 排入下一轮的 darwin-skill 复查;重复族通过 ~/.dsh/darwin-auto/families.json 折叠到同一个宿主,表由插件自带的 LLM 通路重新生成(0.5.0 合并进来的,之前是独立的 dsh-darwin-auto 插件)。
按需 MCP 加载¶
这一部分从文档 MCP.md 来,0.6.0 起内置。思路是:会话开头只列工具名,连描述都不给,完整 schema 等真正要用再取。0.8.0 起目录段连工具描述都砍掉了——作者的实测数据是,craft-anything 这个大服务器列出全部描述要 75,918 字符(约 19K token),只给名字则是 4,878 字符(约 1.35K),名字足够判断该不该 load。
三档(mcp.json 里 tier 字段):
| 档位 | 工具注册 | 进目录 | 用途 |
|---|---|---|---|
eager |
注册成 mcp__<server>__<tool> |
是(名字) | 高频或 schema 小的、需要模型无条件看见的 |
on-demand(默认) |
不注册 | 是(只给名字) | 工具多、schema 大的,按需 mcp_call / mcp_load |
disabled |
不注册 | 否 | 临时关掉 |
省的是每轮系统提示里的工具 schema。文档给的实测:一个 95 工具的 MCP 走 eager 大约 33K token/轮,走 on-demand 只剩十几行目录。
五个工具:
mcp_list:档位、连接状态、工具数与截断描述。mcp_register {name, tier, transport, command|url, args, env, headers, notes}:新增或修改。会先试连并拉一次工具列表,通过才写注册表。mcp_load {name, filter?, limit?, peek?, refresh?}:返回完整inputSchema。peek只读缓存不连接;filter按名字或描述子串过滤;默认用内存缓存,换filter/limit不会重连,只有refresh: true才重连重拉。mcp_call {name, tool, args},或mcp_call {name, calls: [{tool, args}, …]}:单个直接返回原结果;批量按顺序执行,某一步失败不中断后面的。直接调用即可,不需要先mcp_load,它会自己连接。mcp_takeover {name}:接管 profile 里已有的原生 MCP,需要重启 DSH 才生效。
空闲回收:idleTimeoutMinutes(默认 5,0 关闭)内没有任何工具调用就断开上游——stdio 子进程退出、HTTP 会话关闭。工具缓存与注册表保留,下次调用透明重连,冷启动只发生在真正用到的时候。活跃时间取「最近一次工具调用」,不是 UI 轮询;单条服务器可用 idleTimeout 覆盖(单位分钟,支持小数)。
存储在 ~/.dsh/dsh-studio/mcp.json:
{
"version": 1,
"idleTimeoutMinutes": 5,
"toolDescriptionMaxLength": 150,
"servers": [
{ "name": "context7", "tier": "on-demand", "transport": "stdio",
"command": "npx", "args": ["-y", "@upstash/context7-mcp"] }
]
}
设置页入口是「设置 → MCP 服务器」,独立一页,不挂在 Skill 工作台里。文档列了已知限制:只桥接 tools,不桥接 resources / prompts / sampling;单例连接不是按会话隔离;没有 OAuth 2.0,streamable-http 只支持静态 headers;重连是「用到时重连」,没有指数退避,连不上直接把错误抛给调用方。
面板、过滤与回收站¶
Skill Studio 面板会列出最近改动过的 skill,带名字、描述、时间戳。列表按三层过滤:来源(all / user / built-in)、启用状态(enabled / disabled)、用途(reverse engineering / security / code / docs / ops / data / workflow / other)。三层之间是 AND,点状态或用途行里已激活的胶囊即可取消该条件。
生成侧也带用途分组:提取时让模型在八个固定类别里选一个,写进 metadata.group;合并时保留原类。已有 skill 可以批量打类:
node scripts/classify-skills.mjs --write
每个文件会先备份成 .bak-group。删除是行级的,目录被搬进 ~/.dsh/dsh-studio/trash/<stamp>-<name>/,可在专门的面板页恢复或彻底清理,支持批量与单条。
除此之外还扫描多个来源的 skill 根目录:DSH 与共享 Agent 目录之外,还扫 Codex / Claude / Cursor / Gemini / Windsurf / Trae / Qoder / Lingma / OpenCode / Copilot / Roo / CodeBuddy / WorkBuddy / OpenClaw / CC-Switch,只扫实际存在的。诊断功能会对 frontmatter name 不是 kebab-case 的 skill 标「host will not load this name」(面板看得见,DSH 不加载它),跨来源重复标「shadowed by X」。
安装与启用¶
按 README,插件通过 link: 装进 DSH profile,改代码不用重新发布。第一步是把仓库取到本地并选择路径(README 原文写的是 git clone <this-repo> D:/dsh-plugins/dsh-studio,<this-repo> 即仓库地址)。
第二步,在 profile 的 package.json 里注册:
{
"dependencies": { "dsh-studio": "link:D:/dsh-plugins/dsh-studio" },
"dsh": { "profile": { "bundles": ["dsh-studio"] } }
}
第三步,在 node_modules 里建 Junction:
New-Item -ItemType Junction `
-Path "$env:DSH_PROFILE_DIR\node_modules\dsh-studio" `
-Target "D:\dsh-plugins\dsh-studio"
第四步,重启 DSH,打开「设置 → Skill Studio」(MCP 部分在「设置 → MCP 服务器」)。
仓库的 package.json 里给出的 engines 是 dsh >= 0.1.5-rc.1。
配置¶
配置文件 ~/.dsh/dsh-studio/extractor.json,权限 0600。
{
"enabled": true,
"autoPerTurn": true,
"intervalMinutes": 60,
"windowDays": 7,
"maxCandidatesPerRun": 3,
"autoAccept": true,
"mergeThreshold": 0.2,
"skillLanguage": "auto",
"agentSkillDir": "C:\\Users\\<you>\\.agents\\skills",
"provider": "",
"model": ""
}
常用键的用途:autoPerTurn 在每轮结束时跑 YES/NO 判断;intervalMinutes 是兜底扫描间隔,0 关闭、只靠逐轮;autoAccept 直接入库而不走待审队列;mergeThreshold 是本地相似度预筛阈值(是否合并仍由模型定);skillLanguage 取 auto / zh / en,代码、命令、路径不翻译;provider / model 留空即跟随会话,也可以在面板里选。旧的 llmBaseUrl / llmApiKey / llmModel 字段仍可用,作为没有 ctx.llm 的宿主的 HTTP 兜底,正常使用时留空。
工具一览¶
插件暴露的工具集中在 skillmgr_ 与 mcp_ 两组,HTTP 路由挂在 /api/dsh-studio/*(面板走的就是这些)。
| 工具 | 用途 |
|---|---|
skillmgr_list |
列出所有 skill,带来源、状态、分组 |
skillmgr_get |
读一个 skill 全文 |
skillmgr_save |
回写整份 SKILL.md |
skillmgr_policy |
切换模型 / 用户调用 |
skillmgr_extract_run |
立即跑一次提取 |
skillmgr_extract_status |
开关、间隔、队列深度、上次运行 |
skillmgr_extract_config |
改配置 |
skillmgr_extract_list / _accept / _reject |
处理待审队列(开了 autoAccept 通常为空) |
skillmgr_trash |
移入回收站,可恢复 |
skillmgr_trash_list |
列出回收站批次与条目 |
skillmgr_restore |
把条目搬回原路径 |
skillmgr_purge |
永久删除回收站条目 |
skillmgr_snapshot |
把 ~/.dsh 配置备份成快照 |
skillmgr_snapshot_list |
列出快照(时间、标签、文件数、大小) |
skillmgr_snapshot_restore |
恢复快照;dryRun 预览,pathMap 改根路径 |
skillmgr_snapshot_transfer |
导出 .tar.gz 或导入外部归档 |
skillmgr_sync |
跨机同步:读配置 / 推送最新 / 从远端拉取 |
适用场景与注意¶
适合这么用:已经在用 DSH 跑较长的任务、手上有一批 skill、而希望「对话里的经验」能自动沉淀而不是靠人记着去整理的人。也适合 MCP 服务器很多、每轮系统提示被工具 schema 撑大的用户。
需要留意的几点:
- 它是第三方 fork,不是 DeepSeek / 幻方的官方产品;目录站也是独立社区站点,不代表官方应用商店。
- 插件以当前运行的 DSH 进程权限工作,能用文件、能连外部 MCP 命令。安装前应通读源码(
lib/、cordis.patch.yml、MCP.md 里列的已知限制)并确认 MIT 许可证可接受,再决定要不要长期开着autoPerTurn+autoAccept。 - 提取和 MCP 管理都要调模型,模型选择留空时跟随会话,白跑的判断也会消耗配额;队列本身有节流(判断 90 秒、提取 5 分钟)。
- 想按会话隔离 MCP 连接、或需要 OAuth 2.0 的服务器,README 明确说这个插件的实现是单例、不支持 OAuth,需要另找方案。
结尾¶
DSH Studio 的价值在两句话里:把 skill 的提炼、归并、清理变成常驻的自动流水线,把 MCP 工具 schema 从每轮固定成本变成按需拉取。代码改动可直接生效(link: 安装),配置项集中在两个 JSON 里,行为不改动时 MCP 默认按 on-demand 走。仓库地址 https://github.com/samir2015dzh/dsh-studio ,社区目录页 https://www.skillhub.cn/plugins/samir2015dzh/dsh-studio 。