← 返回列表
✓ 可直接安装
🧪 dsh-test-drive
自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node ^22.19.0 || >=24.0.0);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/16 · 已提供中文文档
DeepSeek Harness 插件的隔离式安装与冒烟测试驱动:将仓库或 npm 包安装到一次性的 DSH_HOME 配置文件中,验证 bundle 补丁层和启动日志,为评分流水线记录结构化的通过/失败结果矩阵(JSON/Markdown),并隔离其拥有的每个临时目录
综合分
35.4
GitHub 分
35.4
用户评分
—
★ Stars
8
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-test-drivenpm 包 dsh-test-drive 已校验归属本仓库,走 npm 安装最省事
数据截至 2026/9/17(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-test-drive @ 0.3.12
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 02:57:25
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment@deepseek-ai/cordis@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-commands@deepseek-ai/dsh-jobs@deepseek-ai/dsh-jobs-local@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-storage@deepseek-ai/dsh-storage-domain用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
🧪 dsh-test-drive
- 1024 store channel: npm i -g dsh1024 once, then dsh1024 plugin --profile web add dsh-test-drive (counts toward the deepseek1024.com install ranking).
Gitee
为 DeepSeek Harness 插件提供隔离的安装与冒烟测试试驾。
在一次性配置文件中安装、冒烟、验证并清理——你真实的 ~/.dsh 保持原封不动。
License
DSH plugin
dsh-doctor
Node
CI
Version
npm version
npm downloads
English · 简体中文 · Español · Português · हिन्दी
兼容性
| 组件 | 版本 |
|---|---|
| DeepSeek Harness | dsh-v0.1.5-rc.2(GitHub 标签,2026-09-11 验证:完整门禁链 + 配置文件安装冒烟)。npm 依赖行 0.1.2-rc.1 和 0.1.5-rc.2(peer 依赖 >=0.1.2-rc.1 =0.1.5-alpha.1 =24.0.0 |
| 包管理器 | pnpm@11.7.0 |
| 平台 | Windows / macOS / Linux(仅宿主插件) |
| 外部工具 | PATH 上的 dsh CLI(自动检测,解析 npm shim),PATH 上的 pnpm |
你将获得
- test_drive 工具——让一个目标走完完整流水线:dsh plugin add → --dump-config 补丁检查 → 无头启动冒烟(FAILED 标记扫描 + 可选一次性任务)→ 可选能力断言 → dsh plugin remove → 隔离清理。同步返回结构化记录,或返回 { kind: 'background', jobId } 并带 background: true。
- /testdrive 命令——将空白/逗号分隔的目标列表作为 drive-batch 后台任务通过 ctx.jobs 批量试驾,生成矩阵报告(JSON + Markdown)。
- drive_report 工具——获取任意已存储的运行(tdr_...)、矩阵(tdm_...)或最新矩阵;以 Markdown 渲染。
- 能力断言——超越“已启动并退出”:可选的 capability 阶段会驱动一个无头任务,该任务调用一个具名工具(或运行一个 /command),并验证持久会话日志记录了该调用,且观测到的输出包含 expect。干净启动只是一次冒烟测试;observed 证明某个具名能力确实可用。
- 结构化结果——每条记录都带有判别字段 schema: "dsh-test-drive/v1",并包含一等字段:stages.install.status(pass/fail)、stages.smoke.status(pass/fail/boot-ok/skipped)、stages.capability.status(observed/invoked/not-registered/skipped/failed)、各阶段的 durationMs、经脱敏的 summary/outputTail,以及总体 verdict(pass/fail/partial/unknown)。这是下游评分器(dsh-score)所消费的机器可读契约。
- 构造即安全——每个临时目录都由本插件在专用的 dsh-test-drive- 前缀下创建,记录在实时所有权注册表中,并且仅通过 dry-run → 隔离重命名 → 删除的阶梯式流程移除。宿主 profile 从不读取或写入。
快速开始
Git 渠道
dsh plugin --profile web add github:PerryLink/dsh-test-drive#
首次 add 会失败,因为 pnpm 阻止了该包的 prepare 构建;将 pnpm 打印出的确切键复制到该 profile 的 pnpm-workspace.yaml 中,然后重新运行:
allowBuilds:
'dsh-test-drive': true
npm 渠道
dsh plugin --profile web add dsh-test-drive
预构建包无需构建许可。重启 profile,然后在会话中使用 test_drive / /testdrive。
安装与卸载
dsh plugin --profile web add dsh-test-drive # install (npm) — or the git form above
dsh plugin --profile web remove dsh-test-drive # uninstall
配置
所有键均为可选(显示默认值);无效值会在加载时明确报错。
| 键 | 默认值 | 描述 |
|---|---|---|
| profileName | headless | 在每个一次性 DSH_HOME(基础包 + 无头包)内初始化的 profile 模板。 |
| dshBin | "" | 绝对 dsh 可执行文件覆盖路径;为空时自动检测 PATH 上的 dsh。 |
| headlessTask | "Reply with exactly: ok" | 用于启动冒烟阶段的一次性任务;为空则跳过该阶段。 |
| forwardEnv | [] | 转发到测试 profile 子进程的环境变量名(绝不转发值)。 |
| allowBuilds | true | 在测试 profile 中允许被阻止的 git prepare 构建,并重试安装一次。 |
| installTimeoutMs | 600000 | dsh plugin add 阶段截止时间。 |
| configTimeoutMs | 60000 | --dump-config 阶段截止时间。 |
| smokeTimeoutMs | 300000 | 无头启动冒烟阶段截止时间。 |
| capabilityTimeoutMs | 300000 | 能力断言任务截止时间。 |
| capability.enabled | false | 运行能力断言阶段(已注册 → 已调用 → 已观测)。 |
| capability.kind | tool | 要断言的内容:tool 或 command。 |
| capability.name | "" | 工具或命令名称(不带前导 /)。 |
| capability.args | "" | 调用文本:工具参数(类 JSON)或命令词。 |
| capability.expect | "" | 在观察到的输出中期望出现的字面量(不区分大小写的子串)。 |
| uninstallTimeoutMs | 120000 | dsh plugin remove 阶段的截止时间。 |
| outputTailBytes | 8000 | 每个阶段记录的已清理输出尾部的上限。 |
| keepTempDirs | false | 失败时保留临时目录以供取证(所有权被丢弃;由你清理)。 |
| maxBatchTargets | 20 | /testdrive 批处理上限。 |
| batchConcurrency | 1 | 批处理并发数(串行可避免 pnpm-store 争用)。 |
工具与界面
test_drive
test_drive(target: string, headlessTask?: string, background?: boolean,
capability?: { kind: 'tool' | 'command', name: string,
args: string, expect: string })
- target — git 规格(github:owner/repo#sha、git+https://...)、npm 名称、本地路径或 .tgz tarball。
- capability — 启动冒烟测试后的断言:agent 调用 name(工具)或运行 /name(命令)并传入 args;该阶段读取持久会话日志,并要求观察到的输出包含 expect。需要 DEEPSEEK_API_KEY(宿主环境或 forwardEnv);没有它时该阶段为 skipped,绝不会失败。
- 返回完整的结构化记录;参见下方示例。
- background: true 启动一个 drive-batch 作业并返回其 id。
/testdrive
启动一个后台批处理作业;进度通过作业输出流式传输,最后一行给出用于 drive_report 的矩阵 id。
drive_report(id?)
返回一条运行记录(tdr_...)、一个矩阵(tdm_...),或者——不带 id 时——返回最新的矩阵。
结构化结果示例
{
"schema": "dsh-test-drive/v1",
"run": { "runId": "tdr_9f2c...", "startedAt": "2026-08-16T00:00:00.000Z",
"finishedAt": "2026-08-16T00:00:45.120Z", "durationMs": 45120,
"harnessVersion": "0.1.5-rc.2", "pluginVersion": "0.3.12",
"platform": "win32", "node": "v22.22.3" },
"target": { "kind": "repo", "spec": "github:owner/dsh-click#abc123",
"resolved": { "packageName": "dsh-click", "packageVersion": "0.1.0",
"hasBundleManifest": true } },
"isolation": { "tempDshHome": true, "tempWorkspace": true, "tempStore": true,
"hostHomeTouched": false },
"stages": {
"install": { "status": "pass", "exitCode": 0, "durationMs": 30412, "attempts": 2,
"summary": "install ok after allowBuilds allowance", "outputTail": "",
"allowBuildsNeeded": true },
"config": { "status": "pass", "exitCode": 0, "durationMs": 2310, "attempts": 1,
"summary": "dump ok (exit 0)", "outputTail": "",
"patchEffective": true, "layers": ["dsh-click"] },
"smoke": { "status": "boot-ok", "exitCode": 1, "durationMs": 4123, "attempts": 1,
"summary": "在没有加载器故障的情况下启动;无头任务未完成(凭据/模型不可达)",
"outputTail": "", "bootFailed": false, "taskCompleted": false },
"capability": { "status": "observed", "exitCode": 0, "durationMs": 8123, "attempts": 1,
"summary": "工具 \"plugin_vet\" 被调用,且其结果包含预期",
"outputTail": "", "capabilityKind": "tool", "name": "plugin_vet",
"expectMatched": true,
"detail": "工具 \"plugin_vet\" 被调用,且其结果包含预期" },
"uninstall": { "status": "pass", "exitCode": 0, "durationMs": 5123, "attempts": 1,
"summary": "移除成功(退出码 0)", "outputTail": "" },
"cleanup": { "status": "pass", "quarantined": true, "removed": true,
"summary": "自有临时根目录已隔离并移除" }
},
"verdict": "pass",
"verdictReason": "安装、补丁、启动和卸载已验证;无头任务无定论(见 smoke.summary)"
}
判定规则:安装失败、启动失败(smoke.fail),或某个能力阶段达到 not-registered/failed ⇒ fail;安装通过 + 补丁生效 + 干净启动(pass/boot-ok)+ 卸载通过 ⇒ pass(当为 observed 时附带能力说明);任何已安装但缺少后续保证的情况 ⇒ partial;否则为 unknown。
CI(GitHub Actions)
该仓库附带一个复合的 action.yml,可在任何插件仓库中复用 dsh-test-drive。它会在一个隔离的一次性配置文件中驱动目标,并输出 CI 所消费的报告对:Markdown(PR 评论)和 JUnit XML(测试报告器/状态检查)。
yaml
.github/workflows/test-drive.yml
name: test-drive
on: [pull_request, workflow_dispatch]
jobs:
smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Drive this plugin
id: drive
uses: PerryLink/dsh-test-drive@v0.2.4
with:
target: github:${{ github.repository }}#${{ github.sha }}
- name: Publish JUnit
uses: EnricoMi/publish-unit-test-result-action@v2
with:
files: ${{ steps.drive.outputs.junit }}
- name: Comment the report
run: cat "${{ steps.drive.outputs.markdown }}"
action.yml 输入:target(必填)、headless-task(可选的无头冒烟任务)、dsh-version(dsh CLI 规格)。输出:markdown、junit(报告路径)以及 verdict(pass/fail/partial/unknown)。驱动本身保持无密钥(安装 → 补丁检查 → 启动冒烟 → 卸载 → 清理);能力断言是唯一需要 DEEPSEEK_API_KEY 的阶段,且在没有该密钥时会被 skipped,而绝不会失败。
同一份报告对也可通过编程方式获得:renderDriveResult / renderMatrix(Markdown)和 renderDriveJUnitXml / renderMatrixJUnitXml(JUnit)从包根导出,作用于已完成的 DriveResult 或 MatrixRecord。
权限与数据
- 仅消费公共服务:ctx.subprocess、ctx.jobs、ctx.storageDomain、ctx.tools、ctx.commands。
- 报告存储在 test_drive 存储域中(表 runs、matrices;最新矩阵指针)。当组合中没有 storageDomain(例如随附的无头配置)时,工具仍可工作,但报告持久化会被禁用并记录原因。
- 子进程继承经过凭据清理的环境:除非你在 forwardEnv 中显式指定,否则主机密钥永远不会到达被测配置。值永远不会被记录。
- 所有报告/日志字符串都会经过纯净化器处理:令牌字面量、URL 凭据和 bearer 头会被脱敏,临时根路径会被替换为 ,尾部内容按字节数截断。
安全边界
- 隔离。 每次 drive 都在操作系统临时目录下的全新 mkdtemp 根中运行:一次性的 DSH_HOME、一次性的工作目录,以及重定向的 pnpm store。被测插件的代码只会在该配置中运行;你的主机配置不受影响。
- 所有权。 一个实时注册表记录此插件实例创建的每个根。清理会拒绝任何不是操作系统临时目录下、带有 dsh-test-drive- 前缀的已注册直接子项的内容——不进行 %TEMP% 全盘扫描,不处理外来前缀,不涉及真实主目录路径。
- 清理阶梯。 在任何变更之前,完整的 dry-run 计划会被记录(绝对路径)。删除会先将根重命名为 dsh-test-drive-quarantine- 目录,验证后再删除;失败时目录会保持隔离并上报,绝不会被静默丢弃。清理会在成功、失败、超时和中止时的 finally 中运行,并在插件拆除时再次运行。
- allowBuilds 是一项真实权限。 允许 git 包的 prepare 构建会在安装时执行该包的代码。该许可仅限定于一次性配置,但只测试你信任的目标,并固定提交。
- 无头冒烟测试默认无需密钥。 启动检查不需要凭据;完成一次性任务则需要。显式转发凭据(forwardEnv),并且永远不要记录它们。
已知限制
- 安装 registry/git 目标需要子 dsh/pnpm 进程具备网络访问权限。
- 冒烟任务需要模型凭据才能达到 pass;没有凭据时,它会如实报告 boot-ok。
- 在没有 storageDomain 的组合中,报告不会被持久化(drive_report 会如实失败)。
- dsh 必须能在 PATH 上被定位(或设置 dshBin);在 Windows 上,npm 的 .cmd/.bat shim 会被自动解析,而仅解析 .ps1 时会要求提供 dshBin。
- 批次默认串行执行;提高 batchConcurrency 共享的是 pnpm-store 磁盘,而不是正确性。
开发
sh
pnpm install
pnpm run typecheck && pnpm run typecheck:ci && pnpm test
pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
- typecheck 通过本地 harness 检出解析 @deepseek-ai/*;typecheck:ci 针对已发布的 0.1.5-rc.2 类型进行检查。
- 测试使用真实的 Context/Session/ToolRuntime/LocalJobRegistry/存储栈,并配合脚本化的子进程提供程序。
- 真实 CLI 端到端(需要网络 + PATH 中的 dsh):DSH_TESTDRIVE_E2E=1 pnpm run test:e2e —— 通过真实的安装冒烟循环驱动本包自身的检出。
- 发布:node scripts/release.mjs (递增版本、标记 CHANGELOG、重新运行门禁、提交 + 打标签;从不推送)。
主题
dsh、dsh-plugin、deepseek-harness、deepseek、cordis、plugin-testing、install-smoke、compatibility-matrix、ci
贡献者
PerryLink —— 设计与实现。
PerryLink DSH 插件家族
本项目是由 PerryLink 维护的 40 个 DeepSeek Harness 插件之一。如果这个对你有帮助,其他的很可能也会:
| 插件 | 一句话简介 |
|---|---|
| dsh-auto-review | 审批链上的第二模型自动审查,默认故障关闭 | |
| dsh-background-agents | 持久的后台子代理,带 Web UI 侧边栏、消息传递和中断 | |
| dsh-budget | DeepSeek Harness 的成本治理:预算、碳排和延迟集于一个面板。 | |
| dsh-checkpoint-rewind | 等同于 Claude Code /rewind:快照、会话分叉、一次性恢复 | |
| dsh-claude-move | 将 Claude Code 会话、记忆、技能和 CLAUDE.md 迁移到 DSH | |
| dsh-click | DeepSeek Harness 的跨平台原生桌面控制 —— 以 Windows 优先。 | |
| dsh-composer-history | Web 编辑器的终端风格输入历史:方向键、Ctrl+R 搜索 | |
| dsh-data-quality | 数据集质量检查和引用交叉核对(此处消费的可选数值桥接) | |
| dsh-defend | DeepSeek Harness 的提示注入、越狱和机密泄露防御。 | |
| dsh-doublecheck | 工程纪律守卫:需求拷问、测试门禁、对手审查 | |
| dsh-draw | DeepSeek Harness 的统一静态图像生成路由。 | |
| dsh-fast | DeepSeek Harness 的只读性能诊断。 | |
| dsh-fund-research | 面向中国公募基金的确定性研究报告 | |
| dsh-github | 面向 DSH 的 GitHub PR/issue 集成,每次写入均需审批 | |
| dsh-industry-research | 行业研究编排,通过本插件的 ctx.researchReport.assemble 封存其交付物 | |
| dsh-library | 面向 DeepSeek Harness 的本地文档知识库。 | |
| dsh-local-ai | 面向 DeepSeek Harness 的本地模型(Ollama)集成。 | |
| dsh-lsp-actions | 基于语言服务器的 LSP 诊断、格式化、补全、代码操作与重命名 | |
| dsh-mask | PII 脱敏中间件:在模型边界匿名化,在展示层还原 | |
| dsh-mcp-panel | 只读 MCP 运行时面板:/mcp 命令 + 设置标签页,含状态、工具与错误 | |
| dsh-memento | 需审批的跨会话记忆:ctx.memory 接缝 + SQLite + memory 工具 | |
| dsh-observe | 面向 DeepSeek Harness 的 OpenTelemetry 与 Langfuse 可观测性导出器。 | |
| dsh-output-styles | 等效于 Claude Code outputStyles 的运行时样式切换 | |
| dsh-permission-rules | Claude Code 风格的声明式 allow/deny/ask 权限规则,带审计 | |
| dsh-personal-directive | 带顶栏开关的个人指令注入器(框架版) | |
| dsh-plugin-guide | 以按需智能体技能形式提供的插件开发知识库 | |
| dsh-plugin-doctor | 面向 DSH 插件的零依赖静态 + 沙箱冒烟检测器 | |
| dsh-reach | 多渠道审批/提问桥接:微信/Telegram/飞书,会话控制台 | |
| dsh-research-report | 可验证的研究报告引擎:内容寻址的证据账本与封存版本 | |
| dsh-score | 面向 DeepSeek Harness 插件的多维度质量评分。 | |
| dsh-session-pin | 在 Web 侧边栏中固定会话,并保持持久排序 | |
| dsh-session-sync | 面向 DeepSeek Harness 的跨设备会话同步——会话存储的专用 git 镜像。 | |
| dsh-skill-pack-security | 安全审计技能包:密钥扫描、依赖与供应链审查 | |
| dsh-talk | 面向 DeepSeek Harness 的语音优先会话循环:对它说话,听它回答。 | |
| dsh-ticktick | TickTick/滴答清单任务桥接:会话头部面板 + 11 个工具 |
| dsh-translate | 面向 DeepSeek Harness 的厂商参数转换与确定性 JSON 修复。 | |
| dsh-wechat | 微信 ↔ DSH 桥接(腾讯 iLink 机器人):文本/图片/文件/语音,在聊天中审批 |
| dsh-autotier | 自动进行强/廉价模型层级路由,具备确定性风险防护和 /tier 命令 | |
| dsh-catalog | PerryLink 系列的 DSH Desktop Market 标准目录源 | |
| dsh-cert-mcp | 只读 MCP 服务器,公开认证注册表:评级、快照和五维证据 | |
| dsh-kit | 一条命令即可安装核心系列组件的入门包 | |
| dsh-plugin-certification | 社区认证注册表,具备可复现检查的评级和徽章 | |
| dsh-plugin-kit | 面向 PerryLink DSH 插件的共享零运行时依赖工具包 | |
| dsh-plugin-portal | 零依赖静态门户,将整个插件系列渲染为一个页面 | |
| dsh-plugin-upgrade-015 | 合并的 0.1.3-alpha.1 → 0.1.5-rc.1 升级通道卡片,外加零依赖接缝扫描器 | |
| dsh-team-rooms | 跨会话团队房间:共享消息总线、任务板和时线 | |
从 DSH Desktop Market 安装
所有 PerryLink 插件均可在内置的 DSH Desktop Market 中浏览:Market → Sources → add source → 粘贴 https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → 选择它。安装仍会经过 Market 的 npm 身份验证和你的确认。
许可证
Apache-2.0扫码进群