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

桌面安装包 Onenightcarnival/deepseek-harness-desktop

DeepSeek Harnessv0.4.1
Onenightcarnival4 天前有提交已提供中文文档扫描:高危

DeepSeek Harness 的非官方桌面安装包,支持 Windows 与…

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

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

自动兼容检查有告警:npm 同名包「deepseek-harness-desktop」归属 hzhe0083-source/deepseek-harness-desktop,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Onenightcarnival/deepseek-harness-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

npm 同名包「deepseek-harness-desktop」归属 hzhe0083-source/deepseek-harness-desktop,装到的可能不是本插件

展开查看检查明细 ↓

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 22:53:30

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 174 处,展示前 86 条)
  • 读取本地文件
    main.js:25
    uiLanguage = normalizeLanguage(JSON.parse(fs.readFileSync(path.join(app.getPath('userData'), 'ui-language.json'), 'utf8')))
  • 写入本地文件
    main.js:33
    try { fs.writeFileSync(path.join(app.getPath('userData'), 'ui-language.json'), JSON.stringify(language)) } catch { }
  • 请求外部主机api.github.com
    main.js:185
    const res = await electronNet.fetch(`https://api.github.com/repos/${UPDATE_REPO}/releases/latest`, {
  • 发起网络请求
    main.js:185
    const res = await electronNet.fetch(`https://api.github.com/repos/${UPDATE_REPO}/releases/latest`, {
  • 读取本地文件
    main.js:234
    if (fs.existsSync(path.join(packaged, ENTRY_REL))) return packaged
  • 写入本地文件
    main.js:267
    fs.writeFileSync(dest, fs.readFileSync(path.join(__dirname, 'win-spawn-shim.js')))
  • 请求外部主机registry.npmjs.org
    main.js:302
    const res = await electronNet.fetch('https://registry.npmjs.org/@deepseek-ai/dsh/latest', {
  • 发起网络请求
    main.js:302
    const res = await electronNet.fetch('https://registry.npmjs.org/@deepseek-ai/dsh/latest', {
  • 删除本地文件
    main.js:377
    fs.rmSync(dir, { recursive: true, force: true })
  • 写入本地文件
    main.js:378
    fs.mkdirSync(dir, { recursive: true })
  • 写入本地文件
    main.js:379
    fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify({ name: 'dsh-runtime', private: true }, null, 2))
  • 读取本地文件
    main.js:387
    const presets = JSON.parse(fs.readFileSync(path.join(bundledDshDir(), 'preset-plugins.json'), 'utf8'))
  • 执行外部命令来自配置/变量
    main.js:392
    const child = spawn(process.execPath, [...nodePreloadArgs(), pnpmCjs, '--config.minimum-release-age=0', '--config.auto-install-peers=false', 'add', `@
  • 读取本地文件
    main.js:411
    const appManifest = JSON.parse(fs.readFileSync(appManifestPath, 'utf8'))
  • 写入本地文件
    main.js:417
    fs.writeFileSync(appManifestPath, JSON.stringify(appManifest, null, 2))
  • 读取本地文件
    main.js:423
    for (const name of fs.readdirSync(runtimesDir())) {
  • 删除本地文件
    main.js:424
    if (name !== version) fs.rmSync(path.join(runtimesDir(), name), { recursive: true, force: true })
  • 删除本地文件
    main.js:428
    fs.rmSync(dir, { recursive: true, force: true })
  • 读取本地文件
    main.js:454
    const p = candidates.find((c) => c && fs.existsSync(c))
  • 写入本地文件
    main.js:476
    try { fs.writeFileSync(proxyStorePath(), JSON.stringify(c, null, 2)) } catch { }
  • 删除本地文件
    main.js:598
    fs.rmSync(dest, { recursive: true, force: true })
  • 删除本地文件
    main.js:891
    fs.rmSync(dir, { recursive: true, force: true })
  • 删除本地文件
    main.js:910
    try { fs.rmSync(stubDir, { recursive: true, force: true }) } catch { }
  • 执行外部命令来自配置/变量
    main.js:1297
    serverProc = spawn(process.execPath, ['--expose-internals', ...nodePreloadArgs(), entry, 'web', ...desktopPatchArgs(), ...pickerPatchArgs(), '--no-ope
  • 执行外部命令来自配置/变量
    main.js:1603
    const child = spawn(process.execPath, ['--expose-internals', ...nodePreloadArgs(), dshEntry(), ...args], {
  • 执行外部命令来自配置/变量
    main.js:1796
    const child = spawn(process.execPath, ['-e', script], { env, stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true })
  • 读取本地文件
    runtime.js:39
    const version = JSON.parse(fs.readFileSync(manifest, 'utf8')).version
  • 读取本地文件
    runtime.js:40
    return fs.existsSync(path.join(dir, ENTRY_REL)) ? version : null
  • 读取本地文件
    runtime.js:55
    try { entries = fs.readdirSync(runtimesDir) } catch { }
  • 读取本地文件
    runtime.js:241
    if (!fs.lstatSync(file).isFile()) continue
  • 读取本地文件
    runtime.js:242
    const text = fs.readFileSync(file, 'utf8')
  • 删除本地文件
    runtime.js:243
    if (text.includes('UV_CACHE_DIR') && text.includes('UV_PYTHON_INSTALL_DIR') && /[ /]tools[ /]uv[ /]uvx?(?: exe)?[" ]/.test(text)) fs.unlinkSync(fi
  • 发起网络请求
    proxy-forward.js:123
    const upstream = http.request(opts, (r) => {
  • 读取本地文件
    window-chrome.js:59
    const css = fs.readFileSync(path.join(__dirname, 'desktop.css'), 'utf8')
  • 读取本地文件
    vendor/deepseek-desktop/keybindings.js:12
    return await readFile(path, 'utf8');
  • 读取本地文件
    afterPack.js:19
    const src = candidates.find((p) => fs.existsSync(p))
  • 删除本地文件
    afterPack.js:31
    fs.rmSync(dest, { recursive: true, force: true })
  • 读取本地文件
    build/sync-official-browser.cjs:9
    const read = name => normalize(fs.readFileSync(path.join(vendor, 'src', name + '.ts'), 'utf8'))
  • 读取本地文件
    build/sync-official-browser.cjs:16
    if (normalize(fs.readFileSync(file, 'utf8')) !== text) throw new Error('Generated source differs: ' + file)
  • 写入本地文件
    build/sync-official-browser.cjs:17
    } else fs.writeFileSync(file, text)
  • 读取本地文件
    build/sync-official-browser.cjs:48
    const source = normalize(fs.readFileSync(preload, 'utf8'))
  • 执行外部命令来自配置/变量
    build/test-desktop-browser.cjs:10
    const run = spawnSync(process.env.DSHDESKTOP_TEST_ELECTRON || require('electron'), [__filename],
  • 写入本地文件
    build/test-desktop-browser.cjs:21
    fs.mkdirSync(home)
  • 读取本地文件
    build/test-desktop-browser.cjs:23
    const presets = JSON.parse(fs.readFileSync(path.join(runtime, 'preset-plugins.json'), 'utf8'))
  • 写入本地文件
    build/test-desktop-browser.cjs:25
    fs.mkdirSync(profile, { recursive: true })
  • 写入本地文件
    build/test-desktop-browser.cjs:26
    fs.writeFileSync(path.join(profile, 'package.json'), JSON.stringify({ name: 'dsh-profile-web', private: true,
  • 执行外部命令来自配置/变量
    build/test-desktop-browser.cjs:56
    kernel = spawn(process.execPath, ['--expose-internals', path.join(runtime, 'node_modules/@deepseek-ai/dsh/lib/bin.js'),
  • 写入本地文件
    build/test-desktop-browser.cjs:75
    if (event.level === 'error') fs.appendFileSync(path.join(work, 'console.log'), event.message + '\n')
  • 写入本地文件
    build/test-desktop-browser.cjs:151
    await main.webContents.capturePage(undefined, { stayHidden: true, stayAwake: true }).then(image => fs.writeFileSync(path.join(work, 'browser.png'), im
  • 写入本地文件
    build/test-desktop-browser.cjs:171
    fs.writeFileSync(path.join(work, 'failure.txt'), await js('document.body.innerText').catch(() => ''))
  • 执行外部命令固定命令
    build/test-desktop-browser.cjs:178
    if (process.platform === 'win32') spawnSync('taskkill.exe', ['/PID', String(kernel.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })
  • 执行外部命令来自配置/变量
    build/test-installer-copy.mjs:27
    execFileSync(sevenzip, ['a', '-bd', archive, '.'], { cwd: source, windowsHide: true, stdio: 'ignore' })
  • 执行外部命令来自配置/变量
    build/test-installer-copy.mjs:53
    execFileSync(compiler, ['/V2', script], { windowsHide: true, stdio: 'pipe' })
  • 执行外部命令来自配置/变量
    build/test-installer-copy.mjs:58
    const result = spawnSync(exe, ['/S'], { windowsHide: true, timeout })
  • 读取本地文件
    build/test-installer-copy.mjs:73
    const contents = await Promise.all([readFile(original), readFile(installed)])
  • 执行外部命令固定命令
    build/test-installer-copy.mjs:100
    const blocked = spawnSync('powershell.exe', ['-NoProfile', '-EncodedCommand', Buffer.from(lockScript, 'utf16le').toString('base64')], { windowsHide: t
  • 读取本地文件
    build/test-server-output.cjs:9
    const source = fs.readFileSync(path.join(__dirname, '../main.js'), 'utf8')
  • 写入本地文件
    build/test-uv-removal.cjs:12
    fs.writeFileSync(path.join(temporary, 'uvx.cmd'), windows)
  • 写入本地文件
    build/test-uv-removal.cjs:13
    fs.writeFileSync(path.join(temporary, 'uv'), mac)
  • 写入本地文件
    build/test-uv-removal.cjs:14
    fs.writeFileSync(path.join(temporary, 'uv.cmd'), '@echo off\r\n"C:\\custom\\uv.exe" %*\r\n')
  • 写入本地文件
    build/test-uv-removal.cjs:15
    fs.writeFileSync(path.join(temporary, 'uvx'), '#!/bin/sh\nexec /custom/uvx "$@"\n')
  • 写入本地文件
    build/test-uv-removal.cjs:16
    fs.writeFileSync(path.join(temporary, 'node.cmd'), 'keep')
  • 读取本地文件
    build/test-uv-removal.cjs:18
    assert.equal(fs.existsSync(path.join(temporary, 'uvx.cmd')), false)
  • 读取本地文件
    build/test-uv-removal.cjs:19
    assert.equal(fs.existsSync(path.join(temporary, 'uv')), false)
  • 读取本地文件
    build/test-uv-removal.cjs:20
    for (const file of ['uv.cmd', 'uvx', 'node.cmd']) assert.equal(fs.existsSync(path.join(temporary, file)), true)
  • 删除本地文件
    build/test-uv-removal.cjs:25
    fs.rmSync(temporary, { recursive: true, force: true })
  • 执行外部命令来自配置/变量
    build/test-window-chrome.cjs:15
    const run = spawnSync(process.env.DSHDESKTOP_TEST_ELECTRON || require('electron'), [__filename], { env, windowsHide: true, stdio: 'inherit', timeout:
  • 写入本地文件
    build/test-window-chrome.cjs:29
    fs.mkdirSync(output, { recursive: true })
  • 写入本地文件
    build/test-window-chrome.cjs:102
    fs.writeFileSync(path.join(output, name + '.png'), (await settings.webContents.capturePage(undefined, { stayHidden: true, stayAwake: true })).toPNG())
  • 执行外部命令来自配置/变量
    build/test-window-chrome.cjs:193
    kernel = spawn(process.execPath, ['--expose-internals', '--require', path.join(root, 'win-spawn-shim.js'), entry,
  • 写入本地文件
    build/test-window-chrome.cjs:211
    if (event.level === 'warning' || event.level === 'error') fs.appendFileSync(path.join(output, 'runtime-console.log'), event.message + '\n')
  • 写入本地文件
    build/test-window-chrome.cjs:227
    fs.writeFileSync(path.join(output, 'main-runtime.png'), (await main.webContents.capturePage(undefined, { stayHidden: true, stayAwake: true })).toPNG()
  • 写入本地文件
    build/test-window-chrome.cjs:263
    const captureMain = async name => fs.writeFileSync(path.join(output, name + '.png'), (await main.webContents.capturePage(undefined, { stayHidden: true
  • 写入本地文件
    build/test-windows-execution-level.cjs:15
    await fs.mkdir(output, { recursive: true })
  • 写入本地文件
    build/test-windows-execution-level.cjs:17
    await fs.copyFile(source, file)
  • 读取本地文件
    build/test-windows-execution-level.cjs:19
    const resources = NtExecutableResource.from(NtExecutable.from(await fs.readFile(file)))
  • 写入本地文件
    build/test-windows-execution-level.cjs:24
    await fs.writeFile(path.join(output, 'manifest.xml'), xml)
  • 执行外部命令运行时拼接
    stage-dsh.mjs:87
    execSync(`npm ${['ci', '--force', ...baseFlags, ...crossFlags].join(' ')}`, { cwd: dir, stdio: 'inherit' })
  • 执行外部命令运行时拼接
    stage-dsh.mjs:97
    execSync(`npm ${['install', `@deepseek-ai/dsh@${version}`, ...baseFlags, ...crossFlags].join(' ')}`, { cwd: dir, stdio: 'inherit', env: liveEnv })
  • 执行外部命令运行时拼接
    stage-dsh.mjs:101
    execSync(`npm ${['install', ...extraPackages, ...baseFlags, ...crossFlags].join(' ')}`, { cwd: dir, stdio: 'inherit', env: liveEnv })
  • 执行外部命令运行时拼接
    stage-dsh.mjs:160
    execSync(`npm ${['install', 'pnpm@11', ...baseFlags, '--omit=optional', ...crossFlags].join(' ')}`, { cwd: toolsDir, stdio: 'inherit' })
  • 请求外部主机registry.npmjs.org
    update-locks.mjs:45
    const res = await fetch(`https://registry.npmjs.org/${name.replace('/', '%2f')}`, {
  • 发起网络请求
    update-locks.mjs:45
    const res = await fetch(`https://registry.npmjs.org/${name.replace('/', '%2f')}`, {
  • 执行外部命令固定命令
    update-locks.mjs:312
    execSync('npm install --package-lock-only --force --ignore-scripts --no-audit --no-fund', { cwd: tmp, stdio: 'pipe' })
  • 读取本地文件
    win-spawn-shim.js:123
    try { if (fs.statSync(file).size > 256 * 1024) return } catch { }
  • 写入本地文件
    win-spawn-shim.js:125
    fs.appendFileSync(file, `${new Date().toISOString()} pid=${process.pid} ppid=${process.ppid} ${tag}: ${msg}\n`)
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.github.com、registry.npmjs.org

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

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

功能亮点

  • macOSdmg安装包
  • Electron打包壳

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Desktop DeepSeek Harness 的非官方桌面安装包,支持 Windows 与 macOS。当前内置内核:0.2.1-rc.5。 应用在本机随机端口运行 dsh Web UI。数据与配置位于 ~/.dsh,与命令行版共享。默认关窗退出;开启托盘模式后,关窗保留服务与任务。 安装包 | 版本 | 内容 | | 常规版 | 官方 dsh 与桌面壳 | | full 版(文件名含 -full) | 常规版 + 任务看板、SSH、better-sidebar | 任务看板与 SSH 来自 dsh-web。SSH 支持终端会话分离与重连。better-sidebar 提供文件管理、编辑预览、内嵌浏览器、终端、Git 与后台任务。 两种版本共享数据,可互相覆盖安装。full 预置插件每次启动同步,手动移除后会恢复;常规版不启用这些预置。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop

DeepSeek Harness 的非官方桌面安装包,支持 Windows 与 macOS。当前内置内核:0.2.1-rc.5。

应用在本机随机端口运行 dsh Web UI。数据与配置位于 ~/.dsh,与命令行版共享。默认关窗退出;开启托盘模式后,关窗保留服务与任务。

安装包

| 版本 | 内容 |
| 常规版 | 官方 dsh 与桌面壳 |
| full 版(文件名含 -full) | 常规版 + 任务看板、SSH、better-sidebar |

任务看板与 SSH 来自 dsh-web。SSH 支持终端会话分离与重连。better-sidebar 提供文件管理、编辑预览、内嵌浏览器、终端、Git 与后台任务。

两种版本共享数据,可互相覆盖安装。full 预置插件每次启动同步,手动移除后会恢复;常规版不启用这些预置。

| 平台 | 安装说明 |
| Windows | 未签名,可能显示 SmartScreen 提示;支持长路径与复制重试,错误日志为 %TEMP%\\dsh-install-copy.log |
| macOS | 未签名,使用右键打开或 xattr -cr "/Applications/DeepSeek Harness.app" |

Windows 桌面程序默认请求管理员权限,由系统 UAC 确认。内核和本地工具继承启动权限。

窗口与菜单

主窗口与配置中心使用一体化标题栏,并同步深浅主题;启动前跟随系统主题。菜单和配置窗口跟随主界面的中英文选择,首次启动使用系统语言。

左侧栏底部仅显示「设置」入口。

主窗口与配置中心的右键菜单:输入区域提供撤销、重做、剪切、复制、粘贴、全选;选中文本提供复制。浏览器标签页不提供右键菜单。

| 平台 | 标题栏与入口 |
| Windows | 原生窗口按钮;「应用 / 编辑」菜单;配置中心位于「应用 → 配置中心…」(Ctrl+,) |
| macOS | 原生红黄绿按钮、系统菜单;主内容延伸至顶部,窗口按钮融入侧栏;侧栏收起后保留切换与新建入口;「插件 → 配置中心…」 |
| Linux 开发环境 | 「插件 → 配置中心…」 |

启动

启动页显示应用标识与等待状态,覆盖在主界面之上;内核启动与重启期间显示,界面就绪后移除。鼠标侧键与键盘的后退、前进不离开主界面。

浏览器

右侧栏「开始 → 浏览器」打开独立网页标签;Windows / Linux 使用 Ctrl+T,macOS 使用 Cmd+T。地址栏支持 HTTP(S),包括本机开发服务;提供后退、前进、刷新和在系统浏览器中打开。快捷键可在内核的快捷键设置中修改。

- 网页由 Electron webview 加载。切换标签、会话、收起侧栏与浮动页面时保留页面状态。
- 同一工作区共享内存中的 Cookie 与网页存储;不同工作区隔离,应用退出后清除。
- 重启后保留标签标题和地址,点击恢复或刷新后加载;页面内存、未提交表单和历史栈不恢复。
- 网页没有 Node / Electron 权限,不能访问当前 dsh 服务;设备权限与下载关闭,允许的网页弹窗在侧栏新标签打开。
- 浏览器沿用配置中心的代理设置。本地文件使用文件预览。
- 浏览页面不会自动进入模型上下文;浏览器标签不提供 Agent 操作工具。

界面与导航使用内核自带的官方浏览器插件。桌面桥、网页实例管理与原生快捷键复用官方源码,来源及同步方式见 vendor/deepseek-desktop。

更新

更新由「帮助」菜单手动触发,第一项显示当前内核版本。

| 操作 | 来源 | 生效方式 |
| 检查应用更新 | GitHub Release | Windows 后台下载整包,立即重启或下次退出时安装;macOS 打开下载页 |
| 检查内核更新 | npm @deepseek-ai/dsh | 安装到用户数据目录 runtimes/<版本>/,重启生效;失败回退内置版本 |

内核仅支持同一版本线内升级,例如 0.2.1-rc.3 → 0.2.1-rc.5。跨版本线使用新安装包。

配置中心

| 页面 | 功能 |
| 插件 | 按 npm 包名、Git 来源、本地目录或 .tgz 安装;移除插件;重启生效 |
| 通用 | 启动、托盘与系统唤醒设置 |
| 代理 | 无代理、系统代理或手动代理;测试连接与 TLS 配置 |

目录安装采用软链。构建脚本审批在「插件 → 打开命令行窗口」中完成。

插件操作结果直接显示,命令输出位于可展开的「诊断详情」。

技能管理由 toolkit 配置中心插件提供,入口为主侧栏「技能」。桌面壳向插件传递旧停用目录,原有技能继续可用。

通用

所有选项默认关闭,切换即时生效。

| 选项 | 行为 |
| 开机自动启动 | 注册系统登录项 |
| 显示托盘图标 | 提供主窗口、配置中心与退出入口;macOS 显示菜单栏图标 |
| 启动时最小化到托盘 | 隐藏启动窗口 |
| 关闭时最小化到托盘 | 保留服务与任务;通过菜单退出,双击应用或托盘图标恢复窗口 |
| 运行任务时保持系统唤醒 | Agent 运行、输入排队或作业执行期间阻止系统休眠 |

Windows / Linux 的隐藏窗口选项依赖托盘图标。

代理

系统代理按目标地址读取 PAC 与例外列表。手动代理支持主机、端口、认证和例外列表(corp.com、.corp.com、10.、<local>)。

TLS 选项包含系统证书库、自定义 CA 和关闭证书校验。密码可选择记住,勾选后以明文保存在本机。模型、插件安装、内核升级与 MCP 共用代理,本机地址直连。保存后重启服务。

插件菜单

| 操作 | 行为 |
| 重新同步预置插件 | 清除当前版本的冲突排除记录,重启并恢复预置 |
| 打开命令行窗口 | 打开终端,PATH 包含应用的 dsh / pnpm / node / npx;沿用代理设置 |

长期使用 CLI 可将用户数据目录的 bin/ 加入 PATH。

Python MCP 环境

安装 @onenightcarnival/dsh-toolkit 或 @onenightcarnival/dsh-config-center 后,在「设置 → 环境依赖」里安装专属 uv 环境。桌面安装包不捆绑 uv/uvx。

安装完成后,当前配置档里的裸 uv / uvx 命令会转为专属路径;显式自定义路径保持不变。首次使用需联网下载 Python 与依赖。

本地构建

构建使用精确版本 Electron 44.0.0,产物位于 dist/。

node stage-dsh.mjs
npm install
npx electron-builder --win --x64
npx electron-builder --mac --arm64

设置 DSH_FLAVOR=full 选择 full 清单。开发调试在 staging 后运行 npm start。架构、文件职责和验证入口见 AGENTS.md。

预置插件

| 文件 | 内容 |
| plugins.json / plugins-<flavor>.json | 预置包与版本;stage 按 DSH_FLAVOR 选择 |
| desktop-patch.yml | 禁用、覆盖或挂载组合条目;通过 --patch 在用户配置档层之后应用 |
| locks/ | 各 flavor 的完整安装锁 |

带 dsh.bundle 的包可直接登记到清单。其他插件通过补丁的 insert 挂载;带界面的插件须成对挂载 host 与 client-ui。插件版本必须匹配内核版本线。

用户插件通过 dsh plugin 管理;用户覆盖层为 ~/.dsh/profiles/web/cordis.patch.yml。

发版

1. 修改预置或内核后,运行 node update-locks.mjs <dsh版本> ["插件@版本"...] 更新锁。
2. 运行 staging 与相应验证,提交改动。
3. 推送与发布版本对应的 vX.Y.Z 标签。

.github/workflows/release.yml 在 Windows 与 macOS runner 原生构建。版本号取自标签,产物与 SHA256SUMS.txt 发布到 GitHub Release。应用更新元数据为常规版的 latest.yml 与 full 版的 full.yml。

协议

MIT。应用图标改自上游 favicon。
预览分享卡片长什么样 ↓Onenightcarnival/deepseek-harness-desktop
分享 · DeepSeek Harness Hub
Onenightcarnival/deepseek-harness-desktop

DeepSeek Harness 的非官方桌面安装包,支持 Windows 与…

回到顶部