dsh-code-impact:用符号索引回答「这次改动影响了什么」

前言

在 DeepSeek Harness(DSH)里让智能体改代码,常见收尾是整仓搜索、逐个打开相关文件,再跑一遍全量类型检查或测试。问题往往不是不想做完整验证,而是每次都靠扫描来猜影响面。

社区插件 dsh-code-impact(维护者 Locael123,目录分类为工作流)把仓库关系预先建成内存里的符号索引与引用图;改完文件后只重解析变更处,用查询和校验工具给出 file:line、置信度以及未验证部分,而不是再 grep 一遍。下面介绍它是什么、怎么装、怎么用。

这是什么

dsh-code-impact 面向 DSH 智能体的编辑后影响检查:维护符号索引、引用图和继承模型,用索引回答问题「这次编辑碰到了什么」,而不是「重新扫全仓再跑一切」。

实现上是无依赖的启发式引擎(README 标注支持 TypeScript、JavaScript、Go),作为 DSH host bundle 注册工具,并在设置里提供可浏览的同一套索引页面(Settings → Code Impact)。

核心功能

两个会话工具

每个 agent 会话会注册两个工具。

code_query

按 op 查询索引,常见操作包括:

op 作用
find 定位符号(如 addNode、Graph.addNode、ts:src/x.ts#Graph.addNode)
outline 单文件声明骨架:行范围、导出、继承子句
refs 谁引用了该符号(逐处解析,同名局部变量不算)
hierarchy 继承 / 实现 / 子类型 / 成员(自有、继承、重写)
search 在名称与签名上做子串匹配
status 索引规模、根目录、缓存位置、引擎模式、解析失败项

README 中的 find 示例:

find "parseTimeout" — 1 match

ts:src/config.ts#parseTimeout
  variable  src/config.ts:1-1  exported  refs:3
  parseTimeout = 30 ;

refs 会列出引用站点及置信度分类(exact / resolved / heuristic / unresolved mentions)。

code_verify

在编辑后调用,替代全仓重扫。只重解析磁盘上变更(及新发现)的文件,并报告符号级差异。

verdict 四级:

  • clean:无变更
  • internal:仅实现层(如 body-only,签名未变、调用方不受影响)
  • contract:签名或导出变更,调用方可能需要改
  • breaking:曾有引用指向的符号消失,出现 dangling 引用

规则要点(来自 README):例如 const timeout = 30 改为 = 60 记为 value change / body-only,不会当成 contract;容器类型(class / interface / struct)本身不单独罗列,由成员变化表达。code_verify 是增量的:相对上次索引同步报告变化;连续两次调用且中间未再编辑,第二次应为 clean。

internal 示例:

verify — verdict: internal
  1 file changed (0 deleted) · +0 -0 symbols · 1 body-only

body-only (signature unchanged, callers unaffected):
  ts:src/config.ts#parseTimeout  refs:6

breaking 示例会列出消失的符号与无法再解析的引用。

索引浏览页

Settings → Code Impact 与工具共用同一索引,无需重新扫描即可查看:

视图 内容
Architecture 按符号数加权的目录 treemap,按语言着色
Imports 文件级 import 图(弦图)
Inheritance 类型层次,implements 为虚线
Sessions 各会话对插件的调用记录

页头有文件 / 符号 / 语言等统计、索引构建时间与跳过文件警告,以及 Refresh。Sessions 记录每次 code_query / code_verify(写入 $DSH_HOME/cache/code-index/usage.json,重启后仍可读;Clear 只清空使用记录,不动索引)。Open full page 打开 /code-impact/app 全屏视图。

可在页头输入绝对路径为第二个工作区建索引并切换;agent 在某 cwd 下首次调用 code_query 也会隐式索引该工作区。读接口仅允许已索引目录或会话工作目录;POST /code-impact/api/index 在请求时构建缓存,拒绝相对路径、缺失目录与普通文件,且不在仓库内写入。

安装与启用

安装命令以 README 为准:

# from GitHub (or any published tarball / registry package)
dsh plugin --profile desktop add github:Locael123/dsh-code-impact
dsh web    # restart: the host half of a plugin is imported once, at boot

本地 checkout 可用:

plugin_manager install_bundle <absolute path>/dsh-code-impact

插件为 Cordis/DSH bundle(package.json 当前版本 0.2.2),零依赖、纯 ESM。安装后需重启 Web 侧(dsh web),host 半部在启动时加载一次。

典型用法

  1. 改代码前或定位时,用 code_query 的 find / refs / hierarchy 查清符号定义与引用链。
  2. 保存编辑后调用 code_verify,根据 verdict 决定是否需要改调用方或跑针对性检查。
  3. 在 Settings → Code Impact 查看架构、导入与继承关系,或在 Sessions 里核对本会话查询历史。

循环设计是:每改一次就问一次 verify;第二次无新编辑时应得到 clean。

适用场景与注意

适合在 DSH 智能体工作流里做改后影响面判断:重命名、改默认值、删方法、改导出或签名时,先拿 contract / breaking 与具体行号,再决定是否全量测试。

范围与限制以 README Scope & limits 为准:语言覆盖为 TS / JS / Go;启发式解析会有未解析或 heuristic 项,答案会标明 unverified 部分,避免「大概没事」式结论。

插件在当前 dsh 进程权限下读盘、建缓存;安装前请自行查看 GitHub 仓库 源码与 LICENSE,确认符合你的合规要求。社区目录 skillhub.cn 插件页 为独立收录站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-code-impact 把「改完再扫全仓」换成「索引里一次查询 + 增量 verify」,让智能体在 DSH 里用结构化结论回答「碰到了什么」。可从目录页了解收录信息,从 GitHub README(含 中文文档 README.zh.md)查看完整 API 与路由说明。

羽毛球分组比赛记分
小程序二维码

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

小夜