前言¶
DSH(DeepSeek Harness)裏一個工作區(workspace)是註冊表裏的一條記錄,指向一個目錄;一條會話歸屬哪個工作區,看的是會話不可變頭部裏記錄的 cwd 規範形式。目錄一旦移動,兩邊同時失效:工作區報 missing-dir,它列出的會話解析不到工作目錄,工具調用全部失敗。
而頭部是隻追加存儲,沒有現成的搬遷接口。的意思是:要讓舊路徑的「拼寫」重新能解析到新位置,同時把工作區記錄搬到新的規範路徑上——也就是建立一個目錄路由(Windows 上是 directory junction)。這是路由問題,不是改歷史的問題。
下面介紹的 blankwy/dsh-workspace-relink 就是做這件事的客戶端插件:搬目錄,不重寫任何會話歷史。
這是什麼¶
dsh-workspace-relink 由 blankwy 維護,分類爲客戶端,倉庫當前星標爲 0,許可證 MIT。它解決的問題是:項目目錄挪走後,讓舊工作區和舊會話繼續可用,而不是讓整段會話歷史作廢。
插件自己不搬文件、不刪文件。你把文件移到新位置,它在舊位置建一個 junction,把工作區記錄指向新路徑,然後按註冊表自帶的 attach/detach 校驗逐個移交會話歸屬,最後註銷舊登記。
核心功能¶
路由式遷移,而不是改歷史。遷移結果示意:
D:\A\B\C ──► moved by you to ──► D:\E\F\A\B\C
│ │
└── becomes a junction ───────────────┘
(workspace record now lives here)
處理流程分三步:
- 你自己移動文件,插件不參與搬運。
- 在插件頁面(Plugins → 工作區路由遷徙)用
修改位置輸入新路徑,預覽計劃會先檢查新目錄是否存在、舊路徑是否空閒,並列出將要做的動作,寫盤之前把阻塞項和警告說清楚。 - 點擊
執行遷徙:在舊路徑建 junction,在新規範路徑創建或複用工作區,逐個會話走註冊表的 attach/detach 校驗轉移歸屬,舊登記清空後再註銷。
同一個頁面還支持:把單條會話移到另一個工作區;查看本插件創建的路由及其目標存活狀態;對記錄在案的路由執行移除。
插件另有智能體工具,在 agentTools 未設爲 false 時對模型可見,每個工具返回一行人類可讀摘要加完整 JSON:
| 工具 | 用途 |
|---|---|
workspace_relink_status |
列出工作區、路徑、狀態、會話數與已記錄路由;includeSessions: true 時返回各會話的 id、標題、記錄的 cwd、cwdState 與 live 標記 |
workspace_relink_plan |
對單工作區改址做幹跑 |
workspace_relink_apply |
執行(需要 confirmed: true) |
workspace_relink_move_session |
把單條會話移入另一個工作區 |
workspace_relink_route_remove |
移除一條已記錄路由 |
安裝與啓用¶
README 與倉庫內文檔都沒有給出安裝命令,這裏不拼接 dsh plugin add github:owner/repo。插件在目錄頁 skillhub.cn 有條目,可從目錄頁確認當前提供的安裝或接入方式後再使用;倉庫地址見文末。
已知環境要求:DSH >= 0.2.0,Node >= 20;在 Windows 上創建 junction 不需要管理員權限(fs.symlink(..., 'junction'))。web 端頁面通過 dsh bundle 機制接入,配置見包內 cordis.patch.yml。
配置項只有兩個:
| 鍵 | 默認值 | 含義 |
|---|---|---|
agentTools |
true |
是否向模型暴露上表的工具;頁面始終可用 |
allowSessionRoutes |
true |
移動一條目錄已不存在的會話時,是否允許創建路由 |
啓用後從 Plugins → 工作區路由遷徙 打開頁面。
典型用法¶
先移動目錄(示例,Windows):
move D:\A\B\C D:\E\F\A\B\C
然後在頁面上執行:
- 找到報
missing-dir的工作區,點擊修改位置。 - 填入
D:\E\F\A\B\C,或按瀏覽…選擇。 - 點
預覽計劃,確認沒有阻塞項。 - 點
執行遷徙。
結束後舊路徑 D:\A\B\C 是一個指向新目錄的 junction,工作區記錄位於新路徑,歷史會話原樣保留、繼續可用。
想跑插件自帶的自測,在倉庫根目錄執行:
node scripts/selftest.mjs
自測針對一個模擬註冊表運行,復現 DSH 的成員歸屬規則(realpath(header.cwd) 相等,加上缺 cwd 的通配情形),覆蓋破壞態、plan、apply、路由複用、拒絕場景、殘留目錄搬移、單會話收養與路由移除;除臨時目錄外不寫任何內容。
適用場景與注意¶
適合這類情況:目錄已經挪走(或打算挪),但工作區裏的會話歷史不想丟、不想重開新會話。
使用前需要知道的限制:
- 新舊目錄必須在同一臺機器上可達,junction 是本地文件系統對象。
- 舊目錄若沒刪乾淨(比如做了複製而不是移動),計劃會被阻塞,直到你允許插件把它重命名爲
<name>.moved-<timestamp>;插件不刪除任何內容。 - 只有本插件記錄的路由能被移除,且路徑當前仍是 junction 時才允許;經該路由解析工作目錄的會話會回到「目錄缺失」的狀態。
- 若某條會話記錄的目錄是另一個現存目錄,插件拒絕把它改派到不匹配的工作區(DSH 自身也會拒絕),而不是靜默 detach。
- 日誌裏沒有
cwd的會話會被標記爲不可遷移,不會被猜測處理。
另外兩點:插件以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證;它只負責路由和歸屬轉移,不改寫會話歷史。
路由記錄寫在 <DSH_HOME>/workspace-relink/routes.json(絕對路徑、類型、id、時間戳)。它只是文件系統的索引,不是權威來源:手工建立的符號鏈接不會被碰,記錄中鏈接已失效的路由只是如實彙報。
結尾¶
遷移工作區的關鍵是給舊路徑留一條能解析的路由,而不是改寫歷史。blankwy/dsh-workspace-relink 把這兩件事拆開處理得比較乾淨,功能邊界和失敗模式在 README 裏也寫清楚了。
- 目錄頁:https://www.skillhub.cn/plugins/blankwy/dsh-workspace-relink
- GitHub:https://github.com/blankwy/dsh-workspace-relink