前言¶
DeepSeek Harness(DSH)把每個會話綁定到一個工作區目錄,同一工作區的所有會話共享這個目錄。腳本、日誌、下載文件和截圖會混在一起,時間一長就會變得雜亂。DSH 插件生態遵循「一切皆插件」的理念,這個插件不修改 DSH 本身,而是通過插件層提供四個能力:遷移工作區、爲每個會話分配獨立輸出目錄、會話管理(移動與刪除)、從對話頭部重啓整個應用。
插件定位¶
dsh-session-workspace-organizer 是 DeepSeek Harness 的一個工作流插件,由 dream-fish69 維護。它解決的是 DSH 工作區目錄雜亂、會話輸出文件混在一起、會話遷移與清理不便的問題。插件通過擴展 DSH 的會話與工作區管理流程,爲每個新會話創建獨立的輸出目錄,支持工作區跨路徑遷移,並提供會話的批量移動與刪除功能。
安裝與啓用¶
從 npm 安裝(預構建,無需編譯):
dsh plugin --profile web add dsh-session-workspace-organizer
從 GitHub 源碼安裝:
dsh plugin --profile web add github:dream-fish69/dsh-session-workspace-organizer
本地開發安裝:
dsh plugin --profile web add link:/absolute/path/to/the/checkout
在 DSH 桌面端,進入 Plugins 頁面,先移除舊條目,再從安裝字段輸入上述任一命令。安裝或升級後需要重啓 DSH,插件的主機部分只在啓動時加載。
卸載時執行:
dsh plugin --profile web remove dsh-session-workspace-organizer
卸載不會刪除 sessions/ 文件夾及其內容。
核心功能¶
遷移工作區¶
在「Settings → Workspaces(工作區)」中選擇一個已註冊的工作區,指定新的父文件夾和名稱,點擊 Move workspace。
插件執行嚴格遷移:
- 整個目錄(含
sessions/)移動到新路徑,舊路徑被刪除,不留下符號鏈接或 junction; - 每個會話日誌的頭部
cwd被重寫爲新的路徑:第一個 zstd 幀包含頭部,僅替換其中的cwd,其餘幀保持字節不變; - 日誌目錄從
--<old cwd>--重命名爲--<new cwd>--; - 工作區從新路徑重新註冊,會話被重新關聯;
- 跨盤遷移時先複製並逐文件驗證,源文件在驗證通過前保留,失敗則回滾;
- 若舊目錄被鎖定(Windows
EBUSY/EPERM/EACCES,例如 DSH 仍持有句柄),插件會回退到複製遷移:複製並驗證、重寫日誌、切換註冊、然後嘗試刪除舊目錄,並報告無法刪除的確切原因。
限制:正在運行的工作區不能遷移,因爲會話日誌是追加寫入的,無法安全重寫。需要在另一個工作區打開對話並從那裏觸發遷移。如果會話仍在運行,對話框會列出會話標題和 ID,提供取消當前回合、等待會話結束再繼續,或切換到複製遷移的選項。如果當前對話就在目標工作區,必須從其他工作區觸發遷移。
若舊路徑是 DSH 的啓動目錄,插件會切換進程工作目錄和沙盒回退根,但桌面快捷方式或啓動器配置仍需手動更新。
會話結構整理¶
在「Organize structure」區域,插件會自動創建 sessions/ 和 sessions/README.md(如果缺失)。勾選「Move loose files」後,工作區根目錄下的普通文件會被移動到 sessions/<date>_整理/;.gitignore、.dsh、README.md、AGENTS.md 等常見項目清單文件保持原位不動。
會話管理¶
在「Sessions」區域可以批量移動或刪除空閒會話。
- Move to workspace…:將空閒會話(單個或批量)移動到另一個工作區,同時移動其日誌、
sessions/目錄及其內容,以及會話通過write/edit在源工作區其他位置創建的文件。 - Unresolved files(預覽):移動前點擊「Preview unresolved files」,計劃會列出未標記的遺留會話文件夾、相對寫入路徑(寫入時 cwd 未知)、源工作區外的文件、目標衝突和可選的項目文件夾。對每一行可以選擇目標會話文件夾、目標工作區根、自定義目錄或取消該項。已知文件自動移動,取消的項保留在原處。
- Legacy folders/projects:通過「Legacy session folder」和「Project folder」字段合併或移動指定項目。衝突文件保留目標文件,並生成帶源標記的副本(例如
verify.COT中文翻譯插件.md),不覆蓋現有文件。 - Delete:永久刪除空閒會話,首次刪除會顯示預覽,列出日誌、會話文件夾以及將一同刪除的外部文件。勾選選項後,文件纔會被移除;僅限在會話的源工作區內。
批量移動使用已知的目標位置,未解析的項目會被報告並留在原地。需要逐項選擇目標時使用單次移動。
每會話獨立輸出目錄¶
對於每個新會話或恢復的會話,只要其 cwd 在已註冊工作區內,插件會在該工作區下創建 <workspace>/sessions/<YYYY-MM-DD>_<title>/ 目錄,並在會話標題變更時重命名(日期前綴保持,重複時追加 -2)。目錄內放置一個 .dsh-session 標記文件,記錄 sessionId、workspacePath 和 createdAt,以便恢復會話時找到目錄,不要刪除該文件。
模型通過會話作用域的系統提示被告知:新腳本、日誌、下載、截圖、臨時數據和一次性產出應寫入該目錄,而現有項目代碼保持原位。在工作區根目錄使用 write 創建文件時,會觸發確認對話框;常見的清單文件(README.md、AGENTS.md、package.json、鎖文件、Makefile、Dockerfile 等)不受影響,直接創建。
從頭部重啓應用¶
對話頭部的重啓按鈕會結束並重新啓動整個 DSH 應用,因此所有緩存服務、插件和模塊都會從磁盤重建,與頁面刷新不同。
點擊後首先彈出確認對話框,提示應用將關閉並重新啓動,當前工作會中斷。Esc、背景層和「Cancel」均可關閉對話框。
重啓按鈕會在以下情況變爲不可用或變爲紅色「Restart anyway」:
- 會話正在生成內容;
- 有待處理的回合正在隊列中;
- 有後臺任務在運行。
此時默認選擇依然是「Cancel」,確保安全。服務器端可以通過 {"force": true} 覆蓋該保護,但任何格式錯誤都不會被視爲「force」。
適用場景與注意事項¶
適合需要頻繁遷移工作區、整理會話輸出目錄、批量管理或清理會話的開發者。插件以當前 DSH 進程的權限運行,安裝前應檢查源碼與許可證(MIT)。
總結¶
這個插件通過遷移工作區、爲每個會話分配獨立輸出目錄、批量移動與刪除會話、以及從頭部重啓應用四個方面,緩解了 DSH 工作區雜亂和會話管理不便的問題。它不修改 DSH 本身,而是通過插件層擴展其能力,適合希望保持工作區整潔、會話隔離的開發者。
目錄頁:https://www.skillhub.cn/plugins/dream-fish69/dsh-session-workspace-organizer
GitHub:https://github.com/dream-fish69/dsh-session-workspace-organizer