🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面打包器 wess09/DeepSeekHarnessDesktop

DeepSeek Harnessv0.4.1
wess0981 天前有提交已提供中文文档扫描:含敏感能力

DeepSeekHarness桌面端打包

55.4/100
综合分
111
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wess09/DeepSeekHarnessDesktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · desktop
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 81 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包deepseek-harness-desktop @ 0.4.1
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 20:44:59

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 94 处,展示前 75 条)
  • 读取本地文件
    app/main.js:50
    if (fs.existsSync(p)) return p
  • 发起网络请求
    app/main.js:57
    const req = http.get(
  • 读取本地文件
    app/main.js:86
    if (!fs.existsSync(node)) { showError(`Node 运行时缺失:${node}`); return false }
  • 读取本地文件
    app/main.js:87
    if (!fs.existsSync(path.join(cwd, 'apps', 'cli', 'src', 'bin.ts'))) { showError(`harness 目录不完整:${cwd}`); return false }
  • 写入本地文件
    app/main.js:90
    fs.mkdirSync(path.dirname(logFile()), { recursive: true })
  • 执行外部命令来自配置/变量
    app/main.js:98
    child = spawn(node, ['--import', 'tsx/esm', 'apps/cli/src/bin.ts', 'web'], {
  • 执行外部命令固定命令
    app/main.js:125
    spawnSync('taskkill', ['/pid', String(serverProcess.pid), '/T', '/F'], { windowsHide: true })
  • 删除本地文件
    build/assemble.js:19
    function rmrf(p) { fs.rmSync(p, { recursive: true, force: true }) }
  • 执行外部命令来自配置/变量
    build/assemble.js:23
    const r = spawnSync(cmd, args, { stdio: 'inherit' })
  • 写入本地文件
    build/assemble.js:29
    fs.mkdirSync(dstDir, { recursive: true })
  • 读取本地文件
    build/assemble.js:42
    if (!fs.existsSync(path.join(electronDist, 'electron.exe'))) fail(`electron dist 不存在: ${electronDist}`)
  • 读取本地文件
    build/assemble.js:43
    if (!fs.existsSync(path.join(proj, 'resources', 'node', 'node.exe'))) fail('node.exe 不存在: resources\\node')
  • 读取本地文件
    build/assemble.js:45
    if (!fs.existsSync(path.join(electronDist, 'Electron.app'))) fail(`Electron.app 不存在: ${electronDist}`)
  • 读取本地文件
    build/assemble.js:47
    if (!fs.existsSync(path.join(electronDist, 'electron'))) fail(`electron dist 不存在: ${electronDist}`)
  • 读取本地文件
    build/assemble.js:49
    if (!fs.existsSync(path.join(proj, 'resources', 'harness', 'apps', 'cli', 'src', 'bin.ts'))) {
  • 写入本地文件
    build/assemble.js:54
    fs.mkdirSync(out, { recursive: true })
  • 写入本地文件
    build/assemble.js:63
    fs.copyFileSync(path.join(electronDist, 'electron.exe'), path.join(out, 'DeepSeekHarness.exe'))
  • 写入本地文件
    build/assemble.js:75
    fs.mkdirSync(staging, { recursive: true })
  • 写入本地文件
    build/assemble.js:78
    fs.renameSync(staging, appDir)
  • 写入本地文件
    build/assemble.js:79
    fs.renameSync(path.join(macosDir, 'Electron'), path.join(macosDir, 'DeepSeekHarness'))
  • 读取本地文件
    build/assemble.js:86
    if (!fs.existsSync(src1024)) fail(`缺少 ${src1024}(先运行 convert-icon.js)`)
  • 执行外部命令来自配置/变量
    build/build-harness.js:17
    const r = spawnSync(cmd, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' })
  • 读取本地文件
    build/build-harness.js:24
    if (!fs.existsSync(path.join(h, 'package.json'))) {
  • 读取本地文件
    build/build-harness.js:30
    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))
  • 写入本地文件
    build/build-harness.js:32
    fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2))
  • 写入本地文件
    build/build-harness.js:33
    fs.writeFileSync(path.join(h, '.npmrc'), 'manage-package-manager-versions=false\nnode-linker=hoisted\n')
  • 删除本地文件
    build/build-harness.js:38
    fs.rmSync(path.join(h, '.git'), { recursive: true, force: true })
  • 读取本地文件
    build/convert-icon.js:13
    return sharp(fs.readFileSync(SRC), { density: 300 })
  • 写入本地文件
    build/convert-icon.js:26
    fs.writeFileSync(OUT, ico)
  • 写入本地文件
    build/convert-icon.js:30
    fs.writeFileSync(path.join(dir, 'icon-256.png'), pngs[6])
  • 写入本地文件
    build/convert-icon.js:31
    fs.writeFileSync(path.join(dir, 'icon-1024.png'), await renderPng(1024))
  • 读取本地文件
    build/download-node.js:23
    for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
  • 写入本地文件
    build/download-node.js:34
    fs.mkdirSync(destDir, { recursive: true })
  • 写入本地文件
    build/download-node.js:36
    fs.mkdirSync(tmp, { recursive: true })
  • 发起网络请求
    build/download-node.js:40
    const res = await fetch(url)
  • 写入本地文件
    build/download-node.js:42
    fs.writeFileSync(archive, Buffer.from(await res.arrayBuffer()))
  • 执行外部命令固定命令
    build/download-node.js:45
    const r = spawnSync('tar', ['-xf', archive, '-C', tmp], { stdio: 'inherit' })
  • 写入本地文件
    build/download-node.js:52
    fs.copyFileSync(bin, target)
  • 写入本地文件
    build/download-node.js:53
    if (process.platform !== 'win32') fs.chmodSync(target, 0o755)
  • 删除本地文件
    build/download-node.js:55
    fs.rmSync(tmp, { recursive: true, force: true })
  • 写入本地文件
    build/materialize.js:15
    function copyFile(src, dst) { fs.copyFileSync(src, dst) }
  • 写入本地文件
    build/materialize.js:19
    fs.mkdirSync(dst, { recursive: true })
  • 读取本地文件
    build/materialize.js:20
    for (const e of fs.readdirSync(src, { withFileTypes: true })) {
  • 写入本地文件
    build/materialize.js:33
    fs.mkdirSync(dst, { recursive: true })
  • 读取本地文件
    build/materialize.js:34
    for (const e of fs.readdirSync(src, { withFileTypes: true })) {
  • 写入本地文件
    build/materialize.js:48
    fs.mkdirSync(dst, { recursive: true })
  • 读取本地文件
    build/materialize.js:49
    for (const e of fs.readdirSync(realTarget, { withFileTypes: true })) {
  • 读取本地文件
    build/materialize.js:69
    for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
  • 删除本地文件
    build/materialize.js:74
    try { fs.unlinkSync(p) } catch {}
  • 删除本地文件
    build/materialize.js:78
    fs.rmdirSync(p)
  • 删除本地文件
    build/materialize.js:81
    fs.unlinkSync(p)
  • 读取本地文件
    build/materialize.js:99
    for (const e of fs.readdirSync(d, { withFileTypes: true })) {
  • 写入本地文件
    build/materialize3.js:14
    fs.mkdirSync(dst, { recursive: true })
  • 读取本地文件
    build/materialize3.js:15
    for (const e of fs.readdirSync(src, { withFileTypes: true })) {
  • 写入本地文件
    build/materialize3.js:22
    st.isDirectory() ? copyDir(r, d, true) : fs.copyFileSync(r, d)
  • 写入本地文件
    build/materialize3.js:23
    } else fs.copyFileSync(s, d)
  • 读取本地文件
    build/materialize3.js:29
    for (const g of fs.readdirSync(path.join(H, 'packages'))) {
  • 读取本地文件
    build/materialize3.js:31
    if (!fs.statSync(gd).isDirectory()) continue
  • 读取本地文件
    build/materialize3.js:32
    for (const p of fs.readdirSync(gd)) {
  • 读取本地文件
    build/materialize3.js:34
    if (fs.statSync(pd).isDirectory() && fs.existsSync(path.join(pd, 'package.json'))) pkgs.push(pd)
  • 读取本地文件
    build/materialize3.js:37
    for (const v of fs.readdirSync(path.join(H, 'vendor'))) {
  • 写入本地文件
    build/materialize3.js:44
    fs.mkdirSync(DSAI, { recursive: true })
  • 删除本地文件
    build/materialize3.js:68
    try { fs.unlinkSync(p); deleted++ } catch {}
  • 删除本地文件
    build/materialize3.js:72
    fs.unlinkSync(p)
  • 删除本地文件
    build/materialize3.js:76
    fs.unlinkSync(p)
  • 写入本地文件
    build/materialize3.js:77
    fs.copyFileSync(r, p)
  • 删除本地文件
    build/trim.js:17
    fs.rmSync(out, { recursive: true, force: true })
  • 读取本地文件
    build/trim.js:27
    try { entries = fs.readdirSync(dir, { withFileTypes: true }) } catch { return }
  • 读取本地文件
    build/trim.js:33
    if (fs.existsSync(dsai)) {
  • 删除本地文件
    build/trim.js:34
    fs.rmSync(dsai, { recursive: true, force: true })
  • 读取本地文件
    build/trim.js:44
    if (fs.existsSync(base)) walkDirs(base)
  • 读取本地文件
    build/trim.js:51
    if (fs.existsSync(feSrc)) {
  • 删除本地文件
    build/trim.js:52
    fs.rmSync(feDst, { recursive: true, force: true })
  • 读取本地文件
    build/trim.js:59
    console.log('web-frontend copied:', fs.existsSync(path.join(feDst, 'dist', 'index.html')))
  • 读取本地文件
    build/trim.js:65
    try { entries = fs.readdirSync(dir, { withFileTypes: true }) } catch { return }
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness 桌面版 把 deepseek-ai/deepseek-harness 打包成三平台桌面应用: Electron 桌面壳 + 内置 Node 运行时 + 完整 Harness 环境,双击即用。 DeepSeek ✨ 特性 - 一键启动:双击 DeepSeekHarness.exe → 自动拉起后端 → 直接打开 DeepSeek Harness Web UI - 内置 Node 24:自包含运行时,用户无需安装 Node.js - 完整环境:打包了 Harness 全部依赖(链接已物化为真实文件) - 无边框窗口:UI 铺满窗口,右上角内嵌最小化 / 最大化 / 关闭按钮 - 单实例:重复启动不会拉起多个后端 - 免管理员:Windows 安装到 %LocalAppData%\Programs\DeepSeek Harness 📦 产物 | 平台 | 文件 | 说明 | | Windows | installers/DeepSeekHarnessSetup-.exe | Inno Setup 一键安装包 | | Windows | build/DeepSeekHarnessApp/DeepSeekHarness.exe | 免安装版(直接运行) |
展开完整文档(README 剩余 1 节)
DeepSeek Harness 桌面版

把 deepseek-ai/deepseek-harness 打包成三平台桌面应用: Electron 桌面壳 + 内置 Node 运行时 + 完整 Harness 环境,双击即用。

DeepSeek

✨ 特性

- 一键启动:双击 DeepSeekHarness.exe → 自动拉起后端 → 直接打开 DeepSeek Harness Web UI
- 内置 Node 24:自包含运行时,用户无需安装 Node.js
- 完整环境:打包了 Harness 全部依赖(链接已物化为真实文件)
- 无边框窗口:UI 铺满窗口,右上角内嵌最小化 / 最大化 / 关闭按钮
- 单实例:重复启动不会拉起多个后端
- 免管理员:Windows 安装到 %LocalAppData%\Programs\DeepSeek Harness

📦 产物

| 平台 | 文件 | 说明 |
| Windows | installers/DeepSeekHarnessSetup-.exe | Inno Setup 一键安装包 |
| Windows | build/DeepSeekHarnessApp/DeepSeekHarness.exe | 免安装版(直接运行) |
| macOS | installers/DeepSeekHarness-macOS-<arch>-<ver>.dmg | 应用镜像(.app,ad-hoc 签名) |
| Linux | installers/DeepSeekHarness-linux-<arch>-<ver>.tar.gz | 免安装压缩包(解压即用) |
| Linux | installers/deepseek-harness_<ver>_<arch>.deb | Debian/Ubuntu 安装包 |

三平台均由 GitHub Actions 自动构建(.github/workflows/build.yml 矩阵),推送 v 标签时自动发布到 Release;也可 workflow_dispatch 手动触发。

🗂 目录结构

app/ Electron 桌面应用源码 main.js 主进程:启动后端、注入窗口控制按钮 preload.js / titlebar-preload.js preload 脚本 renderer/ 渲染页面 build/ 构建脚本与产物(跨平台,Node 实现) build-harness.js 克隆 deepseek-harness、准备 .npmrc、pnpm 构建 materialize3.js node_modules 链接物化(消除 junction/符号链接) download-node.js 按平台下载内置 Node 运行时(win/darwin/linux × x64/arm64) trim.js 精简 harness(跨平台版 trim.ps1) assemble.js 组装应用目录(Windows robocopy / POSIX cp -aL) convert-icon.js SVG -> ICO(png-to-ico)+ PNG 源图 assemble.ps1 / trim.ps1 Windows 本地构建脚本(与 assemble.js/trim.js 等价) setup.iss Inno Setup 安装脚本(本地/CI 均可用) log.svg 应用图标(DeepSeek logo)

🔧 构建流程

本地需要:Node.js ≥ 22、pnpm 10(注意:必须用 pnpm 10,
pnpm 11 移除了 hoisted linker);Windows 额外需要 Inno Setup 7。
CI 三平台全自动,无需本地环境。

1. 准备 Harness 依赖(pnpm 10 + hoisted)

node build/build-harness.js # 克隆 → 删 packageManager → .npmrc(hoisted) → pnpm install → pnpm build

2. 物化链接 + 精简

node build/materialize3.js resources/harness # junction/符号链接 → 真实文件
node build/trim.js # 删除冗余 @deepseek-ai 副本、拷贝 web 前端

3. 运行时 + 组装

node build/download-node.js v24.14.0 # 内置 Node(按当前平台/架构)
npm install # electron + sharp + png-to-ico
node build/convert-icon.js log.svg build/app.ico
node build/assemble.js # 组装到 build/DeepSeekHarnessApp

4. 打包

Windows
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" "/DProjectDir=$((Get-Location).Path)" setup.iss
macOS
hdiutil create -volname "DeepSeek Harness" -srcfolder build/DeepSeekHarnessApp/DeepSeekHarness.app -ov -format UDZO installers/DeepSeekHarness-macOS-$(uname -m).dmg
Linuxbash
tar -C build/DeepSeekHarnessApp -czf installers/DeepSeekHarness-linux.tar.gz DeepSeekHarness

🚀 使用

1. 双击 DeepSeekHarnessSetup-*.exe 安装(免管理员,自动建桌面快捷方式)
2. 双击桌面「DeepSeek Harness」图标
3. 首次使用:在 Web 界面设置 DeepSeek API Key

⚠️ 注意

- 用户数据存放在 ~/.dsh(与安装目录分离),卸载后保留
- 服务监听 http://127.0.0.1:3080,关闭窗口即停止

📄 许可

MIT。Harness 本体版权归 DeepSeek AI 所有,见上游仓库。
预览分享卡片长什么样 ↓wess09/DeepSeekHarnessDesktop
分享 · DeepSeek Harness Hub
wess09/DeepSeekHarnessDesktop

DeepSeekHarness桌面端打包

回到顶部