用 DSH 做一次代码审查
端到端实战:不深讲机制(机制见对应页面),带你照做一次。目标是用 DSH 审查一个仓库/一段代码,得到可执行的修改建议。
一、准备工作
- 已安装 DSH 并配好 key(见 快速上手)
- 一个你想审查的项目(本地目录即可)
dsh web # 启动 Web UI,在 /docs 选工作目录
你选的工作目录 = 之后
tool-fs/tool-bash的主要活动范围。
二、第一步:让 agent 摸清结构
在 Web UI 里输入(或用 headless 一次性任务):
用 tool-fs 列出这个项目的顶层结构;看有没有 package.json,有就读 dependencies;
然后用 bash 跑 git status 看看是不是干净的 worktree。
DSH 会依次调 fs(读文件)、bash(跑 git)。这一条消息验证了它能写会读会跑。
别只停留在顶层,再用目录扫描工具把结构铺开:
用 glob 列出 src 与 tests 下所有 .ts/.tsx 文件;
再用 grep 搜坏味道: TODO、FIXME、console.log、any、@ts-ignore;
命中的用 read 打开上下文,判断是历史遗留还是新问题。
glob/grep 由打包的 ripgrep 支撑(不依赖系统 rg)。glob 不含 / 的模式按文件名在任意深度匹配,且默认包含隐藏与 ignored 文件;grep 返回按文件分组的 Line N: <预览>,命中处要上下文就用 read 打开。
三、用子 Agent 并行拆审查
要查的多文件/多关注点时,别让主 agent 串行做:用子 Agent 并行:
把审查拆成 3 个子任务并行做:
1) 检查"依赖是否过期/有安全公告"(子agent-read packagelock + 搜索)
2) 检查"是否有明显安全漏洞"(注入/路径穿越/凭据泄漏)
3) 检查"结构问题"(重复代码、过深嵌套、职责混杂)
把每个的结果 report 给我汇总。
DSH 会开子 Agent 并行执行,最后汇总。完整委托模型见 子 Agent。
复查别让同一批结果自己验收——再开一个独立复查子 Agent,只核对前一批报告里标的高优先级条目:
开一个复查子 Agent:
只读前 3 个报告标出的"严重"文件,
逐条确认 文件/行/理由 是否属实,标 属实/存疑/不成立;
不要提新问题,把核对表 report 回来。
子 Agent 是独立会话、不污染主上下文;spawn 子会话默认看不到父会话历史,派发时给足任务描述,别指望它记得上文。
四、锁定权限与边界
审查会跑命令、读文件。按场景临时设预设:
把权限切到 workspace-write,之后每次要写/改都要问我的决定。
五、拿到结果并追问
汇总回来后,继续:
把最严重的 3 个问题各给:文件/行、为什么是问题、怎么改(带示例)。
最后写一个 REVIEW.md 放进项目根,清单式列出全部发现。
DSH 写文件前会因为 workspace-write 问你是否批准(或你已经允许)。
六、用 lsp 精确定位
文本搜索撞上同名符号/字符串时,用 lsp 做语义定位。它一个只读工具、四种操作:goToDefinition(跳定义)、findReferences(查引用,含声明处)、goToImplementation(查实现)、hover(看签名):
用 lsp 对 src/server.ts 的 handleRequest 做 findReferences,
列出所有调用点;再对入口那一处做 goToImplementation,
确认真正跑的是哪个版本。
坐标是1 起始的行/列(UTF-16),落在符号之外可能返回空结果;findReferences 永远包含声明行,做影响分析不会漏掉定义点。定位到具体行后再配合 read 看上下文。
七、用 str_replace_editor 精确改
审查结论落到修改时,一个工具同时管"看"和"改",避免在 read/edit 间来回:
用 str_replace_editor view 打开 src/util.ts 第 40 行附近;
把 fetch(url) 改成带超时的 request(url, {timeout: 5000});
再用 view 确认只有这一处被替换。
它提供 view / create / str_replace / insert 四个动作,路径用绝对路径;str_replace 要求 old_str 唯一匹配且没有 replace_all,插入用 insert(零基边界)。目录 view 会跳过隐藏/依赖/缓存目录、下探两层。
八、用 bash 跑测试验证
改完别只靠眼:让 agent 用 bash 跑针对性测试,把失败钉到具体用例:
用 bash 跑 pnpm test -- --runInBand;
把第一个失败用例的报错、所在文件/行贴出来,
先别修,等我看完再决定。
bash 与 read/glob 共享会话工作目录,相对路径按你选的工作区解析,测试、构建这类重命令都能原样跑。
九、复盘
- 想看某条建议基于的 DSH 历史?用工具 session_query(DSH 内核的工作区会话检索)
- 想长期追踪这些发现?用 待办 / 目标
小结
一个"代码审查"任务把 DSH 的这些能力串了起来:工具(fs/glob/grep/lsp)、子 Agent、权限、精确改与测试。你已经有一套能照做的端到端用法。想更自动,可把流程封装成 技能 或 工作流。