证据快照复核于 2026-09-09GitHub 数据核对日期: 2026-08-21
证据已验证Plugin Bundle自动化与智能体deepseek-harness Profile

dsh-test-drive

在临时隔离配置中测试 DeepSeek Harness 插件,避免影响你的正式配置。

快速了解

它能做什么

在临时隔离配置中测试 DeepSeek Harness 插件,避免影响你的正式配置。

本站提供的是中文说明,不代表该项目或 Plugin 自身提供中文界面;语言支持请以上游文档为准。

使用场景
自动化与智能体测试Plugin 管理配置
适配技术
deepseek-harnessnodejspnpm
兼容性

deepseek-harness Profile
0.1.2-rc.1; peer dependencies >=0.1.2-rc.1 <0.2.0

可信度与状态

证据已验证
核对日期 2026/9/6 UTC 13:51

有代码证据的贡献

它为 DSH 增加什么

插件试驾工具

在隔离环境中执行安装、补丁、启动冒烟、可选能力断言、卸载和清理检查,并提供批量执行与报告查询。

机制证据

选择前先看

dsh-test-drive 提供 test_drive、/testdrive 和 drive_report,可将仓库、npm 包、本地路径或 tarball 安装到临时 DSH_HOME 中。它检查 bundle 补丁和启动日志,可选验证指定工具或命令,随后卸载并生成结构化 JSON/Markdown 结果。

适合谁

需要可重复安装与冒烟测试证据的 DeepSeek Harness 插件开发者、维护者和 CI 使用者。

常见任务

  • 在不改动宿主 DSH 配置的前提下,对单个插件候选进行冒烟测试。
  • 批量运行受限数量的插件目标,并查看结果矩阵。
  • 通过可选能力断言,验证指定工具或命令,而不只看是否能干净启动。
  • 为插件 CI 生成 Markdown 和面向 JUnit 的报告。

权限与数据

插件会在临时目录中运行子 DSH/pnpm 进程;如有 storage domain,可持久化报告。

权限
  • fs:read
  • fs:write
  • subprocess:spawn
  • session:append
  • network:inherit
数据处理
  • 每次试驾会创建临时 DSH_HOME、工作目录和 pnpm store。
  • 存在 storage domain 时,会在其中保存运行记录和矩阵报告。
  • 文档声明报告输出会清理令牌字面量、URL 凭据、Bearer 请求头和临时路径。
外部服务
  • 子进程可能通过网络访问 Git 或 npm 目标。
  • 可选能力断言可能需要 DeepSeek API 凭据。
凭据
  • 文档说明默认启动检查不需要密钥。
  • 仅会转发显式列出的环境变量名称;文档称不会记录其值。

局限

  • 需要能找到 dsh 和 pnpm,除非配置 dshBin。
  • 安装 registry 或 Git 目标需要子进程具备网络访问。
  • 缺少模型凭据时,一次性冒烟任务可能只得到 boot-ok,而不会完成。
  • 没有 storageDomain 时,报告不会持久化,drive_report 无法查询。
  • Git 目标的 prepare 构建会执行代码,应仅测试可信且已固定提交的目标。

DSHub 已核对

  • 固定提交的源码已验证 package manifest 与 Cordis bundle patch 结构。
  • manifest 声明了 DSH bundle patch、Node 版本要求、权限和 DeepSeek Harness peer 依赖范围。
  • 已确认 npm registry 中的包身份,但未审计其分发内容。

DSHub 未核对

  • 本次整理未实际执行成功安装或运行时冒烟测试。
  • README 所述的平台行为、清理、脱敏和 CI 行为未被独立执行验证。
  • 未审计 npm tarball 的内容。

固定版本安装

安装 dsh-test-drive

这个Plugin Bundle没有 DSH Plugin 安装操作,请根据源码文档使用真实交付方式。

访问源码项目

维护者原文

项目 README

查看 commit 05ec283 对应的 README
维护者编写的上游内容原文于 2026/9/6README.md 获取,正文和仓库相对媒体固定到 commit 05ec2839fb32,内容哈希为 b5a1ce006d14。以下是未经 DSHub 翻译的上游原文,语言可能与当前页面不同;第三方托管的 badge 可能独立更新。
<div align="center">

🧪 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

Isolated install-and-smoke test drives for DeepSeek Harness plugins.

Install, smoke, verify, and clean up in a throwaway profile — your real ~/.dsh stays untouched.

License DSH plugin Node CI Version npm version npm downloads

English · 简体中文 · Español · Português · हिन्दी

</div>

Compatibility

Component Version
DeepSeek Harness dsh-v0.1.3-alpha.1 (GitHub tag, verified 2026-09-06: full gate chain + profile install smoke). npm dependency line 0.1.2-rc.1 (peer dependencies >=0.1.2-rc.1 <0.2.0)
Node.js ^22.19.0 || >=24.0.0
Package manager pnpm@11.7.0
Platform Windows / macOS / Linux (host-only plugin)
External tools dsh CLI on PATH (auto-detected, npm shims parsed), pnpm on PATH

What you get

  • test_drive tool — one target through the complete pipeline: dsh plugin add--dump-config patch check → headless boot smoke (FAILED-marker scan + optional one-shot task) → optional capability assertion → dsh plugin remove → quarantined cleanup. Returns the structured record synchronously, or { kind: 'background', jobId } with background: true.
  • /testdrive command — batch drive of a whitespace/comma-separated target list as a drive-batch background job over ctx.jobs, producing a matrix report (JSON + Markdown).
  • drive_report tool — fetch any stored run (tdr_...), matrix (tdm_...), or the latest matrix; rendered as Markdown.
  • Capability assertion — beyond "booted and exited": the optional capability stage drives one headless task that calls a named tool (or runs a /command) and verifies the durable session log recorded the invocation and the observed output contains expect. A clean boot is only a smoke test; observed proves a named capability really works.
  • Structured results — every record carries the discriminator schema: "dsh-test-drive/v1" with first-class fields: stages.install.status (pass/fail), stages.smoke.status (pass/fail/boot-ok/skipped), stages.capability.status (observed/invoked/not-registered/skipped/failed), per-stage durationMs, sanitized summary/outputTail, and an overall verdict (pass/fail/partial/unknown). This is the machine-readable contract downstream scorers (dsh-score) consume.
  • Safety by construction — every temp directory is created by this plugin under a dedicated dsh-test-drive- prefix, tracked in a live ownership registry, and removed only through a dry-run → quarantine-rename → delete ladder. The host profile is never read or written.

Quick start

Git channel

dsh plugin --profile web add github:PerryLink/dsh-test-drive#<commit-sha>

The first add fails because pnpm blocks the package's prepare build; copy the exact key pnpm printed into the profile's pnpm-workspace.yaml and re-run:

allowBuilds:
  'dsh-test-drive': true

npm channel

dsh plugin --profile web add dsh-test-drive

Prebuilt packages need no build allowance. Restart the profile, then use test_drive / /testdrive from a session.

Install & uninstall

dsh plugin --profile web add dsh-test-drive     # install (npm) — or the git form above
dsh plugin --profile web remove dsh-test-drive  # uninstall

Configuration

All keys are optional (defaults shown); invalid values fail loudly at load.

Key Default Description
profileName headless Profile template initialized inside each throwaway DSH_HOME (base + headless bundles).
dshBin "" Absolute dsh executable override; empty auto-detects dsh on PATH.
headlessTask "Reply with exactly: ok" One-shot task for the boot-smoke stage; empty skips the stage.
forwardEnv [] Environment VARIABLE NAMES (never values) forwarded into test-profile child processes.
allowBuilds true Allowlist a blocked git prepare build in the test profile and retry the install once.
installTimeoutMs 600000 dsh plugin add stage deadline.
configTimeoutMs 60000 --dump-config stage deadline.
smokeTimeoutMs 300000 Headless boot-smoke stage deadline.
capabilityTimeoutMs 300000 Capability-assertion task deadline.
capability.enabled false Run the capability-assertion stage (registered → invoked → observed).
capability.kind tool What to assert: tool or command.
capability.name "" Tool or command name (no leading /).
capability.args "" Invocation text: tool arguments (JSON-ish) or command words.
capability.expect "" Literal expected in the observed output (case-insensitive substring).
uninstallTimeoutMs 120000 dsh plugin remove stage deadline.
outputTailBytes 8000 Cap on the sanitized output tail recorded per stage.
keepTempDirs false Keep temp dirs on failure for forensics (ownership is dropped; you clean up).
maxBatchTargets 20 /testdrive batch cap.
batchConcurrency 1 Batch concurrency (serial avoids pnpm-store contention).

Tools & surfaces

test_drive

test_drive(target: string, headlessTask?: string, background?: boolean,
           capability?: { kind: 'tool' | 'command', name: string,
                          args: string, expect: string })
  • target — git spec (github:owner/repo#sha, git+https://...), npm name, local path, or .tgz tarball.
  • capability — assertion after the boot smoke: the agent calls name (tool) or runs /name (command) with args; the stage reads the durable session log and requires the observed output to contain expect. Needs DEEPSEEK_API_KEY (host env or forwardEnv); without it the stage is skipped, never failed.
  • Returns the full structured record; see the sample below.
  • background: true starts a drive-batch job and returns its id.

/testdrive <targets...>

Starts one background batch job; progress streams through the job output, and the final line names the matrix id for drive_report.

drive_report(id?)

Returns a run record (tdr_...), a matrix (tdm_...), or — with no id — the latest matrix.

Structured result sample

{
  "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.2-rc.1", "pluginVersion": "0.3.6",
           "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": "booted without loader failures; headless task did not complete (credentials/model unreachable)",
                   "outputTail": "", "bootFailed": false, "taskCompleted": false },
    "capability": { "status": "observed", "exitCode": 0, "durationMs": 8123, "attempts": 1,
                    "summary": "tool \"plugin_vet\" called and its result contains the expectation",
                    "outputTail": "", "capabilityKind": "tool", "name": "plugin_vet",
                    "expectMatched": true,
                    "detail": "tool \"plugin_vet\" called and its result contains the expectation" },
    "uninstall": { "status": "pass", "exitCode": 0, "durationMs": 5123, "attempts": 1,
                   "summary": "remove ok (exit 0)", "outputTail": "" },
    "cleanup":   { "status": "pass", "quarantined": true, "removed": true,
                   "summary": "owned temp root quarantined and removed" }
  },
  "verdict": "pass",
  "verdictReason": "install, patch, boot, and uninstall verified; headless task inconclusive (see smoke.summary)"
}

Verdict rules: install failure, boot failure (smoke.fail), or a capability stage that reached not-registered/failedfail; install pass + patch effective + clean boot (pass/boot-ok) + uninstall pass ⇒ pass (with a capability note when observed); anything installed but missing a later assurance ⇒ partial; otherwise unknown.

CI (GitHub Actions)

The repository ships a composite action.yml that reuses dsh-test-drive in any plugin repo. It drives a target in an isolated throwaway profile and emits the report pair CI consumes: Markdown (PR comment) and JUnit XML (test reporter / status check).

# .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 inputs: target (required), headless-task (optional smoke task), dsh-version (the dsh CLI spec). Outputs: markdown, junit (report paths), and verdict (pass/fail/partial/unknown). The drive itself stays keyless (install → patch check → boot smoke → uninstall → cleanup); a capability assertion is the only stage that needs DEEPSEEK_API_KEY, and it is skipped, never failed, without one.

The same report pair is available programmatically: renderDriveResult / renderMatrix (Markdown) and renderDriveJUnitXml / renderMatrixJUnitXml (JUnit) are exported from the package root over a settled DriveResult or MatrixRecord.

Permissions & data

  • Only public services are consumed: ctx.subprocess, ctx.jobs, ctx.storageDomain, ctx.tools, ctx.commands.
  • Reports are stored in the test_drive storage-domain (tables runs, matrices; latest-matrix pointer). When the composition has no storageDomain (e.g. the shipped headless profile), tools still work and report persistence is disabled with a logged reason.
  • Child processes inherit a credential-scrubbed environment: host secrets never reach a tested profile unless you explicitly name them in forwardEnv. Values are never logged.
  • All report/log strings pass through pure sanitizers: token literals, URL credentials, and bearer headers are redacted, temp-root paths are replaced with <testdrive-temp>, and tails are byte-capped.

Security boundaries

  • Isolation. Each drive runs inside a fresh mkdtemp root under the OS temp dir: a throwaway DSH_HOME, a throwaway working directory, and a redirected pnpm store. The tested plugin's code only ever runs in that profile; your host profile is untouched.
  • Ownership. A live registry records every root this plugin instance creates. Cleanup refuses anything that is not a registered direct child of the OS temp dir carrying the dsh-test-drive- prefix — no %TEMP% sweeps, no foreign prefixes, no real-home paths.
  • Cleanup ladder. Before any mutation the full dry-run plan is logged (absolute paths). Removal renames the root into a dsh-test-drive-quarantine-<ts> directory first, verifies, then deletes; failures leave the directory quarantined and reported, never silently dropped. Cleanup runs in a finally on success, failure, timeout, and abort, and again on plugin teardown.
  • allowBuilds is a real permission. Allowing a git package's prepare build executes that package's code at install time. The allowance is scoped to the throwaway profile only, but only test targets you trust, and pin commits.
  • Headless smoke is keyless by default. The boot check needs no credentials; completing the one-shot task does. Forward credentials explicitly (forwardEnv) and never log them.

Known limitations

  • Installing registry/git targets requires network access from the child dsh/pnpm processes.
  • The smoke task needs model credentials to reach pass; without them it reports the honest boot-ok.
  • In compositions without storageDomain, reports are not persisted (drive_report fails honestly).
  • dsh must be locatable on PATH (or set dshBin); on Windows the npm .cmd/.bat shim is parsed automatically, a bare .ps1 resolution asks for dshBin.
  • Batches default to serial execution; raising batchConcurrency shares the pnpm-store disk, not correctness.

Development

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 resolves @deepseek-ai/* through the local harness checkout; typecheck:ci checks against the published 0.1.2-rc.1 types.
  • Tests use the real Context/Session/ToolRuntime/LocalJobRegistry/storage stack with a scripted subprocess provider.
  • Real-CLI end-to-end (requires network + dsh on PATH): DSH_TESTDRIVE_E2E=1 pnpm run test:e2e — drives this package's own checkout through the real install-smoke loop.
  • Release: node scripts/release.mjs <x.y.z> (bumps, stamps CHANGELOG, re-runs the gate, commits + tags; never pushes).

Topics

dsh, dsh-plugin, deepseek-harness, deepseek, cordis, plugin-testing, install-smoke, compatibility-matrix, ci

Contributors

PerryLink — design and implementation.

PerryLink DSH Plugin Family

This project is one of the 33 DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:

Plugin One-liner
dsh-dsh-auto-review Second-model auto-review on the approval chain, fail-closed by default
dsh-dsh-background-agents Durable background child agents with a Web UI sidebar, messaging and interrupt
dsh-dsh-budget Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel.
dsh-dsh-checkpoint-rewind Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore
dsh-dsh-claude-move Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH
dsh-dsh-click Cross-platform native desktop control for DeepSeek Harness — Windows first.
dsh-dsh-composer-history Terminal-style input history for the web composer: arrows, Ctrl+R search
dsh-dsh-data-quality Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here)
dsh-dsh-defend Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness.
dsh-dsh-doublecheck Engineering-discipline guard: requirements grill, test gates, adversary review
dsh-dsh-draw Unified static-image generation routing for DeepSeek Harness.
dsh-dsh-fast Read-only performance diagnostics for DeepSeek Harness.
dsh-dsh-fund-research Deterministic research reports for Chinese public mutual funds
dsh-dsh-github GitHub PR/issues integration for DSH, every write gated by approval
dsh-dsh-industry-research Industry research orchestration that seals its deliverables through this plugin's ctx.researchReport.assemble
dsh-dsh-library Local document knowledge base for DeepSeek Harness.
dsh-dsh-local-ai Local-model (Ollama) integration for DeepSeek Harness.
dsh-dsh-lsp-actions LSP diagnostics, formatting, completion, code actions and rename over language servers
dsh-dsh-mask PII masking middleware: anonymize at the model boundary, restore at the display layer
dsh-dsh-mcp-panel Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors
dsh-dsh-memento Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool
dsh-dsh-observe OpenTelemetry and Langfuse observability exporter for DeepSeek Harness.
dsh-dsh-output-styles Claude Code outputStyles-equivalent runtime style switching
dsh-dsh-permission-rules Claude Code-style declarative allow/deny/ask permission rules with audit
dsh-dsh-plugin-guide Plugin-development knowledge base as an on-demand agent skill
dsh-dsh-research-report Verifiable research-report engine: content-addressed evidence ledger and sealed versions
dsh-dsh-score Multi-dimensional quality scoring for DeepSeek Harness plugins.
dsh-dsh-session-pin Pin sessions in the Web sidebar with durable ordering
dsh-dsh-session-sync Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store.
dsh-dsh-skill-pack-security Security-audit skill pack: secret scan, dependency and supply-chain review
dsh-dsh-talk Voice-first session loop for DeepSeek Harness: talk to it, hear it answer.
dsh-dsh-translate Vendor parameter translation and deterministic JSON repair for DeepSeek Harness.

Install from the DSH Desktop Market

All PerryLink plugins are browsable in the built-in DSH Desktop Market: Market → Sources → add source → paste https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → select it. Installation still goes through the Market's npm-identity verification and your confirmation.

License

Apache-2.0

有意识地管理

安装与管理

前置条件与目标 Profile

目标 deepseek-harness Profile

交付方式 Git Bundle — PerryLink/dsh-test-drive#05ec2839fb32533ece8f826658e2e9443ea12aa0

验证、更新与移除

显示生命周期命令
验证
dsh plugin --profile deepseek-harness list

兼容性与访问范围

Declared DeepSeek Harness plugin compatibility 0.1.2-rc.1; peer dependencies >=0.1.2-rc.1 <0.2.0

检查兼容性证据

风险事实

permissions

Can read and write files, spawn subprocesses, append sessions, and inherit network access.

证据
install-time-code

A Git target’s prepare build may execute that target’s code when explicitly allowlisted in the isolated test profile.

证据
证据与编辑审查Manifest、Bundle patch、分发与新鲜度

不可变证据

审查状态与源码活动

AI 已审查

建议尽量使用固定提交的 Git 目标进行试驾;allowBuilds 代表批准执行被测目标的安装期代码。

AI 审查于 2026/9/9 UTC 14:07GitHub 事实核对日期: 2026/9/9 UTC 14:07

自当前证据基线以来,没有记录到重要源码变化。

下一步

按 Plugin 安装流程操作

订阅重要变化: dsh-test-drive