浏览全部

其他 · v0.1.9

harnessx-desktop

github.com/coffeefreehans/harnessx

能力可执行外部程序以 shell 执行命令向其他插件注入

DeepSeek HarnessX: an Electron desktop client composed around DeepSeek Harness

该插件尚未翻译,显示作者原文。

仅 GitHub
认证 未评级已扫描 ✓健康 D/63星 —
18 项能力
许可
MIT

安装命令

dsh plugin --profile web add git+https://github.com/coffeefreehans/harnessx

实测:这条命令在隔离环境里没装上(安装失败)。安装前先看这个仓库的构建要求。

检测报告

关注度高。命中了不少能力模式,其中可能有需要留意的。逐条看下面的清单。
5高关注7需留意6一般6未命中
高关注需留意一般

能力清单

  • 可执行外部程序spawns-processes高关注167 处命中
    • …k-harness/apps/cli/src/plugin.ts:13import { spawnSync } from 'node:child_process'
    • …xtures/web-browser-open/open.mjs:1import { spawn } from 'node:child_process'
    • …tests/github-webhook-real.e2e.ts:3import type { ChildProcess } from 'node:child_process'
    • …tests/github-webhook-real.e2e.ts:4import { spawn } from 'node:child_process'
    • 看它调用哪些程序。调用本机已有的工具是常见做法。
  • 以 shell 执行命令shell-exec高关注60 处命中
    • …-desktop-bundled-pnpm-runtime.md:25Windows batch commands require a command interpreter. Upstream `dsh plugin` already uses `shell: true` on Windows, and P…
    • …sktop-bundled-pnpm-runtime.zh.md:25Windows batch 命令需要 command interpreter。上游 `dsh plugin` 已经在 Windows 使用 `shell: true`,PowerShell 或命令提示符也能正常解析 `pnpm.cmd`。若…
    • …ser/develop/framework/service.md:120shell: true
    • …ser/develop/framework/service.md:131shell: true
    • 看命令字符串是拼出来的还是写死的。拼接用户输入才是真正的风险。
  • 向其他插件注入plugin-tree-injection高关注10 处命中
    • harnessx-desktop, harnessx-desktop/credentials, harnessx-desktop/desktop-prefs
    • 看 patch 里 insert 的包是不是本项目自己的。插入第三方代码要格外留意。
  • 改写用户 profileprofile-tamper高关注3 处命中
    • agent-team-headless.e2e.ts, built-bin.e2e.ts
    • 看它改的是自己那一段还是别人的。改用户 profile 通常应由用户手动做。
  • 访问原生绑定native-access高关注2 处命中
    • …s/workflow-worker-thread.spec.ts:38const ESCAPE = "globalThis.constructor.constructor('return process')()"
    • …s/workflow-worker-thread.spec.ts:1324const st = globalThis.constructor.constructor('return setTimeout')()
    • 访问原生绑定或走 constructor 链,等于绕开 JS 层的一切限制。确认这是插件的核心机制,而不是顺手拿到的便利。
  • 写入文件writes-files需留意3765 处命中
    • …-stale-profile-fallback-links.md:10`healProfilesModuleFallback` re-points `$DSH_HOME/profiles/node_modules` entries when an installation moves, and Windows…
    • …-stale-profile-fallback-links.md:14`ensureSymlink` removes a stale link with `unlinkSync(link)`. `unlink` deletes the reparse point or symlink itself on ev…
    • …-stale-profile-fallback-links.md:18**`rmSync(link, { recursive: true })`.** On Node 24 this deletes the junction without following its target, but `recursi…
    • …ale-profile-fallback-links.zh.md:10`healProfilesModuleFallback` 在安装位置迁移时会把 `$DSH_HOME/profiles/node_modules` 中的条目重新指向新目标,而 Windows 主机上这些条目是 junction。`ensur…
    • 看写入位置。写自己的配置目录是正常的,写系统目录不是。
  • 发起网络请求network需留意487 处命中
    • …gui-layering-and-rpc-protocol.md:83The two existing applications preserve the division: the Web application mounts Host, carrier, and browser composition, …
    • …gui-layering-and-rpc-protocol.md:206| `readSse` | streaming fetch (not EventSource), `\n\n` framing, `data:` concatenation, ServerRequest full-form parse, t…
    • …ut-machine-and-slash-pipeline.md:70- Sources get an optional `lexicon?(session)` hook: a synchronous hot-snapshot name roster, with `undefined` = data not …
    • …6-preset-health-resolves-rows.md:68A preset naming a package that a rename or an uninstall took away is marked on the roster, refused before a mount is spe…
    • 看请求发往哪些域名。发往作者自己的后端是常见做法。
  • 启动伪终端spawns-pty需留意171 处命中
    • …-windows-local-nsis-installer.md:11The command rejects non-Windows and non-x64 hosts and requires Node 22.19+ or Node 24.x so the official runtime includes…
    • …-windows-local-nsis-installer.md:15Electron Builder's existing `afterPack` hook verifies the application archive, physical runtime tree, and required Windo…
    • …ndows-local-nsis-installer.zh.md:11该命令会拒绝非 Windows 与非 x64 宿主,并要求使用官方 runtime 仍包含 Corepack 的 Node 22.19+ 或 Node 24.x。它会移除 Windows 证书变量,在保留 Windows resource …
    • …ndows-local-nsis-installer.zh.md:15Electron Builder 现有的 `afterPack` hook 会在 NSIS 封装前校验 application archive、物理 runtime tree 与必需的 Windows x64 `node-pty` preb…
    • 伪终端等于给了一个完整 shell。确认这是插件的核心功能。
  • 运行时改写自身配置modifies-own-manifest需留意130 处命中
    • …tests/agent-team-headless.e2e.ts:27await writeFile(join(profileDir, 'package.json'), JSON.stringify({
    • …tests/agent-team-headless.e2e.ts:43await writeFile(join(profileDir, 'cordis.patch.yml'), [
    • …/apps/cli/tests/built-bin.e2e.ts:114writeFileSync(join(bundleDir, 'cordis.patch.yml'), [
    • …/apps/cli/tests/built-bin.e2e.ts:120writeFileSync(join(bundleDir, 'package.json'), JSON.stringify({
    • 运行时改写自身配置会让下次启动的行为和你看过的源码不一致。
  • 可终止进程kills-processes需留意68 处命中
    • …ntime-python-settlement-fixes.md:42A model program can leave a descendant in the child's OWN process group (no `setsid`, so `kill(-pid)` reaches it) that i…
    • …ntime-python-settlement-fixes.md:46The window the cleared timer cannot cover is closed by an IDENTITY check inside `killGroup`. Every signal it sends is a …
    • …ntime-python-settlement-fixes.md:130**Assert the reap with `process.kill(pid, 0)` throwing ESRCH.** Rejected: a SIGKILL'd process lingers as a zombie until …
    • …me-python-settlement-fixes.zh.md:42模型程序可能在子进程自己的进程组里(没有 `setsid`,因此 `kill(-pid)` 能到达它)留下一个后代,它忽略 SIGTERM,但释放了继承而来的 stdout/stderr/fd-3 管道。随后 leader 退出,由于管道已…
    • 看它终止的是自己启动的进程,还是按名字匹配到的任意进程。
  • 动态执行代码dynamic-code需留意16 处命中
    • …sts/client-bundle.client.spec.ts:46new Function(code!)()
    • …pector/src/client/cdp/runtime.ts:342value = globalThis.eval(command.expression) as unknown
    • …pector/src/client/cdp/runtime.ts:368const fn = globalThis.eval(`(${command.functionDeclaration}\n)`) as unknown
    • …/tests/cordis-model.host.spec.ts:159expect(globalThis.eval(realmObjectExpression(reference))).toBe(value)
    • 看 eval / new Function 的入参来自哪里。常量字符串和用户输入是两回事。
  • 客户端可疑脚本client-side-risk需留意5 处命中
    • index.ts: postMessage 无 origin 校验; runtime.ts: postMessage 无 origin 校验
    • 浏览器侧代码能改你看到的界面。确认改动范围符合插件用途。
  • 读取文件reads-files一般2551 处命中
    • …system-directory-listing-seam.md:30The local backend implements this through `readdir({ withFileTypes: true })`, `resolveLocalTarget`, and metadata `stat`/…
    • …tem-directory-listing-seam.zh.md:30本地后端通过 `readdir({ withFileTypes: true })`、`resolveLocalTarget` 以及元数据 `stat`/`realpath` 探测来实现。结果顺序是确定性的(`name.localeCompa…
    • …ectory-picker-capability-seam.md:21- **Dependency survey (hand-roll vs adopt).** Node's stdlib *is* the maintained cross-platform OS layer (`readdir(withFi…
    • …ory-picker-capability-seam.zh.md:21- **依赖调研(手写 vs 引入)。** Node 标准库本身就是维护中的跨平台 OS 层(`readdir(withFileTypes)`、`homedir`、路径语义);调研过的替代品都过不了依赖门槛——文件管理器包(`node-fi…
    • 读文件是绝大多数插件的正常工作方式,本身不构成顾虑。
  • 读取环境变量reads-env一般1179 处命中
    • …-desktop-bundled-pnpm-runtime.md:13The launcher captures the ordinary layered launch-environment snapshot first. It then generates a private runtime-comman…
    • …sktop-bundled-pnpm-runtime.zh.md:13Launcher 会先捕获普通 layered launch-environment snapshot,然后在 Electron user data 下生成私有 runtime-command 目录,并在 profile 准备与 Cordi…
    • .github/workflows/build-macos.yml:35run: node -e "if (process.arch !== process.env.EXPECTED_ARCHITECTURE) { throw new Error('Expected ' + process.env.EXPECT…
    • …-stdin-env-trusted-plugin-api.md:222. **`env` merges AFTER the credential scrub, so an explicit caller entry wins even on a credential-shaped name.** The l…
    • 环境变量里常混有密钥。看它是否把整个 env 都读走。
  • 接触凭据或密钥credentials一般664 处命中
    • …-level-llm-config-credentials.md:18**Secrets are references, values live behind `ctx.credentials`.** Configuration (both planes) carries `apiKeyEnv: DEEPSE…
    • …vel-llm-config-credentials.zh.md:18**机密是引用,值藏在 `ctx.credentials` 背后。**配置(两个面)携带 `apiKeyEnv: DEEPSEEK_API_KEY`;三包凭据 seam 按操作解析它。`credentials-local` 把活跃进程环境(…
    • …-ai-declared-provider-catalog.md:43pi-ai's `Models` carries its own credential concept — a `CredentialStore` keyed by provider id, with `envApiKeyAuth` res…
    • …-ai-declared-provider-catalog.md:45`ModelsImpl.applyAuth` honours `options.apiKey` as the request's key, but only through a provider that declares an api-k…
    • 看它读取哪些凭据、发往哪里。用于登录自己的服务是正常的。
  • 动态加载模块dynamic-import一般642 处命中
    • …tive-typescript-source-launch.md:30Node-compatible TypeScript is part of this source-launch contract. Vendored Cordis, Loader, Include, HMR, and Schemaster…
    • …e-typescript-source-launch.zh.md:30Node-compatible TypeScript 是这项源码启动契约的一部分。vendor 中的 Cordis、Loader、Include、HMR(热模块替换)和 Schemastery 使用 `import type` 标记会被擦除…
    • …-07-30-web-read-card-frontend.md:24**Read-card grammars load lazily; only the boot three stay eager.** `highlight.ts` is a platform seed `ui-primitives` lo…
    • …-30-web-read-card-frontend.zh.md:24**读取卡片的语法按需 lazy 加载,只有 boot 三种保持 eager。** `highlight.ts` 是 `ui-primitives` 在每次 Web 启动都加载的平台 seed,其预热会无条件构建 shiki 单例。读取卡片…
    • 动态导入本身无害,但会让依赖关系难以静态审阅。
  • 文中出现远程脚本地址remote-url-reference一般37 处命中
    • README.en.md:20| Windows x64 | [Download EXE](https://github.com/coffeefreehans/HarnessX/releases/download/v0.1.9/HarnessX-0.1.9-x64-Se…
    • README.en.md:21| Windows ARM64 | [Download EXE](https://github.com/coffeefreehans/HarnessX/releases/download/v0.1.9/HarnessX-0.1.9-arm6…
    • …k-harness/THIRD_PARTY_NOTICES.md:47| [`@octokit/webhooks`](https://github.com/octokit/webhooks.js) | MIT |
    • …k-harness/THIRD_PARTY_NOTICES.md:59| [`@xterm/headless`](https://github.com/xtermjs/xterm.js) | MIT |
    • 只是文本里出现了远程脚本地址,没有看到加载它的调用。多半是文档或注释;若确实可疑,搜一下这个地址在包里的其他出现位置。
  • 使用 vm 模块做隔离uses-vm-module一般24 处命中
    • …ts/file-upload-http.host.spec.ts:1import { runInNewContext } from 'node:vm'
    • …s/tests/node-half.client.spec.ts:9import { runInNewContext } from 'node:vm'
    • …ts/html-bootstrap.client.spec.ts:4import { runInNewContext } from 'node:vm'
    • …/tests/boot-theme.client.spec.ts:3import { runInNewContext } from 'node:vm'
    • 用 node:vm 是在建立隔离,不是在突破它。本身不是顾虑,但值得知道这个插件会执行动态代码。
逐条扫描明细
能力标识关注度命中次数
可执行外部程序spawns-processes高关注167
以 shell 执行命令shell-exec高关注60
向其他插件注入plugin-tree-injection高关注10
改写用户 profileprofile-tamper高关注3
访问原生绑定native-access高关注2
写入文件writes-files需留意3765
发起网络请求network需留意487
启动伪终端spawns-pty需留意171
运行时改写自身配置modifies-own-manifest需留意130
可终止进程kills-processes需留意68
动态执行代码dynamic-code需留意16
客户端可疑脚本client-side-risk需留意5
读取文件reads-files一般2551
读取环境变量reads-env一般1179
接触凭据或密钥credentials一般664
动态加载模块dynamic-import一般642
文中出现远程脚本地址remote-url-reference一般37
使用 vm 模块做隔离uses-vm-module一般24

这份报告的口径

扫描读的是包里的源码,全程不执行第三方代码。 本次读了 9282 个文件,扫描于 2026-10-22。 命中次数只说明源码里出现过这类调用,不说明行为好坏——一个插件读写文件 500 次和 1 次 都会被记为「读取文件」。这是能力清单,不是信任评分,也不是安全结论: 没扫出来的能力可能只是写法没被规则覆盖。

可信度

这个插件只在 GitHub 上发布,没有走过 npm 的分发链路。下面的梯子按 GitHub 通道的证据计算:补丁审计、钉在 commit 上的源码快照、隔离试装;L2 的「宿主启动」这一层还没有对 git 通道跑过,所以等级停在 L1。

63 健康分 D 扣分项下方逐条附证据
  • -5需要批准构建脚本才能装(本站不代跑第三方代码)warn
  • -10声明与实物不符:entry-missingmajor:['./lib/client.js', './lib/credentials.js', './lib/desktop-prefs.js', './lib/directory-picker.js', './lib/index.js', './lib/market.js']
  • -5声明与实物不符:types-missingwarn:['./lib/types/client/index.d.ts', './lib/types/credentials.d.ts', './lib/types/desktop-prefs.d.ts', './lib/types/directory-picker.d.ts', './
  • -10声明与实物不符:client-present-undeclaredmajor:['deepseek-harness/apps/web/tests/expected/access-confirmation/ui.expected.md', 'deepseek-harness/apps/web/tests/expected/clickable-links-ga
  • -5cordis entry id「desktop-shell」被 2 个包共用,同时安装会互相替换warn:dsh-plugin-desktop
  • -2没有 READMEminor

认证等级 未评级

  • L0静态结构与契约—契约不符:entry-missing
  • L1配置组合与依赖图—entry id desktop-shell 被 2 个包共用
  • L2隔离沙箱冒烟—需要批准构建脚本——本站不代跑第三方代码
  • L3运行时健康监控—未抽样(本层是抽样检测:没有会话不等于干净)
评分口径与作者信息

从 100 分开始按规则扣减:fail −20 / major −10 / warn −5 / minor −2;star 数、下载量、LLM 输出都不参与评分

维护者
—
仓库
https://github.com/coffeefreehans/harnessx
许可
MIT
最后发布
—
周下载
—
star
—

扫描状态:已扫描。能力是事实,不是缺陷; 周下载与 star 只作参考,不参与评分。

认证等级只回答四件事:包本身是否完整可解析(L0)、能不能与别的插件组合(L1)、隔离环境里装不装得上并起得来(L2)、抽样运行时有没有异常(L3)。依赖漏洞、仓库存活、下载量都不参与评级,只作为独立信号标注。可信 ≠ 无漏洞,上架 ≠ 推荐。

Node 要求^22.19.0 || >=24.0.0
第三方依赖0 个(纯自包含)
依赖安全公告已查询全部依赖,没有匹配到已公开的安全公告(含 DSH 框架包在内的 @deepseek-ai/* 不作查询——那是运行时自己的问题,不是插件的。)

返回首页