DSH 外掛啟動套件
在新機器上還原一組已知良好的 DeepSeek Harness (DSH) 外掛組。
真相來源是 plugins.json:每個外掛都鎖定到一個確切版本,並附有說明和可選的安裝後設定。指令碼會重現該設定,無需使用者記住套件名稱。
使用者情境
我現在在一台新機器上。我希望 DSH 安裝我另一台機器上使用的所有外掛,並保持相同的版本和相同的關鍵行為。
將此技能放到新機器上
正式公開副本位於:
https://github.com/GGGengXXX/make-dsh-better
在新機器上:
git clone https://github.com/GGGengXXX/make-dsh-better.git
mkdir -p ~/.agents/skills
cp -R make-dsh-better/skills/dsh-plugin-bootstrap ~/.agents/skills/
如果您已經複製了儲存庫,只需複製技能目錄即可。然後啟動一個新的 DSH 工作階段。DSH 會探索 ~/.agents/skills/<name>/SKILL.md 下的技能;該技能會顯示為 dsh-plugin-bootstrap。如果該技能已在該目錄中,請跳過複製步驟。
工作區副本是編輯的真相來源;修改後請重新複製。
此技能的作用
- 讀取
plugins.json(版本固定的外掛清單)。 - 偵測正確的 DSH CLI。
desktop設定檔由桌面應用程式保留,因此技能會優先使用應用程式捆綁的 CLI 包裝器,而非PATH上的通用dsh。 - 檢查 DSH 版本是否與 manifest 相符,並在不相符時發出警告/封鎖。
- 顯示安裝/更新/跳過計劃,要求確認,然後使用
dsh plugin --profile <profile> add <name>@<version>安裝每個外掛。 - 選擇性地將設定檔層級的
dsh-browser-cdp設定(Chrome 路徑 +--headless)套用到cordis.patch.yml。 - 驗證每個外掛是否同時為相依套件和已選取的 bundle。
- 選擇性地套用兩個版本固定的本機修補:
[email protected]:optimizeComposerKeys預設為 true。[email protected]:Enter=換行,Cmd/Ctrl+Enter=傳送。
它不會複製秘密、API 金鑰、工作階段、工作區檔案或整個 ~/.dsh 目錄。
使用者叫用此技能時的工作流程
從技能目錄(包含此 SKILL.md 的目錄)開始工作。
1. 在修改任何東西之前先檢查
node scripts/install.mjs --profile desktop --dry-run
向使用者顯示計劃。如果計劃要安裝或更新任何內容,請先要求明確確認,然後再執行不含 --dry-run 的指令。
如果使用者目標不是桌面應用程式,請傳遞實際的設定檔(例如 --profile web 或 --profile tui)。對於非桌面的設定檔,PATH 上的一般 dsh 就足夠了;指令碼會處理這種情況。
2. 安裝
node scripts/install.mjs --profile desktop --yes
有用的旗標:
| 旗標 | 意義 |
|---|---|
--dry-run | 列印計劃;不變更任何內容 |
--yes / -y | 非互動式確認 |
--json | 機器可讀的摘要輸出到 stdout(日誌輸出到 stderr) |
--no-config | 不觸碰 cordis.patch.yml |
--skip <pkg> | 跳過一個外掛(可重複使用) |
--strict | 要求完全符合 DSH 版本 |
--allow-dsh-mismatch | 即使 major.minor 不同也繼續 |
--dsh-cli <path> | 明確指定 CLI 路徑 |
--manifest <path> | 使用另一個 manifest |
該指令碼是冪等的:已安裝且版本鎖定並選為 bundle 的外掛將會被跳過。
3. 套用選擇性的本機修補
僅當使用者希望從原始機器獲得完全相同的關鍵行為時:
node scripts/apply-patches.mjs --profile desktop --dry-run
node scripts/apply-patches.mjs --profile desktop --yes
這會修改 node_modules/ 下已安裝的第三方檔案。除非給定了 --force,否則在版本不符時會拒絕執行,並保留 .bak-<timestamp> 副本。告訴使用者這是一個本機修補,未來的外掛更新可能會覆蓋它;更新後,請重新執行修補指令碼或在該外掛的設定中設定行為。
--only keyboard 和 --only markdown 限制修補範圍。
4. 重新啟動 / 重新整理
安裝外掛後,告訴使用者重新啟動 DeepSeek Harness(或在 Mac 上使用 Cmd+Shift+R 硬重新整理 Web UI)。客戶端 bundle 會根據每次頁面載入進行快取;一般的重新整理可能不夠。
5. 驗證
安裝程式會輸出一個驗證表格。如果某個外掛顯示 FAIL,請檢查:
- 該設定檔的
package.json中的相依套件和dsh.profile.bundles; - 該套件的版本是否與正在執行的 DSH 版本相容;
- 外掛管理員的日誌,位於
~/.dsh/profiles/<profile>/.plugin-manager/logs/。
更新 manifest(在原始機器上進行)
當使用者在他們的主要機器上安裝/移除外掛時,請重新整理 manifest:
node scripts/capture.mjs --profile desktop --dry-run # 預覽
node scripts/capture.mjs --profile desktop # 寫入 plugins.json
這會讀取設定檔的已選取 bundle,記錄每個外掛的已安裝版本,並保留現有的 note 欄位。之後提交/推送技能目錄(或將其複製到新機器)。
桌面設定檔規則
通用 DSH CLI 會刻意拒絕 --profile desktop:
error: profile "desktop" is managed exclusively by the Electron application
請改用桌面應用程式的 CLI 包裝器:
/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh
install.mjs 在 macOS 上會自動找到它。在其他平台上,或如果應用程式在其他位置,請設定 DSH_CLI 或傳遞 --dsh-cli。
Manifest 格式
plugins.json:
{
"schemaVersion": 1,
"targetProfile": "desktop",
"dshVersion": "0.2.1-rc.2",
"plugins": [
{ "name": "@scope/plugin", "version": "1.2.3", "note": "它為什麼在這裡" }
],
"config": {
"dsh-browser-cdp": {
"chromePath": "auto",
"runtimeArgs": "--headless"
}
},
"localPatches": [
{ "package": "dsh-keyboard-shortcut", "version": "0.2.0", "description": "..." }
]
}
dshVersion是捕獲 manifest 時的版本。允許相同的 major.minor 並顯示警告;不同的 major.minor 需要--allow-dsh-mismatch。targetProfile只是一個預設值;--profile會覆蓋它。config.dsh-browser-cdp.chromePath: "auto"會讓安裝程式探測常見的 Chrome/Chromium/Edge/Brave 位置。如果探測失敗,請設定明確的路徑。localPatches是提供給人類的文件;安裝程式不會自動套用它。請明確執行apply-patches.mjs。
包含的外掛組(捕獲於 2026-10-24)
| 外掛 | 版本 | 角色 |
|---|---|---|
@flyer103/dsh-side-chat | 0.6.0 | 原生右側欄側邊對話 |
dsh-browser-cdp | 1.6.0 | 透過 Chrome/CDP 的代理瀏覽器;無頭監控面板 |
dsh-keyboard-shortcut | 0.2.0 | Enter=換行,Cmd/Ctrl+Enter=傳送 |
dsh-markdown-bubble | 0.1.5 | 使用者訊息的 Markdown 渲染氣泡 |
dsh-markdown-input | 0.2.0-alpha.20 | 即時 Markdown 編輯器(alpha) |
dsh-better-sidebar | 0.28.0 | 檔案樹 + 可編輯的 CodeMirror + Git/任務/終端(重量級) |
備註:
dsh-markdown-input是 alpha 版本;如果它的編輯器接管行為異常,請在設定 → 外掛中將其停用。dsh-better-sidebar是重量級的,並包含自己的側邊對話;它可以與@flyer103/dsh-side-chat共存,但使用者會看到兩個側邊對話入口點。決定保留哪一個。- 內建的檔案和文件預覽是 DSH 本身的一部分;它們不在這個 manifest 中,無需安裝。
安全性
- 第三方 DSH 外掛在處理程序內執行,並可使用使用者的權限執行。僅從使用者信任的 manifest 安裝。
- 已鎖定確切版本。請勿無聲地將它們替換為
latest。 - 本機修補會修改
node_modules;它們是選擇性的、版本固定的、有備份的,並且可逆(還原.bak檔案或重新安裝外掛)。 - 請勿在「安裝外掛」的過程中複製
~/.dsh/.credentials.yaml、工作階段日誌或工作區檔案。
疑難排解
| 症狀 | 解決方法 |
|---|---|
profile "desktop" is managed exclusively… | 使用桌面應用程式 CLI 包裝器或 DSH_CLI;請參閱上方說明 |
Could not find a dsh CLI | 安裝 DSH Desktop,或傳遞 --dsh-cli /path/to/dsh |
profile "desktop" is not initialized | 至少開啟一次 DSH Desktop,以便建立 ~/.dsh/profiles/desktop |
ECONNRESET / fetch failed | 重試;安裝程式會自動重試一次;檢查網路/代理/註冊表 |
| 外掛已安裝但 UI 無變化 | 重新啟動 DSH 或硬重新整理(Cmd+Shift+R);客戶端 bundle 會被快取 |
| 外掛已安裝但未啟用 | 確認它已在 dsh.profile.bundles 中;外掛管理員的 add 通常會附加它 |
dsh-markdown-input 編輯器消失 | 檢查設定 → 外掛;alpha 外掛;硬重新整理;檢查控制台是否有 slot/composer 錯誤 |
dsh-better-sidebar/側邊對話衝突 | 兩者都可以啟動;選擇一個側邊對話入口或移除一個外掛 |
修補顯示 already-patched | 這是預期行為;該檔案已具有目標行為 |
修補顯示 skipped — version … | Manifest/外掛版本已變更;在使用 --force 前先檢查新版本 |
檔案
| 檔案 | 用途 |
|---|---|
SKILL.md | 此工作流程 |
plugins.json | 版本固定的外掛 manifest |
scripts/install.mjs | 試執行/安裝/驗證 |
scripts/capture.mjs | 從執行中的設定檔重新整理 manifest |
scripts/apply-patches.mjs | 選擇性的本機關鍵行為修補 |
patches/README.md | 修補的設計理由和手動備援方案 |