前言¶
DeepSeek Harness (DSH) 採用了插件化架構。在處理代碼編輯任務時,傳統的行號 (line number) 編輯方式存在兩個問題:一是模型經常需要回顯舊代碼以確認上下文,造成 token 浪費;二是多步編輯中,文件內容變動會導致後續編輯指令失效。
dsh-hashline-edittool 爲 DSH 提供了一套基於內容哈希錨點的工具集。它爲文件中的每一行分配一個變量長度的 Base62 標識符,允許模型通過錨點進行編輯,從而避免重複輸出舊代碼,並提供原子性的批量寫入能力。
插件定位¶
這是一個工作流插件,由維護者 hyperion2144 開發,基於 MIT 許可證。它替換了 DSH 內置的 read / edit / grep 工具,並新增了 undo_last_edit、ast_grep、ast_edit 和 lsp 工具。
核心功能¶
1. Hash 錨點機制¶
- 變量長度編碼:錨點不是固定寬度的哈希,而是動態分配的 Base62 編碼。前 3,844 行只需 2 個字符即可覆蓋,隨着文件增長才增加長度(上限約爲 62⁸ 行)。
- 非數字標識:編碼中跳過全數字組合,避免與行號混淆。
- 標記格式:編輯時使用
<anchor>:<line>格式。其中line僅作爲位置提示,錨點纔是權威標識。
2. 原子性寫入與驗證¶
- 批量原子性:所有的編輯操作是一個原子批次。如果批次中任何一個編輯範圍驗證失敗,整個寫入操作都會回滾,不會寫入任何文件。
- 寫入路徑:所有寫入操作通過
ctx.fs進行。 - 過期檢測:寫入時會驗證模型實際看到的內容是否與磁盤當前內容一致。如果內容被篡改,會返回
[E_STALE]錯誤,並立即返回當前行的最新錨點和內容供重試。
3. 自渲染 UI 與配置¶
- 自渲染卡片:插件自帶 React 組件(如
HashlineReadRow、HashlineEditRow等),直接註冊到 DSH Web UI 的插槽中。UI 從結構化數據渲染,無需字符串解析。 - 自渲染設置面板:提供可視化的設置界面,無需手動編輯 YAML。
- 熱切換:配置更改(如輸出格式、AST/LSP 開關)在下次工具調用時立即生效,無需重啓進程。
4. AST 與 LSP 支持¶
- ast_grep / ast_edit:基於 Tree-sitter 提供語法樹級別的查找與編輯。
- lsp:集成語言服務器協議,提供語義信息。
安裝與啓用¶
確保環境滿足以下要求:
* Node.js 版本:^22.19.0 || >=24.0.0
* 需要一個已存在的 DSH Profile
執行安裝命令:
npx @deepseek-ai/dsh plugin --profile web add github:hyperion2144/dsh-hashline-edittool
安裝完成後,在下一個會話中啓用該插件。通過以下命令驗證配置是否加載成功:
dsh --profile <name> --dump-config
輸出中應包含 # == dsh-hashline-edittool 相關的層配置。
典型用法¶
讀取文件¶
read 工具的輸出頭部爲 ANCHOR:FILELINE,格式如下:
ANCHOR:FILELINE
G8:1|// UI demo file
ur:2|export const APP = "hashline";
D0:4|export function greet(name: string): string {
編輯文件¶
模型在響應中通過錨點指定修改範圍。例如修改第二行:
<ur:2>const APP = "hashline";
如果編輯被拒絕(如 [E_STALE]),插件會返回當前行的最新錨點和內容,模型需使用新的錨點重新提交。
注意事項¶
- 權限與來源:插件以當前 DSH 進程的權限運行,請確保在安裝前查閱 GitHub 源碼與許可證。
- 錯誤碼:常見的錯誤碼包括
[E_RANGE_UNSERVED](範圍未服務)、[E_STALE](內容已過期)和[E_LINE_HINT](行號提示不一致)。
總結¶
dsh-hashline-edittool 通過引入變量長度的 Base62 錨點,解決了傳統行號編輯在上下文傳遞和併發衝突上的痛點。它提供了原子性的編輯操作、實時的語法診斷以及自包含的 UI 組件,適合需要在 DSH 中進行復雜、多步代碼編輯場景的開發者。
- GitHub 倉庫: https://github.com/hyperion2144/dsh-hashline-edittool
- 插件目錄: https://www.skillhub.cn/plugins/hyperion2144/dsh-hashline-edittool