前言¶
在 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