前言¶
DSH 的安裝入口是 dsh plugin 命令行。社區插件分散在各處,找一個能用的插件通常要先瀏覽目錄、複製命令、再回到終端執行;命令拷錯或裝到錯誤的 profile 裏,排查成本比插件本身還高。下面介紹的 qianyumeng0228/dsh-plug-store 是一個宿主插件,它把 DSH 插件目錄渲染成宿主設置頁裏的一個分區,並在界面上直接調用 dsh plugin 完成安裝、更新、卸載和備份,省去複製命令這一步。插件由 qianyumeng0228 維護,分類在客戶端一側,發佈在 npm 與 GitHub 上。
這是什麼¶
一句話定位:在 DeepSeek Harness 內部提供插件商店能力的宿主插件。它不是獨立站點,而是掛在宿主 settings.section 槽位上的一段界面。
它解決三個具體問題:
- 目錄瀏覽與命令行安裝之間隔着一次人工複製,插件在頁面裏直接執行。
- 更新是否真的生效,語義上一是指命令返回碼,二是指版本有沒有真的變化,兩者不等價,插件按後者判定。
- 安裝任務的進度和歷史缺乏持久化,重啓後無從復盤。
目錄由 qianyumeng0228/dsh-store 每日構建併發布到 GitHub Pages,當前收錄 29,593 個社區插件,其中 14,344 個爲開箱即裝。
需要明確的是,dsh-store 是社區倉庫,與 DeepSeek / 幻方沒有官方從屬關係。DSH 的理念是「一切皆插件」,本倉庫屬於社區對該理念的實現。
核心功能¶
真實執行安裝命令,而不是給一段命令讓你自己跑。 所有操作都是對 dsh plugin 的 shell 調用,針對正確的 profile,並把實際發生的事情回讀出來。pnpm 在重新添加一個已固定版本的依賴時會以退出碼 0 回答 “Already up to date”,因此更新流程顯式帶上目標版本再回讀當前安裝版本:界面只有在版本真的移動時才顯示「已更新」,沒有變化時顯示「無變化」。
實時進度和持久化任務日誌。 操作作爲排隊任務執行,進度來自 pnpm 的 ndjson reporter(解析 / 下載 / 鏈接 / 構建、當前包、字節數)。失敗時把 13 種 ERR_PNPM_* 錯誤碼映射爲自然語言提示。日誌寫入 ~/.dsh/store-data/tasks.json,重啓後仍在;被打斷的任務顯示爲 interrupted,不會靜默消失,已完成和失敗的行可以一鍵清除。
「可更新」是按本機計算出來的。 判定依據是本機已裝版本與目錄目標版本之間的比較,而不是數據裏的一個標記字段。本地鏈接和非 registry 依賴(file:、link:、workspace:、git+…)會被排除,不會被提議一個會覆蓋它們的更新。
中文優先的目錄。 描述優先使用中文;僅英文的條目在構建時機器翻譯(已發佈目錄中覆蓋 99%),仍缺失的在頁面內按需補譯。中 / EN 切換隻在確實存在兩種語言時出現。
主題預覽牆。 主題卡片展示從各倉庫 README 提取的真實截圖(相對路徑按 raw.githubusercontent.com 解析,blob 鏈接重寫),只保留橫向截圖,點擊進入 lightbox 可前後翻看。
瀏覽規模上的設計。 真實分頁(每頁 24 / 48 / 96,記憶選擇),17 個雙語分類,支持按名稱 / 描述 / 標籤搜索,篩選條件包括可安裝 / 官方 / 本週新增 / 可更新 / 已收藏 / 已安裝,7 種排序(含隨機),卡片與列表兩種視圖,可摺疊的「最近添加」和「安裝最多」欄目,底部隊列欄把多次安裝合併成一個確認的批次。
收藏、屏蔽、備份、診斷。 收藏和屏蔽記錄保存在瀏覽器本地;備份導出當前 profile 的已裝列表及其 cordis patch 爲可讀 JSON,用於遷移;診斷檢查 dsh CLI、profile 目錄、數據源和嵌入頁面的實時佈局。
滾動條只保留一條。 頁面以 iframe 嵌入並按內容實際高度拉伸,滾動統一由宿主設置列承擔。彈層(詳情模態框、隊列欄、toast、lightbox)在每次滾動時重新錨定到可視窗口;拉伸測量讀的是真實內容末尾而非 scrollHeight,因此切換到較短的標籤頁時 iframe 會縮回去。
安裝與啓用¶
安裝命令來自 README,兩條官方形式如下:
# npm 發佈版
dsh plugin --profile <profile> add dsh-plug-store
# 或直接從 GitHub 安裝 —— 無需構建步驟,運行時零依賴
dsh plugin --profile <profile> add github:qianyumeng0228/dsh-plug-store
截至抓取時,npm 上發佈的是 0.1.21,而倉庫 package.json 中的版本是 0.1.28。README 明確建議在 npm 發佈追上之前優先使用上面的 github: 形式,因爲 GitHub 源始終是最新的。許可證爲 MIT,運行時依賴爲空,peer dependency 爲 @deepseek-ai/cordis ^4.0.1。
裝完後重啓宿主,或者讓 profile 的 HMR 接管:插件聲明瞭 bundle,dsh.bundle.patch 通常無需重啓就能重載它。
界面位置:Settings → Plugin Store(設置頁 → 插件商店),註冊在宿主的 settings.section 槽位上。UI 同時也通過宿主的 loopback 端口在 /dsh-store/ 提供,可以直接在瀏覽器打開。
兩個使用要點:
- DSH Desktop 用戶不要走 CLI。 在桌面機上執行
--profile web會把內容寫進profiles/web,Desktop 應用並不加載它,設置頁裏不會出現入口。桌面端應使用應用自帶的 plugin manager 安裝。 - 它作用於哪個 profile,按以下順序解析:插件配置裏的
profile→ 插件自身安裝目錄所在的 profile(~/.dsh/profiles/<profile>/…)→DSH_PROFILE→web。裝進desktop因此操作的就是desktop。
該插件需要一個基於 cordis 的 DSH 宿主,開發驗證針對 0.2.1-rc.2。在不受支持的宿主上,設置頁分區不會掛載。
典型用法¶
安裝後打開設置頁進入插件商店,可以按以下路徑操作:
1、在商店內搜索、按分類篩選,或用「可更新」篩選出本機已裝但目錄有新版本的插件。列表裏每張卡片反映的是本機實際狀態,不是目錄裏的靜態標記。
2、點某個插件查看詳情(主題類插件會顯示倉庫 README 中提取的截圖)。需要安裝就直接點安裝,排進隊列;頁面底部的隊列欄會把多次點擊合併成一次確認後批量執行。
3、安裝過程中觀察進度條和任務日誌,日誌同時持久化到 ~/.dsh/store-data/tasks.json。失敗時日誌裏給出從 ERR_PNPM_* 映射來的提示。
4、對已安裝的插件執行更新或卸載。卸載在界面上是兩步確認;更新只顯示真正發生版本變化的情況。
5、需要遷移時,用備份功能導出 JSON;需要排查環境時,用診斷檢查 CLI、profile 目錄、數據源和嵌入頁面佈局。
命令行層面,插件本身不新增一套 CLI 命令,所有能力都通過 /dsh-store/ 下的路由提供。
API 與數據¶
所有路由位於 /dsh-store/ 之下,其中 api/* 有訪問防護。
GET /api/capabilities 能力發現;UI 看到它後切換到宿主模式
GET /api/installed 已裝包的名稱、版本、類型與來源倉庫
POST /api/install {source:"npm",name,version?} 或 {source:"github",repo,ref?} → 202 {taskId}
POST /api/update 載荷同上;返回 from / to / changed
POST /api/uninstall 真實移除,界面上兩步確認
GET /api/tasks 排隊中、運行中與已完成的任務及其進度
POST /api/tasks/clear 只清除已完成和失敗的行
GET /api/backup profile 插件列表與 cordis patch 的 JSON
GET /api/diagnose CLI、profile、數據源與嵌入佈局健康檢查
GET /data/plugins.json 目錄代理,帶本地緩存與遠程兜底
標識符在到達 CLI 之前先校驗:npm 源必須是包名,GitHub 源必須是完整的 owner/repo(只給 repo 尾巴會拼出一個不合法的 github:dsh-xxx),任何以 - 開頭的值都會被拒絕,避免被解析成選項參數。
GET /api/installed 同時返回名稱和詳情,因爲目錄裏的顯示名與本機依賴鍵經常不一致(目錄裏的 yujunzhixue-dsh-purge 在磁盤上是 dsh-purge);只按其中一種匹配會靜默丟掉一半已裝列表。
目錄數據不打包進插件本身。插件通過自身的同源路由 /dsh-store/data/plugins.json 讀取目錄,並把快照緩存在 ~/.dsh/store-data/plugins.json,緩存 24 小時,過期後在後臺刷新一次——打開商店的速度不依賴當時 CDN 是否可達。響應使用 gzip 協商與弱 ETag。快照刻意不 vendoring 進包裏,是爲了避免分發一份每天都會過期的固定副本,而上面的緩存已經提供了同樣的首屏速度。
安全邊界¶
插件以當前 dsh 進程的權限運行,安裝前應自行檢查插件源碼與許可證。就 dsh-plug-store 自身而言,有幾項工程上的約束值得了解:
api/*路由要求 loopback 的Host(localhost/127.0.0.1/[::1])並帶上自定義x-dsh-store: 1頭。跨站頁面無法在沒有 preflight 的情況下設置該頭,而它會失去這個 preflight。頁面本身和目錄數據保持開放,因爲它們是公開的。- 運行時零依賴,無遙測,唯一的外部請求是拉取目錄。
- 插件不讀取任何憑證,寫入只發生在
~/.dsh/profiles/<profile>/(通過dsh plugin)和~/.dsh/store-data/(自己的任務日誌與數據緩存)。
適用場景與注意¶
適合一類人:希望把插件的發現、安裝、更新、備份收斂到一個界面裏,同時要求 UI 背後的命令確實被執行、結果確實可回讀。如果你只是偶爾裝一兩個插件,命令行本身已經夠用,這個插件的增量價值有限。
幾點需要注意:
- 依賴 cordis 宿主,且需與
@deepseek-ai/cordis ^4.0.1兼容;不受支持的宿主上分區不掛載。 - npm 發佈版本落後於 GitHub 源,想拿最新修復就用
github:形式。 - DSH Desktop 上請用應用自帶的插件管理器,不要用
--profile web的 CLI 方式。 - 它安裝的是社區插件,目錄本身是社區目錄,不等於官方應用商店。
結尾¶
dsh-plug-store 的價值在於把「瀏覽目錄」和「真實執行安裝」合併到同一個界面裏,並把進度和歷史用任務日誌留下來。它沒有重新造一套包管理器,命令行它照用,只是把執行結果如實回讀到界面。
目錄頁:https://www.skillhub.cn/plugins/qianyumeng0228/dsh-plug-store
GitHub:https://github.com/qianyumeng0228/dsh-plug-store