前言¶
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 。