前言¶
在 DSH(DeepSeek Harness)裏調試智能體,繞不開 AGENTS.md。全局的 ~/.dsh/AGENTS.md、共享的 ~/.agents/AGENTS.md,再加上項目根到會話 cwd 每一層目錄裏的 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md,文件分散、層級多,改完要猜下一次哪次工具調用會讀到。dsh-agents-viewer 做的事情是把這些指令文件收攏到一個入口:右側欄原生 tab 裏查看和編輯,聊天頭部給一鍵按鈕,另配一條不依賴界面的 /agents 命令。它定位的是編輯與查看,不重寫 DSH 的指令加載邏輯。
這是什麼¶
dsh-agents-viewer 是一個 DSH dual-face bundle 插件:宿主半在 index.js,客戶端半在 runtime/client.js,由 package.json 的 dsh.client 聲明。維護者爲 atrestandbed-bot,包版本 0.7.0,MIT 許可。
它需要帶 ctx.sidebarRightTabs 的 DSH。README 標註 0.2.2-rc.1(Electron 44.7.0)已驗證,engines.dsh 只保留下限 >=0.2.2-rc.1,沒有上限,dsh.client.inject 爲空,服務在運行時探測。作者的取捨是:DSH 小版本更新不用改清單;真改了 API,最壞少一個 tab,DSH 仍能啓動。
核心功能¶
右側欄原生 tab¶
在右側欄的「添加」菜單或引導頁裏打開 AGENTS.md。用的是 DSH 自己的 tab、分欄、全屏、拖拽和收起,而不是浮動抽屜加遮罩,也沒有 requestAnimationFrame 跟隨或者「等 30 秒兜底按鈕」那類做法。
聊天頭部按鈕¶
文件/側欄按鈕那一簇的左邊有一個 AGENTS.md 圖標,點一下打開原生 tab。右側欄已展開且當前就是 AGENTS.md 時,再點一次收起側欄。按鈕默認顯示;/agents c 和 /agents o 把狀態寫入持久化文件,下次啓動 DSH 後才按新狀態顯示或隱藏。
完整指令鏈¶
面板覆蓋全局 ~/.dsh/AGENTS.md、共享 ~/.agents/AGENTS.md,以及項目根到會話 cwd 每一層目錄下的 AGENTS.md / CLAUDE.md / AGENTS.local.md / CLAUDE.local.md。面板和 /agents 命令同口徑,子目錄裏的文件也能直接改。鏈外的任意子目錄不出現。
精確項目¶
tab 正文從標準 props 拿到 sessionId 和 useSessions,宿主按 session id 反查 ~/.dsh/storages/workspace.json 定位工作區,不再用「最近更新的工作區」猜。拿不到會話時才退回最近工作區,並在 tab 上標「推斷」、保存前確認。
原地編輯保存¶
列表點選 → 編輯 → Ctrl+S 或「保存」。文件不存在時寫內容保存即創建。
安裝與啓用¶
推薦直接用 DSH 的插件頁安裝這個包,它會自動處理依賴和 bundles;或者在本 checkout 裏跑 npm run adapt:install。
手動裝進某個 profile(以 Windows 桌面 profile 爲例)按三步走。這段在做什麼:先把包目錄複製進 profile 的 node_modules,再在 profile 的 package.json 裏登記依賴和 bundles,最後重啓 DSH。
$profile = "$env:USERPROFILE\.dsh\profiles\desktop"
$name = "dsh-agents-viewer"
# 1) 把包目錄複製進去(要包含 runtime/)
Copy-Item -Recurse -Force "<這個包的路徑>" "$profile\node_modules\$name"
# 2) 在 profile 的 package.json 裏登記:
# dependencies 里加 "dsh-agents-viewer": "file:<這個包的絕對路徑>"
# dsh.profile.bundles 末尾追加 "dsh-agents-viewer"
# 注意:bundles 纔是“啓用”開關;只在 dependencies 裏是“裝了但沒啓用”。
# 3) 重啓 DSH(客戶端 tab 的類型註冊發生在啓動時)
改之前建議先備份 profile 的 package.json 和 cordis.patch.yml。
升級 DSH 後可以先跑自適應檢查,看版本、engines、profile 副本是否一致:
npm run adapt # 只檢查:版本、engines、profile 副本是否一致
# 退出 DSH 後,需要把本 checkout 同步進 profile 時:
npm run adapt:install
另外提供一個手動的清單核對腳本,可直接指定安裝位置,也可以覈對 app.asar:
node scripts/check-compat.mjs
# 或指定安裝位置
node scripts/check-compat.mjs --asar "D:/Program Files/DeepSeek Harness/resources/app.asar"
它會覈對 dsh.client.inject 裏的每個包是否存在、engines.dsh 是否接受當前版本、客戶端 bundle 是否還按 window.__ModuleLoader__.load 註冊。DSH 改了模塊名時,這裏會先報 FAIL。
典型用法¶
/agents 命令不依賴界面,任何情況下都可用:
/agents 列出所有 AGENTS.md
/agents <序號> 看全文
/agents all 看全部
/agents w <序號> 用外部編輯器打開
/agents n 新建(項目級)
/agents n global 新建全局
/agents n shared 新建共享
/agents o 記錄“顯示按鈕”(下次啓動生效)
/agents c 記錄“隱藏按鈕”(下次啓動生效)
/agents help 用法
界面路徑與命令路徑等價:在右側欄「添加」菜單裏打開 tab,點頭部按鈕切換,列表裏點選後編輯、Ctrl+S 保存。
實現要點¶
只看實現思路里值得留意的幾處:
- 客戶端用
ctx.sidebarRightTabs.register({ id, kind, priority, title, guide, keepMounted })註冊頁面類型,正文通過ctx.slots.register({ name: 'sidebar.right.pane.tab', key: id }, Body)掛載。正文的標準 props 直接給sessionId和useSessions,沒有 DOM 觀察和 URL 解析。 - 頭部按鈕註冊進
conversation.session.header.utilities(list 槽,order: -100)。點擊時:側欄收起 →openTab('agents');已展開且當前 tab 是agents→toggleExpanded()收起;展開但是別的 tab → 切到agents。 - 宿主用
webServer.register暴露/dsh-agents-viewer/list、/read、/write,resolveProject(hint)從 hint 裏的session-<uuid>反查 workspace.json。 - 白名單是全局、共享,加上項目根到 cwd 的目錄鏈,其餘路徑一律 403;寫盤是宿主進程直接
fs.writeFileSync,白名單是唯一入口。 - 兼容性上,客戶端只 Cordis-inject
slots,sidebarRightTabs/sidebarRight用嵌套ctx.inject按需等待;宿主對webServer.register/commands.register/workingDirectory.ensure先判類型,缺了只打 warning。webserver/index-inject全包 try/catch,插件異常不會把 index 變成 500。
適用場景與注意¶
適合在 DSH 裏維護 AGENTS.md 指令鏈的開發者:需要跨全局、共享、項目多層編輯,或者需要一條不依賴界面的兜底命令。README 標註的兼容性區間是 dsh >=0.2.2-rc.1,驗證版本爲 0.2.2-rc.1(Electron 44.7.0)。
幾點必須留意:
- 插件以當前 dsh 進程權限運行,能讀寫白名單內的路徑;安裝前先讀一遍源碼,確認許可證爲 MIT。
- 面板保存不觸發指令熱刷新:宿主直接寫盤,
dsh-agent-instructions只在後續一次read / write / edit工具調用時刷新。當前會話要立刻看到新內容,需要新開會話,或讓 agent 對該文件做一次讀寫。 /agents o和/agents c不是即時顯隱,只改持久化狀態,按鈕在下次啓動或刷新的頁面加載時讀取。- 首次安裝或升級需要重啓 DSH,客戶端模塊圖在啓動時組裝。
- 改 profile 的 bundles、connection 或啓動項前先完整退出 DSH:運行中改動會觸發 HMR,當前瀏覽器連接被換掉,進行中的會話以
turn/end: aborted / disposed結束。只改插件工作目錄裏的代碼則可以熱重載。 - 目錄頁是社區站點的插件列表,與 DeepSeek / 幻方沒有官方從屬關係,不是官方應用商店。
另外,README 專門說明一類 desktop welcome: Web authentication failed 啓動失敗不是插件造成的,失敗點在桌面殼向自己剛啓動的 Host 換 cookie 的一步,插件尚未參與。判斷方法是崩潰日誌裏的 --- error --- 是否爲該信息,以及點「禁用第三方插件」後是否繼續崩。
結尾¶
dsh-agents-viewer 的價值在於把分散的 AGENTS.md 收進 DSH 原生界面,讀和改走同一個口徑,另留一條不依賴界面的命令通道。目錄頁:https://www.skillhub.cn/plugins/atrestandbed-bot/dsh-agents-viewer ;源碼:https://github.com/atrestandbed-bot/dsh-agents-viewer