/backstory 命令与工具:为每一行标注最后改动它的 git 提交,以及写下它的 agent 轮次与提示词;数据取自按行持久化的账本(以内容哈希防漂移)、DSH-* 提交尾注或实时会话日志。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-backstory
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:MeghanBao/dsh-backstory
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English · 中文
给任意一行代码问一句它的来龙去脉——它做什么,以及为什么在这儿。

一个 DeepSeek Harness(dsh)插件。
git blame 告诉你一行是谁、什么时候写的;dsh-backstory 补上真正重要的那部分——
面对陌生代码时你想知道的:它做什么、为什么存在——依据是最后改动它的那次提交,
外加 agent 自己的历史:哪一轮写了这行,以及触发它的那句 prompt。
L1 · a5d49e9 … 🧬t14
export const greeting_de = "Willkommen"
🧬 origin · turn 14 — you asked: "支持德语双语" [ledger-hash]
和别的有什么不一样
git blame→ 谁 / 何时 / 哪次提交。dsh-backstory→ 这行做什么 + 为什么在这儿,一处给全。- 不是泛泛的"解释这段代码"(任何 LLM 都能干)。这里的 why 来自真实的仓库历史 和 agent 历史,所以答案是有据可依的,不是猜的。
- 当是 agent 自己写的这行时,它给出
git blame永远给不了的 dsh 原生溯源—— 哪一轮写的、你当时说了什么——精确到每一行(🧬t14)也精确到文件。
溯源:三层
每一行按"哪个来源最精确"依次归属:
- Ledger 内容 hash(
[ledger-hash])—— 每次 write/edit 都被记录到仓库内提交的.dsh/backstory.jsonl,带上被改动行的内容哈希。按文本匹配,所以一行在文件里 上下移动(行号漂移)也照样命中。跨 session、跨机器、跨人持久保留。 - Commit trailer(
[commit])—— 一旦带着DSH-Turn/DSH-Prompttrailer 提交,git blame → sha → trailer就能还原溯源,而且漂移由 git 自己处理。 - 实时 session 日志(
[session])—— 当前 session 里、东西还没落进 ledger 之前, 从exec.agent.session.events重建。
三层都会优雅降级:没有 ledger、没有 trailer、甚至没有 git,你依然能拿回源码行。
安装
同一套引擎,两种用法。
作为 MCP server —— 任意 MCP 客户端(Claude Code、Cursor……)
无需 DeepSeek Harness。把客户端指向 backstory-mcp 二进制即可,它通过 stdio 走
Model Context Protocol,暴露 backstory 和 backstory_remember 两个工具。Claude Code:
claude mcp add backstory -- npx -y dsh-backstory
或直接写进任意客户端的 MCP 配置:
{
"mcpServers": {
"backstory": { "command": "npx", "args": ["-y", "dsh-backstory"] }
}
}
在你想查询历史的那个仓库目录下运行 —— 服务器会相对于工作目录读取 git 和 .dsh/
账本。独立服务器用的是 git 原生溯源(commit trailer + 已提交的账本);实时的「按 turn」
会话来源是下面 dsh 插件独有的。
作为 DeepSeek Harness 插件
dsh plugin add dsh-backstory
安装后,dsh 宿主会应用 package.json 里声明的 bundle patch
(dsh.bundle.patch → cordis.patch.yml),把插件插入运行中的
composition,无需额外接线。
从源码本地开发
git clone https://github.com/MeghanBao/dsh-backstory.git
cd dsh-backstory
npm install
npm run typecheck # tsc --noEmit
npm test # blame 解析、provenance、ledger、hash 归属、git e2e
npm run build # 把 MCP server 编译到 dist/(backstory-mcp 二进制)
npm run mcp # 从源码通过 stdio 运行 MCP server
独立的 cordis.yml 只加载 dsh 插件,方便本地迭代。
用法
直接输入 /backstory 命令,可带文件和行范围:
/backstory src/auth.ts:40-60
/backstory utils/date.ts
或用自然语言问 agent(用的是同一个 backstory 工具):
- "
src/auth.ts第 88 行的来龙去脉是什么?" - "解释
utils/date.ts10–40 行,以及每部分为什么在那儿"
工具会返回每一行 + 最后改动它的提交(作者、日期、信息),以及——若已知——写下它的
agent 轮次/prompt(🧬t<turn>)。agent 用代码本身讲做什么,用提交信息 + 溯源讲
为什么。不在 git 仓库里时优雅降级为只给源码。
工具:backstory
| 参数 | 类型 | 说明 |
|---|---|---|
path |
string(必填) | 绝对路径或相对工作区路径 |
line |
number | 起始行(1 起);省略则读整个文件 |
endLine |
number | 结束行;默认等于 line |
整文件读取上限 400 行。
Ledger 与 commit trailer
插件通过 tools/post-execute 观察器自动把每次 write/edit 记录到
.dsh/backstory.jsonl——把这个文件提交,溯源就随仓库走。
若想再把溯源锚进 git 历史(漂移交给 git 处理),每个 clone 装一次
prepare-commit-msg 钩子:
npm run install-hook
之后每次提交都会把暂存文件对应的最新 ledger 记录自动折进 trailer:
DSH-Turn: 14
DSH-Prompt: 支持德语双语
DSH-Session: 0f3a…
钩子是尽力而为(绝不阻断提交)、幂等(--amend 也安全)、删掉即停用;若已有同名钩子
会备份为 *.backup。
增量解释
解释一行要花一次模型调用,所以解释会被缓存。agent 解释完 backstory 结果里
unexplained 的那些行后,调用 backstory_remember 把它们存下来——按每行的内容 hash
存进 .dsh/backstory-notes.jsonl。下次未改动的行会直接带着 explanation(↳)返回,
只有文本变了的行才需要重新解释。省钱,且永不过时。
隐私:脱敏与 opt-out
prompt 会存进 ledger(并经钩子进 commit trailer),所以在写入前会自动脱敏常见密钥——
OpenAI / GitHub / AWS / Slack / Google 密钥、JWT、Bearer token,以及
password / token / secret / api_key 这类 键=值 会被替换成 [REDACTED]。
用 .dsh/backstory.config.json 可关闭记录或加自定义规则:
{ "record": true, "redactPatterns": ["ACME-\\d+"] }
或用环境变量全局关闭:DSH_BACKSTORY_DISABLE=1。
⚠️ 脱敏是尽力而为的模式匹配,不是保证——push 前先看提交,敏感内容直接 opt-out。
路线图
- v0.1 — git 历史 backstory:行 → 提交 → what/why。✅
- v0.2 — dsh 原生半边:从实时 session 日志重建哪一轮写了文件 + 触发的 prompt(文件级)。✅
- v0.3a — 持久化行级 ledger:每次 write/edit 记进
.dsh/backstory.jsonl(轮次、prompt、被改动行、内容 hash);跨 session/机器/人保留。✅ - v0.3b — 抗漂移归属:按内容 hash 匹配行,行移位也不丢溯源。✅
- v0.4 — git 原生溯源:
DSH-*commit trailer,经git blame → sha → trailer还原,漂移交给 git;外加prepare-commit-msg钩子安装器(npm run install-hook), 自动把 ledger 记录折进 trailer。✅ - v0.5 — 隐私:存储的 prompt 自动脱敏密钥 +
.dsh/backstory.config.json/DSH_BACKSTORY_DISABLE的 opt-out。✅ - v0.6 —
/backstory用户命令(注册为 dsh skill),带 file:line 参数驱动工具。✅ - v0.7 — 增量解释:按内容 hash 缓存逐行解释(
backstory_remember→.dsh/backstory-notes.jsonl),只重解释变动的行。✅ - v0.8 — 独立 MCP server(
backstory-mcp):同一套引擎通过 Model Context Protocol 暴露,任意 MCP 客户端(Claude Code、Cursor……)都能用backstory/backstory_remember,无需 dsh。复用 git 原生核心,编译到dist/并发布到 npm。✅
状态
针对 dsh 开发者预览版构建——API 可能变动。blame 解析、provenance 引擎、ledger、
hash 归属、git-blame 与 commit-trailer 路径共 43 个测试覆盖(纯逻辑 + 对真实临时仓库
的 e2e)。所有运行时接触点(exec.agent.session.events、tools/post-execute 记录器)
都做了防御处理并优雅降级,工具不会崩。
许可证
MIT © Meghan Bao
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-git-graph★ 8440
输入框上方提供 Git 分支选择器,并把分支泳道与提交历史画成图谱,沿着时间线找到任意变更。
Akimiya-z/codex-guard#dsh★ 138
在 DeepSeek Harness 内做提交前的 Pull Request 卫生检查:扫描当前改动中的 TODO 残留、硬编码密钥与非规范提交信息。
Cerbur/clutch-dsh#clutch-dsh-worktree★ 30
为 DSH Web UI 增加按 Git Worktree 组织 Session 的视角,同时继续由 DSH 管理原始 Project 和 Session 数据。
lehhair/dsh-diff-viewer★ 26
PiUI 风格 diff 查看器,替换 write/edit 工具调用的默认 DiffBlock。
DamonKoy/dsh-web-ui#dsh-git-graph★ 23
dsh web GUI 会话头部栏的 Git 分支选择器与提交图。
PerryLink/dsh-github★ 23
官方级 GitHub CI 集成:composite action.yml、轮询 PR 评审机器人(幂等行内评论 + status-check 门禁)以及 PR/issue 工具,所有写入走人工审批门。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。