DSH Studio:skill 提炼流水线与按需 MCP 加载,一个插件两件事

前言

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 。

羽毛球分组比赛记分
小程序二维码

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

小夜