dsh-workspace-relink:給搬過家的 DSH 工作區指條新路

前言

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)

處理流程分三步:

  1. 你自己移動文件,插件不參與搬運。
  2. 在插件頁面(Plugins → 工作區路由遷徙)用 修改位置 輸入新路徑,預覽計劃 會先檢查新目錄是否存在、舊路徑是否空閒,並列出將要做的動作,寫盤之前把阻塞項和警告說清楚。
  3. 點擊 執行遷徙:在舊路徑建 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

然後在頁面上執行:

  1. 找到報 missing-dir 的工作區,點擊 修改位置。
  2. 填入 D:\E\F\A\B\C,或按 瀏覽… 選擇。
  3. 點 預覽計劃,確認沒有阻塞項。
  4. 點 執行遷徙。

結束後舊路徑 D:\A\B\C 是一個指向新目錄的 junction,工作區記錄位於新路徑,歷史會話原樣保留、繼續可用。

想跑插件自帶的自測,在倉庫根目錄執行:

node scripts/selftest.mjs

自測針對一個模擬註冊表運行,復現 DSH 的成員歸屬規則(realpath(header.cwd) 相等,加上缺 cwd 的通配情形),覆蓋破壞態、plan、apply、路由複用、拒絕場景、殘留目錄搬移、單會話收養與路由移除;除臨時目錄外不寫任何內容。

適用場景與注意

適合這類情況:目錄已經挪走(或打算挪),但工作區裏的會話歷史不想丟、不想重開新會話。

使用前需要知道的限制:

  1. 新舊目錄必須在同一臺機器上可達,junction 是本地文件系統對象。
  2. 舊目錄若沒刪乾淨(比如做了複製而不是移動),計劃會被阻塞,直到你允許插件把它重命名爲 <name>.moved-<timestamp>;插件不刪除任何內容。
  3. 只有本插件記錄的路由能被移除,且路徑當前仍是 junction 時才允許;經該路由解析工作目錄的會話會回到「目錄缺失」的狀態。
  4. 若某條會話記錄的目錄是另一個現存目錄,插件拒絕把它改派到不匹配的工作區(DSH 自身也會拒絕),而不是靜默 detach。
  5. 日誌裏沒有 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
羽毛球分组比赛记分
小程序二维码

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

小夜