前言¶
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