其他 · v0.1.9
harnessx-desktop
DeepSeek HarnessX: an Electron desktop client composed around DeepSeek Harness
该插件尚未翻译,显示作者原文。
仅 GitHub
认证 未评级已扫描 ✓健康 D/63星 —
18 项能力安装命令
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 的包是不是本项目自己的。插入第三方代码要格外留意。
- 改写用户 profile
profile-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 |
| 改写用户 profile | profile-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/* 不作查询——那是运行时自己的问题,不是插件的。) |
DSH