sjh9714/dsh-what-changed0

dsh-what-changed

按会话汇总所有文件改动的审阅插件,支持一屏看完所有修改后再决定是否提交。

AI 分析

解决 Web UI 修改代码不透明的问题,提供一屏式文件改动审阅面板。适合需要清晰掌控 Agent 代码修改细节、避免黑盒提交的 DSH Web 用户。

包名
dsh-what-changed
版本
0.1.0
最近更新
2026年8月17日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:sjh9714/dsh-what-changed

dsh-what-changed

看得见 Agent 到底改了什么。一个会话里所有文件改动,一屏看完再决定要不要提交。

English

status

platform

MIT

它解决的那句话

DSH 讨论区赞数最高的一条是 #172(163 赞,第二名 46 赞)。大家在那里要独立客户端、CLI 和 VSCode 插件。但底下赞数最高的两条回复说的不是界面。

这个WEB版本总是看不见它编辑了啥代码,总感觉怪怪的

还是喜欢用cli模式,web太黑盒了

想要 CLI 的真正理由是看不见 Agent 对自己代码做了什么。官方已经在那条帖子里回复「后面会有的」,所以客户端和 CLI 不该由社区来抢;但「它到底改了什么」是另一回事,现在没有人回答。

单次调用的 diff 卡片本来就会渲染。缺的是那个你在提交前真正想要的东西:这一整个会话,一共动了哪些文件。

dsh plugin --profile web add dsh-what-changed

装完会话顶栏多一个按钮,写着改了几个文件、几处编辑。点开就是那一屏。

会话中途装也没关系。 这一点不是我们做的,是 session-projection 这个座子给的:晚注册的单元第一次被读取时,会从头把整条日志重放一遍。所以你在 Agent 干完活之后才想起来装,照样能看到它这一路改了什么。

三件事它坚持做

被拒绝的写入不算改动。 权限围栏挡下来的编辑没有落到工作区,把它显示成一处改动,等于把这个插件想消灭的问题重新造一遍。它们按文件单独计数,不进编辑总数。

分清「请求」和「结果」。 tool/result 可能带上工具真正写下去的那段 diff,有就用那个。str_replace_editor(极简模式挂的编辑器)不带,那就退回到调用参数。每条编辑都标出自己是哪一种,屏幕上也写着 as asked, tool reported no applied hunk。把请求当结果展示,本身就是一个小谎。

零也要显示。 「它什么都没改」也是一个答案。按钮消失了会被当成插件坏了。

它怎么拿到数据

不改核心一行,不读磁盘上的日志,不自己订阅事件。

用的是 ctx.sessionProjectionssession-projection 座子。它自己的文档就写着插件应该在 ctx.inject(['sessionProjections'], …) 下面注册,没有这个能力的组合里我们干脆不运行,客户端把它读成「能力缺席」而不是报错。

浏览器那半只做一件事:往 conversation.session.header.actions 挂一个按钮,值通过框架的 useProjection 拿。它不折叠事件,不订阅任何东西。

诚实的状态

没有在真实的 Web UI 里跑过。 契约层面是对的,有 19 个测试:10 个折叠逻辑,4 个跑在真的 SessionProjectionRegistry 和真的 SessionStore 里面,5 个把面板真的渲染出来点开。还没做的是把它挂进运行中的 Web UI,看那个按钮在真实顶栏里的样子。所以这里没有截图。 有了再放。

已经验证的:

  • 真实注册表会驱动这个单元,zod schema 在出口做校验
  • 会话中途注册后,读到的是整条日志的结果(这条是断言出来的,不是从文档抄的)
  • 没注册时读成 undefined,客户端渲染 null,不抛错
  • 被拒绝的写入不进编辑总数

写这个插件的过程里,有八处契约我先猜错了再去查源码改对的。其中两处会安静地失败:编译通过、运行正常、面板永远是空的。

  • callIdmessage.source.callId,不在 message.callId
  • tool/call 不能surfaceOptool/result 必须带。两个方向都会 throw

第二条是把测试接到真实 SessionStore 上才发现的,单元测试看不见,因为它直接喂 apply()

限制

  • 只认三个写入工具:str_replace_editorwriteedit。别的插件自带的写入工具不会被算进去
  • 行数是按调用携带的文本数的,不是 git 意义上的行级 diff
  • 面板显示的是「Agent 通过工具写了什么」,不是「工作区现在和 git HEAD 差多少」。你自己手改的东西不在里面

License

MIT