前言¶
在 DSH 里排查一个会话时,现场信息通常散在会话日志、失败命令和仓库差异里。直接把上下文贴出去,又可能把凭证带出去。dsh-repro 用来处理这个折中:它从当前会话读取完整 canonical log,对疑似凭证做值级清理,收集失败命令和 git diff,最后写成一个可传递、可后续回放的问题包。
下面介绍这个插件的定位、安装方式、核心行为和已知边界。
这是什么¶
dsh-repro 是一个 DeepSeek Harness 插件,由 EvilIrving 维护,许可证为 MIT。
它提供一个 /repro 命令,用于导出一个最小化、已清理秘密、可回放的问题包。
核心功能¶
提供 /repro 命令¶
插件提供如下斜杠命令:
/repro [output directory]
运行后,命令会返回一条一行成功信息,说明写出的 bundle 路径。bundle 内容不会被注入到模型上下文里。
读取当前会话日志¶
它会通过 sessionPersistence.inspect 读取当前会话的完整 canonical log。
输出中的 events 是从 seq 0 开始的连续完整日志,后续可以通过:
ctx.sessions.create(id, { seed })
进行回放。
逐值清理秘密¶
默认清理策略是 fail-closed:看起来像凭证的字符串会被 redact,而不是直接放行。
清理规则覆盖三类 credential-shaped values:
1、按 key pattern 命中的对象键。
2、以已知 token 前缀开头的字符串。
3、高熵长串。
相关默认配置项包括:
minHighEntropyLength: 20
gitDiffMaxBytes: 256 KiB
gitGraceMs: 5000
收集失败命令与 git diff¶
插件会收集失败命令,并附带一份 git diff。
如果 subprocess 不可用,或当前目录不是 git 仓库,git diff 会退化为空字符串。
输出清单¶
最终写出的文件名是:
repro-<sessionId>.json
它包含清理后的完整 canonical log、失败命令和 git diff。
安装与启用¶
从 GitHub 安装:
dsh plugin --profile <name> add github:EvilIrving/dsh-repro
从本地 checkout 安装:
dsh plugin --profile <name> add ./dsh-repro
安装命令中的 <name> 是 profile 名占位符,需要替换为实际 profile 名。
bundle patch 会插入一行插件记录(dsh-repro)。它需要 commands 和 sessionPersistence 服务,基础 profile 已经挂载这些服务。
典型用法¶
1、在一个出现问题的 DSH 会话里运行:
/repro [output directory]
2、查看返回的一行成功信息,拿到 bundle 路径。
3、将 bundle 作为问题材料传递;它包含整理后的 canonical log、失败命令和 git diff。
如果需要复用会话现场,后续可以使用:
ctx.sessions.create(id, { seed })
进行回放。这不是 /repro 本身执行的 CLI 命令。
适用场景与注意¶
适合需要把 DSH 会话问题压缩成可传递材料、同时避免把明文凭证带出去的场景。
注意:
commands和sessionPersistence是硬依赖(inject)。subprocess是可选依赖;缺失或 cwd 不在仓库中时,git diff为空字符串。- v1 只做导出,不包含 replay CLI;
dsh repro run <bundle>是独立的 process-level seam,不在/repro范围内。 - v1 的 bundle 写入绕过 sandboxed
ctx.fsseam,直接使用node:fs/promises;路由到ctx.fs被推迟。 - 不做 oversized-artifact 内联;spill artifacts 只通过 locator 引用,不做文件字节内联。
- DSH 插件以当前 dsh 进程权限运行;安装前请检查源码与许可证。本项目许可证为 MIT。
结尾¶
dsh-repro 的价值在于把当前会话日志、失败命令和 git diff 整理成一个带秘密清理、可后续回放的问题包。
GitHub 仓库:https://github.com/EvilIrving/dsh-repro