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 。

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

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

小夜