← 返回列表
未验证
改完文件立刻跑类型检查与 lint,把报错喂给模型
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/14 · 已提供中文文档
DeepSeek Harness 的编辑后诊断
综合分
26.6
GitHub 分
26.6
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add ben7am1n/dsh-lens-lite该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-subprocess@deepseek-ai/dsh-subprocess-local@deepseek-ai/dsh-timeout@deepseek-ai/dsh-tools用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-lens-lite
用于 DeepSeek Harness 的编辑后诊断。
在文件修改类工具成功执行后,本插件会针对该文件扩展名运行你配置的检查器,并将其输出作为模型可见上下文附加到同一个工具结果上。因此,下一次模型请求就已经携带了本次编辑引入的类型错误或 lint 发现,而不是让模型在几轮之后才发现它们。
dsh-lsp 覆盖语义导航(定义、引用、悬停)。它不会呈现诊断信息,而且随附的 harness 中没有任何组件会在编辑后运行类型检查器。本插件填补了这一空白。
安装
dsh plugin --profile web add dsh-lens-lite
然后在你 profile 的 cordis.patch.yml 中覆盖该行,填入你的工具链实际拥有的检查器(随附的行中没有任何检查器——参见配置)。
行为方式
- 仅在成功调用被监视工具(默认为 write、edit、str_replace_editor)之后运行。
- 从工具规范的 path 值中获取被编辑的路径——即文件系统后端实际解析出的路径——对于未声明该值的工具,则回退到 file_path 参数。
- 并发运行所有声明支持该文件扩展名的检查器。
- 当所有检查器都以配置的干净退出码退出且没有输出时,不附加任何内容。
- 从不否决,也从不重写调用。 它先委托 tools/post-execute 瀑布流,然后仅将上下文折叠到返回的任何决策上,保留每个下游上下文自身的来源和元数据。
- 当下游监听器阻止了该调用时,完全跳过 lint——该被阻止的调用已经是模型必须响应的反馈。
- 遵循工具调用的取消信号,并在检查器自身的超时到期时终止其整个进程树。
发现结果以 notice 形式的插件上下文到达,因此转录中显示的是折叠的一行摘要,而不是一大片编译器输出。
配置
每个因部署而异的值都是配置字段。本插件不附带任何内置命令:存在哪些检查器是你工具链的属性,而不是本包的属性。
- id: lens-lite
name: dsh-lens-lite
config:
tools: [write, edit, str_replace_editor]
maxDiagnosticChars: 4000
checkers:
- name: tsc
extensions: ['.ts', '.tsx']
argv: ['npx', '--no-install', 'tsc', '--noEmit']
cwd: '.'
timeoutMs: 60000
- name: eslint
extensions: ['.ts', '.tsx', '.js', '.jsx']
argv: ['npx', '--no-install', 'eslint', '--format', 'compact', '{file}']
cleanExitCodes: [0]
- name: ruff
extensions: ['.py']
argv: ['ruff', 'check', '--output-format', 'concise', '{file}']
- name: go-vet
extensions: ['.go']
argv: ['go', 'vet', '{dir}']
streams: [stderr]
检查器字段
| 字段 | 默认值 | 含义 |
|---|---|---|
| name | —(必填) | 显示在模型上方、此检查器输出之上的标签 |
| extensions | —(必填) | 此检查器声明的小写、带前导点的扩展名 |
| argv | —(必填) | 可执行文件 + 参数。argv[0] 依据子进程提供者的已清理 PATH 解析。绝不经过 shell 解释 |
| cwd | . | 工作目录,依据 harness 进程目录(你的工作区根目录)解析 |
| timeoutMs | 30000 | 墙钟时间上限;到期时进程树会被终止 |
| graceMs | 2000 | 该终止的 SIGTERM→SIGKILL 宽限期 |
| maxOutputBytes | 65536 | 每个收集流的内存上限;溢出时保留尾部 |
| cleanExitCodes | [0] | 表示“无发现”的退出码 |
| streams | [stdout, stderr] | 哪些流携带发现,按拼接顺序 |
argv 条目支持三个占位符,每次运行时替换:
| 占位符 | 值 |
|---|---|
| {file} | 被编辑文件的绝对路径 |
| {relFile} | 该路径相对于 cwd 的路径 |
| {dir} | 其所在目录 |
插件字段
| 字段 | 默认值 | 含义 |
|---|---|---|
| tools | [write, edit, str_replace_editor] | 其成功结果会被检查的工具名称 |
| checkers | [] | 检查器,全部都会被咨询;为空表示插件不执行任何操作(加载时说明一次) |
| maxDiagnosticChars | 4000 | 每个结果中模型可见诊断文本的上限;溢出时保留头部,因为第一个错误通常是其余错误的原因 |
成本
全项目检查器会在每次编辑时运行。在大型仓库上运行 npx tsc --noEmit 可能为每次写入增加数秒。在工具支持的情况下,优先使用单文件调用({file}),并且只对确实需要它的检查器提高 timeoutMs。
失败行为
加载时配置错误会大声失败:空的 argv、检查器未声明任何扩展名或未读取任何流、重复的检查器名称,或非正数上限,都会在插件加载时抛出。
环境失败不会使编辑失败——调用已经成功——而是变为发现:
- 无法解析的可执行文件会报告一次为 checker unavailable: …,然后该检查器在此 fiber 的剩余生命周期内保持静默。
- 超时会报告为 checker timed out after Nms。
- 生成级失败会报告为 checker failed to start: …。
扩展点
在 tools/post-execute 上有一个监听器,外加用于生成的 ctx.subprocess。无需核心更改,无需 agent 循环更改。
开发
pnpm install --ignore-workspace
pnpm run typecheck
pnpm test
pnpm run build
测试套件针对真实的本地子进程提供者驱动真实的 tools/post-execute 瀑布流,使用 node -e 程序作为检查器,因此它覆盖了实际的生成、退出码分类、流选择和超时,而无需任何工具链。
许可证
MIT
现有技术
编辑后反馈这一想法来自 Pi 生态系统中的 pi-lens(MIT)。这是一个针对 Harness 扩展点的独立实现,与其不共享任何代码;它有意只覆盖“编辑后运行检查器”这一部分,而不涉及 pi-lens 的 AST 规则、依赖映射或分诊系统。扫码进群