前言¶
在 DeepSeek Harness(dsh)里跑编码智能体时,模型每个请求都会自动带上一批注入物:从 git 根到当前目录层层叠加的 AGENTS.md / CLAUDE.md、技能目录里每一条 name + description、当前可见的工具 schema,以及 MCP 服务器展开出来的工具面。这些内容常驻在输入里,计量条只能给出一个总数。重复段落、描述完全相同的技能、同名技能互相遮蔽,通常要等上下文告警才被注意到。
DeepSeek Harness 的设计原则是「一切皆插件」:界面、工具、压缩都可以替换。社区目录 deepseek-harness-plugin.com 是独立收录站,和 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。其中有一款界面增强插件专门做这件事:把常驻注入拆开,逐项估算 token,标出重复和冲突。
本文按插件目录详情页、GitHub README / package.json / agent-setup.md 与仓库源码交叉核对后整理:dsh-context-doctor 是什么、审计哪些对象、怎么安装、怎么用。
这是什么¶
dsh-context-doctor 是面向 DeepSeek Harness 的上下文注入审计插件。目录页归在「界面增强」,由 Zhenyu98 维护,仓库为 Zhenyu98/dsh-context-doctor。GitHub API 在 2026-08-17 显示 12 星;package.json 当前版本 0.5.0,许可证为 BSD-3-Clause(LICENSE、目录页与 GitHub 元数据一致)。主要语言是 JavaScript / TypeScript。
它解决的问题很具体:不要只看计量条上的一个数字,而是回答「指令链、技能目录、工具 schema、MCP 工具各自占多少」「哪些段落或技能描述完全重复」「同名技能谁胜出、谁被静默遮蔽」。审计路径只读,不改被检查的文件。
插件有两种入口,可以一起用:
- Web UI 里的
Context Doctor圆环面板,替代发送按钮左侧的上下文计量控件。 - 模型可调用的
context_audit工具,输出分节报告和按严重度排序的裁剪建议。没有 Web 界面时,工具仍然可用。
核心功能¶
圆环面板:常驻成本一眼能看¶
装好并重启 dsh web 之后,已有会话的发送按钮左侧会出现 Context Doctor 控件。圆环显示常驻上下文的估算 token(指令链 + 技能目录 + 工具 schema),颜色按仓库 README 给出的阈值分级:绿小于 10k、黄小于 30k、红大于等于 30k。
面板本身是英文等宽界面,指标和建议卡片用低饱和语义色;外层 DSH 外壳仍跟随浅色、深色或系统主题。点击后展开四组明细:Instruction chain、Skills catalog、Tool schemas、MCP tools,并提供手动刷新。数据走 GET /api/context-doctor/audit,host 侧默认缓存 60 秒。
新会话还没分配 sessionId 时,不会出现会话级控件。原生替代还要求当前 DSH 提供 conversation.input.context 插槽;没有该插槽的版本仍可调用 context_audit,只是看不到这块 UI。
四类常驻注入,外加可选的技能正文¶
README 把审计对象分成五类,前四类是每请求常驻成本:
| 注入物 | 统计什么 |
|---|---|
| 指令链 | 从 git 根到当前工作目录每一层的 AGENTS.md / CLAUDE.md:文件数、token 估算、跨文件完全相同的重复段落 |
| 技能目录 | ctx.skills 里全部技能的 name + description(模型每请求看到的 <available_skills>),按来源分组,并找出描述完全相同的冗余技能 |
| 工具 schema | ctx.tools.schemas 中当前 agent 可见的全部工具:数量、schema token,以及原生工具与 MCP 工具分组 |
| MCP 工具面 | 按服务器汇总 MCP 工具数与 schema token,用来识别工具面膨胀 |
| 技能正文(可选) | 前 N 个技能正文的总 token;按需加载,不计入常驻请求,用来对比「目录摘要」和「真正读正文」的成本差 |
冲突检测针对同名技能多来源并存:例如项目技能把 bundled 技能 shadow 掉时,报告胜出者与被遮蔽者(rank shadow)。
token 不是模型 tokenizer 的精确值。README 写明启发式规则:ASCII 约 4 字符/token,中文约 1.5 字符/token,用来做相对比较和排序;和计量条对不上时,以模型侧实际计数为准。MCP 工具 schema 目前只按 name + description 估算,不计入 JSON Schema 参数细节。指令链重复检测只认完全相同的段落块,换一种表述写同一条规则不会被标出来。
context_audit:报告可以直接拿去裁¶
模型调用 context_audit 后,得到一份 canonical JSON(AuditReport),原生渲染成五段可读报告:指令链、技能、工具、冲突、建议。建议按严重度排序,模型可以按条目去改文件、关技能或收工具面。
默认是摘要:成本、冲突、修复建议。加上 detail=developer 会多一张 context-audit receipt:已加载指令文件的路径、字节、token、加载顺序和重复块短预览;catalog 里每条技能的名称、来源、provider、描述字节;每个 tool schema 的序列化字节与签名;重复 MCP 签名;shadowed skill 关系。回执不含完整 prompt 或技能正文。
报告里的 trimmed 字段,当前版本固定为 unavailable。README 的说明是:只有 DSH 暴露上下文装配轨迹之后才会填条目,避免把看不到的状态写成「已经裁过」。
安装与启用¶
目录详情页上的安装命令是:
dsh plugin add github:Zhenyu98/dsh-context-doctor
dsh CLI 会从 GitHub 解析插件并装进当前配置。目录页同时提醒:如需可复现安装,应固定 commit 哈希,形式为 dsh plugin add github:Zhenyu98/dsh-context-doctor#commit。本文核对仓库时,main 最新提交是 a15e68d68f511db5ae4057c96ae1c727e21bf1b1(2026-08-17):
dsh plugin add github:Zhenyu98/dsh-context-doctor#a15e68d68f511db5ae4057c96ae1c727e21bf1b1
仓库 README / agent-setup.md 面向 Web UI 的写法带了 --profile web,并钉在 main 分支;git 源安装已包含构建产物,不必本机构建:
dsh plugin --profile web add "github:Zhenyu98/dsh-context-doctor#main"
dsh --profile web --dump-config | grep context-doctor
合成树里应出现类似下面的 insert 条目:
- insert:
- id: context-doctor
name: 'dsh-context-doctor'
然后重启 dsh web。成功信号有两个:已有会话的 composer 旁出现圆环,或新会话里模型调用 context_audit 返回分节报告。
agent-setup.md 列出的前置条件是:本机已安装 DeepSeek Harness(dsh 在 PATH 中,版本 ≥ snapshot0811 / 0.0.1-rc.1)。Node.js ≥ 22.19 只在开发 / 构建时需要。若 dsh plugin 报找不到 pnpm,需要先把 pnpm 放进 PATH——安装是显式的包管理操作。
也可以把仓库提供的安装说明交给 Codex、Claude Code、Cursor 或 DSH 里的 agent,让它按 agent-setup.md 执行;改文件、用凭据或跑破坏性命令前,应先看计划。
浏览器面板的默认审计目录和缓存可以写在配置里:
context-doctor:
defaultCwd: /path/to/project
cacheTtlMs: 60000
defaultCwd 缺省为进程启动目录;cacheTtlMs 缺省 60000 毫秒。
典型用法¶
模型直接调用工具即可。仓库给出的调用形式如下:
context_audit
context_audit cwd=/path/to/project
context_audit includeSkillBodies=true maxSkillBodies=20
context_audit detail=developer
不传参数时,审计当前会话工作目录。includeSkillBodies 会逐个加载技能正文,默认关闭;maxSkillBodies 默认 20。
README 中的报告结构示例(字段名与嵌套来自仓库,数值是文档里的示意,不是某次真实会话的测量结果):
{
"tool": "context_audit",
"version": 1,
"cwd": "/path/to/project",
"injected": {
"instructions": {
"files": [{ "path": "...", "bytes": 3421, "tokens": 812 }],
"totalTokens": 812,
"duplicateBlocks": []
},
"skills": {
"catalogCount": 177,
"catalogDescriptionTokens": 4150,
"bySource": [],
"duplicateDescriptions": []
},
"tools": {
"visibleCount": 42,
"schemaTokens": 9800,
"nativeCount": 38,
"nativeTokens": 6100,
"mcp": {
"servers": [{ "server": "github", "tools": 12, "schemaTokens": 2400 }],
"totalTools": 12,
"totalTokens": 2400
}
}
},
"conflicts": [],
"suggestions": []
}
没有 Web 时,把插件挂到 headless profile 后直接让模型调用 context_audit 即可。源码在没有 webServer 服务时会跳过 HTTP 路由注册,工具不受影响。
圆环不出现时,按 README 的顺序排查:是否已重启 dsh web、是否进入已有会话的 composer、dump-config 是否含 context-doctor。原生替代还依赖 conversation.input.context 插槽;改过插件源码必须重新执行 ./scripts/build.sh。
适用场景与注意事项¶
适合已经在 DSH 里堆了多层 AGENTS.md、大量技能和 MCP 服务器,计量条发红却说不清预算花在哪的人。也适合维护共享项目指令、给智能体做环境体检:先看常驻 catalog 有多贵,再决定要不要打开 includeSkillBodies 对比正文成本。只跑 CLI / headless 的用法同样成立,只是没有圆环。
使用前要接受这些边界(均来自 README 的 v0.5 说明与安全章节):
- 审计只读:只用
ctx.fs的 read / stat / list,不写、不删、不执行被审计对象。 - 单文件超过 256 KB 会跳过,避免审计器被大文件拖垮。
- 报告只含路径、统计和重复段落片段,不含完整文件内容;技能正文默认只在显式打开时统计总量,仍不输出正文。
- 重复检测不做语义相似度;MCP schema 估算不含参数 JSON Schema。
- token 是启发式估算,用来排优先级,不能当计费依据。
目录页写明:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前应检查源代码仓库和许可证;需要可复现安装时,固定 commit 哈希,不要长期钉在浮动的 main 上。
小结¶
dsh-context-doctor 把「上下文很满」拆成可以逐项核对的账单:指令链、技能目录、工具 schema、MCP 工具面各占多少,哪些完全重复,同名技能谁被遮蔽。Web 圆环负责日常扫一眼,context_audit 负责给出能执行的裁剪建议;审计本身保持只读。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-context-doctor/
GitHub:https://github.com/Zhenyu98/dsh-context-doctor