前言¶
在 DeepSeek Harness(DSH)里做智能体或插件开发时,代码审查、覆盖率与 LLM 调用往往分散在不同脚本和 IDE 扩展里:审查结果难以结构化,覆盖率与变更不同步时也容易误放行。社区插件 dsh-test-guard(维护者 ZhaoZiyangShaanxi,分类:工作流)把测试感知上下文、多 Provider 路由、测试导向的代码审查和门禁判断收进同一个 Cordis 插件,供 Host 挂载后由宿主或前端适配器调用。当前为 0.1.0 预览版:核心服务可挂载并通过单元测试;审查面板尚未接入 DSH Web Client Slot,也没有 Git hook / CI 提交拦截器,gateCheck() 仅返回可由宿主执行的判断。
这是什么¶
dsh-test-guard 是面向测试开发工程师的 DSH Cordis 插件。简介为:Test-aware code review, coverage gating, and LLM routing for DeepSeek Harness。已实现智能路由、测试感知上下文管理、代码审查与审查质量门禁;测试生成在仓库中仍以 TypeScript 契约形式存在,面板上的生成按钮会走 test-gen 任务,但完整 DSH 界面集成需宿主自行挂载 ReviewPanel 并实现 ReviewPanelIde。
- 目录页:https://www.skillhub.cn/plugins/ZhaoZiyangShaanxi/dsh-test-guard
- 源码:https://github.com/ZhaoZiyangShaanxi/dsh-test-guard
- 许可证:MIT
核心功能¶
智能路由(ctx.smartRoute)¶
插件启动时注册 ctx.smartRoute。其他模块应通过 ctx.smartRoute.routeAndExecute(taskType, requestParams) 发起 LLM 请求。路由会过滤 enabled、健康状态和 taskTypes,再按较小的 priority 与最近十次平均延迟选择 provider;失败会尝试下一个候选,连续三次失败后熔断,每 60 秒 GET 健康检查,成功后解除熔断。审查走 review 任务类型;面板生成测试走 test-gen。endpoint 需为完整的 OpenAI 兼容 chat completions URL;空 providers 下调用审查会明确失败。
测试感知上下文(ctx.testAwareContext)¶
调用 ctx.testAwareContext.compressContext(messages, maxTokens) 压缩文本消息。测试代码、断言、错误堆栈、测试输出及当前编辑或选中文件内容得分 100、绝不裁剪;源码与配置文件高优先级;重复工具结果、长注释与闲聊优先删除。updateCoverageData() 可接收已解析的行覆盖率报告,提升含未覆盖行源码的优先级,门槛使用配置项 lowCoverageThreshold。
测试感知代码审查(ctx.codeReview)¶
典型流程:
await ctx.codeReview.getCurrentCodeChanges()取得带isTestFile的结构化变更(Git 可用时读暂存区、工作区与未跟踪文件;否则走宿主ctx.testGuardIdeChanges.getRecentFileDiffs())。- 可选:
await ctx.codeReview.loadCoverageReport('coverage/coverage-final.json')加载 Istanbul JSON。 await ctx.codeReview.review(changes)经smartRoute以review发出,返回summary、issues、affectedTests;无法解析的模型结果会报错,避免误判为「0 个问题」。ctx.codeReview.gateCheck(result)返回可序列化的status、allowed、覆盖率与阻断问题;严重问题位于未覆盖行、报告缺失或整体行覆盖率低于minLineCoverage时会拦截。
审查仅接受 TypeScript / JavaScript 源码与测试文件;.env 等非代码文件不会进入 diff。门禁会检查源码修改时间与报告时间,源码比报告新时会阻断并要求重新生成覆盖率。
审查面板(ReviewPanel)¶
宿主可挂载 new ReviewPanel({ codeReview, smartRoute, testAwareContext }, container, ide),订阅 onReviewed() 展示摘要与门禁;缺测 / 弱断言卡片可触发 test-gen 生成,确认后通过 IDE 的 writeTestFile() 写回。本仓库尚无 DSH Web Client Slot,实际产品需自行接入 Client Slot 与 ReviewPanelIde,分进程时需转发审查完成事件。
安装与启用¶
要求 Node.js 20+ 与 DSH(package.json 中 engines.dsh 为 >=0.2.1-rc.2 <0.3.0)。公开仓库安装命令如下:
dsh plugin --profile headless add github:ZhaoZiyangShaanxi/dsh-test-guard
dsh --profile headless --dump-config
源码依赖 prepare 编译 TypeScript。若 pnpm 拒绝运行构建脚本,将错误信息中的完整包键写入对应 profile 的 pnpm-workspace.yaml 的 allowBuilds 后重装;也可在本仓库执行 npm ci && npm pack,用生成的 .tgz 安装:
dsh plugin --profile headless add ./dsh-test-guard-0.1.0.tgz
不想授权源码构建时,可从 GitHub Releases 下载预编译的 dsh-test-guard-0.1.0.tgz 再 add。npm 发布后可直接 dsh plugin --profile headless add dsh-test-guard。
安装仅挂载服务,不会自动发出 LLM 请求。需在 profile 插件配置中为 providers 添加 OpenAI 兼容 endpoint、模型与任务标签(例如 review 用强模型,test-gen 用快模型)。密钥应通过部署环境注入,勿提交到 Git。当前补丁中 providers: [] 是安全的空配置。
典型用法(Host 侧)¶
审查与门禁的可复现顺序(摘自 README 约定):
const changes = await ctx.codeReview.getCurrentCodeChanges();
await ctx.codeReview.loadCoverageReport('coverage/coverage-final.json');
const result = await ctx.codeReview.review(changes);
const gate = ctx.codeReview.gateCheck(result);
// 前端可选:applyGateToControls(gate, { submitButton, statusText })
覆盖率报告应在本次代码变更后重新生成;CI 接入时宜在同一任务内先跑测试、再生成报告、最后执行门禁。
本地开发插件本身:
npm install
npm run typecheck
npm run build
npm test
适用场景与注意¶
适合在 DSH Host 中集成测试工作流、需要按任务类型路由多个 OpenAI 兼容模型、希望在审查 Prompt 中统一覆盖安全、性能、缺测、弱断言与覆盖率门禁的团队。插件以当前 DSH 进程权限运行,安装前应阅读源码与 MIT 许可证,并自行配置 provider 与密钥。
务必区分预览版边界:不要把 UI 演示组件当作已集成的 DSH 界面;gateCheck() 结果需由宿主或 CI 执行,仓库本身不提供 Git hook / CI 拦截器。
结尾¶
dsh-test-guard 把测试感知压缩、审查、覆盖率门禁与 LLM 路由放在同一 Cordis 插件里,便于在 DSH「一切皆插件」的生态中由宿主拼装测试开发工作台。问题与改进可通过 GitHub Issues 反馈。