dsh-agents-viewer:把 AGENTS.md 指令鏈放進 DSH 右側欄

前言

在 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

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

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

小夜