dsh-file-state-cache:把文件读写做成「有记忆」的 DSH 技能

前言

在 DeepSeek Harness(DSH)里跑 Agent 时,常见流程是:列目录、搜关键词、读全文、改完再读一遍确认。同一份源码被反复送进上下文,token 消耗快,步骤也重复。系统自带的读文件工具每次调用都是「新鲜」的,不会记住上一轮已经交付过的正文。

下面介绍社区插件 dsh-file-state-cache(维护者 Zzzk187)。它在硬盘上缓存文件状态与影子副本,让 explore 替代「ls + grep + 盲目 read」,让第二次 read 在内容未变时只回一行摘要,让 edit 直接返回 diff 和精确行号,而不必再全文重读确认。分类上属于 DSH 插件目录中的「记忆」类;状态跨工具调用、跨轮次、跨进程重启仍有效,这是纯上下文方案做不到的。

这是什么

dsh-file-state-cache 同时是 DSH 插件和 Cordis 技能。装好后,技能列表里会出现 file-state-cache(package 名 dsh-file-state-cache,当前 npm 版本 1.0.9,MIT 许可)。核心 CLI 在包内 scripts/fstate(Python 实现,Python 3.8+,仅用标准库);插件本体要求 Node.js >= 18。

一句话:同一件事会发生第二遍时,用这套工具省上下文;只做一次的一次性操作,仍宜用系统原生读文件工具。

核心功能

explore:一次定位,代替三轮摸索

不知道符号在哪时,用 explore "关键词" 在指定根目录下搜索,返回命中文件、定义行号、片段以及建议的下一步命令,意图是减少「先 ls 再 grep 再 read」的重复。

read:带 SHA-1 校验的缓存读

每次读之前先算磁盘上文件的 SHA-1,与缓存记录比对:

磁盘状态 行为
从未读过 返回正文(首次)
SHA-1 未变,且本会话已完整交付过正文 一行摘要,不再吐正文
SHA-1 已变,且有影子副本 返回 diff + 变动行号
SHA-1 已变,但无影子基线 明确说明无基线,降级为全文

默认一次最多输出 400 行;大文件会提示截断并给出续读方式,截断部分不算「读过」,避免用「内容未变」跳过未进入上下文的段落。摘要凭证仅在本会话内有效;换会话或上下文被压缩后,会重新给正文,避免「以为自己看过」的错觉。

支持 --mode full / range / changed,以及 --max-chars、--label 等开关。

edit / write:改完用 diff 当验证

edit 在匹配 --old / --new 后写回文件,输出 unified diff 和精确变动区间(不含 diff 上下文行)。不提供 --new 会直接报错,不会把「未指定」当成删除;要删内容需显式 --new ''。写回保持原 BOM、原编码、原换行风格。

write 支持整文件写入;--mkdir 可在父目录不存在时创建(默认报错以防路径打错)。

digest / state / diff / reset / hot

  • digest 目录/:多文件结构总览(例如函数签名一览)。
  • state 文件:查看该文件的缓存版本、阅读次数、是否过期等。
  • diff 文件:查看上次完整 diff。
  • reset 文件:清除单文件缓存;也可删除 ~/.dsh/fstate-cache/ 全量重建。
  • hot:查看反复读取的文件,便于自查占用。

存储与限制

每个文件一条 JSON 存在 ~/.dsh/fstate-cache/,并对 ≤2 MB 且真正读过的文件保留影子副本用于 diff(不依赖 git)。可通过环境变量 FSTATE_HOME 更换缓存根目录;找不到 Python 时可设 FSTATE_PYTHON。

按设计拒绝:二进制 / 含 NUL、超过 8 MB 的文本。编码探测支持 BOM 与 UTF-8 / GBK / Latin-1 等,且不会在无 BOM 文件上凭空添加 BOM。

在 DSH 0.2.1-rc.5 上验证通过;技能注册档位 rank 600(bundled)。若 ~/.dsh/dsh-skill/file-state-cache 存在本地副本,本地版优先。

安装与启用

官方安装命令(来自项目 README):

dsh plugin --profile web add Zzzk187/dsh-file-state-cache

本地开发时可指向目录:

dsh plugin --profile web add /你的路径/dsh-file-state-cache

装完后用 dsh plugin --profile web list 确认插件在列表中;技能未出现时 README 建议重启一次 DSH。安装前请自行查看 GitHub 仓库 源码与 MIT 许可证;插件以当前 DSH 进程权限运行,缓存会写入用户目录下的 ~/.dsh/fstate-cache/。

典型用法

包目录通常为:

~/.dsh/profiles/<profile>/node_modules/dsh-file-state-cache

(Windows 为 C:\Users\你\.dsh\profiles\<profile>\node_modules\dsh-file-state-cache。)

设置 CLI 路径并试跑:

F="<包目录>/scripts/fstate"
"$F" explore "handleRequest" --root .
"$F" read src/app.py
"$F" edit src/app.py --old 'return 1' --new 'return 2'
"$F" digest src/

read 指定行段:

"$F" read src/app.py --mode range --start 40 --end 90

edit 成功时输出类似(可直接作为改完验证,无需再 read 全文):

# 已改 src/app.py  → v2  19 行  区间 14..14
--- a/app.py
+++ b/app.py
@@ -11,7 +11,7 @@
-    return {"ok": True, "uptime": 0}
+    return {"ok": True, "uptime": 42}

清缓存示例:

"$F" reset src/app.py
rm -rf ~/.dsh/fstate-cache

适用场景与注意

更适合:

  • 同一文件或同一批目录会被多次 read / 改完多次确认;
  • 需要先「找代码在哪」再精读,explore + digest 能压缩摸索步骤;
  • 希望 diff 和行号进入上下文,而不是每次改完再灌一遍全文。

不必强行使用:

  • 已经知道确切行号 → 原生读文件工具更直接;
  • 一次性脚本或单条命令 → 没有第二遍,缓存几乎无收益;
  • README 也说明:「定位 → 读一段 → 改一处 → 只走一遍」的流程,用它可能更贵;反复碰同一内容时才明显省 token。

与原生读文件工具不冲突:插件不修改系统工具,只是多一种选择。外部编辑器若在背后改文件(格式化、保存钩子),下次 read 会按 SHA-1 变化处理;可用 state 核对版本。

DSH 生态理念是「一切皆插件」;SkillHub 目录页 是社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-file-state-cache 把「读过什么、改过什么」落到磁盘,用 explore、read、edit、digest 等命令减少 Agent 在 ls、grep、全文重读上的重复劳动。需要细节、排错表与 FAQ 时,以仓库 README 为准。

  • 目录页:https://www.skillhub.cn/plugins/Zzzk187/dsh-file-state-cache
  • GitHub:https://github.com/Zzzk187/dsh-file-state-cache
羽毛球分组比赛记分
小程序二维码

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

Xiaoye