把命令行工具打包成离线可用的桌面应用并自动跟随上游更新
30.2/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add tuterx/dsh-desktop该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · desktop
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 53 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 10:40:10
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0🔴 扫描:高危尚无人工评估
静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。
命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 61 处,展示前 52 条)
- 读取本地文件electron/main.cjs:55
nodeDir: existsSync(candidates[0]) ? candidates[0] : candidates[2], - 读取本地文件electron/main.cjs:56
dshDir: existsSync(candidates[1]) ? candidates[1] : candidates[3], - 读取本地文件electron/main.cjs:65
return candidates.find((p) => existsSync(p)) - 写入本地文件electron/main.cjs:78
mkdirSync(dir, { recursive: true }) - 写入本地文件electron/main.cjs:86
if (!logStream) logStream = createWriteStream(logFile(), { flags: 'a' }) - 执行外部命令来自配置/变量electron/main.cjs:135
const proc = spawn(nodeBin, args, { - 读取本地文件electron/main.cjs:161
if (!existsSync(pnpmCli) || !storeDir) { - 读取本地文件electron/main.cjs:178
if (!existsSync(nodeBin)) { - 读取本地文件electron/main.cjs:181
if (!existsSync(dshBin)) { - 执行外部命令来自配置/变量electron/main.cjs:188
serverProc = spawn(nodeBin, args, { - 发起网络请求electron/main.cjs:222
const req = http.get(url, { timeout: 2000 }, (r) => { - 执行外部命令固定命令electron/main.cjs:249
try { execFile('taskkill', ['/pid', String(proc.pid), '/T', '/F'], () => {}) } catch { } - 写入本地文件electron/main.cjs:561
mkdirSync(dir, { recursive: true }) - 写入本地文件electron/main.cjs:562
writeFileSync(join(dir, 'ignored.json'), JSON.stringify({ ignoredTag: tag })) - 写入本地文件electron/main.cjs:581
mkdirSync(dir, { recursive: true }) - 写入本地文件electron/main.cjs:582
writeFileSync(join(dir, 'dismissed.json'), JSON.stringify({ dismissedTag: tag })) - 删除本地文件递归electron/main.cjs:713
rmSync(tmp, { recursive: true, force: true }) - 执行外部命令固定命令electron/main.cjs:714
execFileSync('ditto', ['-x', '-k', pendingUpdate.zipPath, tmp], { stdio: 'ignore' }) - 执行外部命令固定命令electron/main.cjs:727
? spawn('cmd.exe', ['/c', scriptPath, - 执行外部命令固定命令electron/main.cjs:730
: spawn('/bin/sh', [scriptPath, - 读取本地文件electron/appearance.js:36
return { ...DEFAULTS, ...JSON.parse(readFileSync(configPath(), 'utf8')) } - 写入本地文件electron/appearance.js:43
mkdirSync(app.getPath('userData'), { recursive: true }) - 写入本地文件electron/appearance.js:44
writeFileSync(configPath(), JSON.stringify(cfg, null, 2)) - 发起网络请求electron/updater.js:106
const req = https.get(url, { - 发起网络请求electron/updater.js:187
const res = await net.fetch(url, { headers: { Range: 'bytes=0-0' } }) - 发起网络请求electron/updater.js:220
const res = await net.fetch(url, { headers: { Range: `bytes=${part.start + part.size}-${part.end}` } }) - 写入本地文件electron/updater.js:223
file = createWriteStream(part.path, { flags: part.size > 0 ? 'a' : 'w' }) - 写入本地文件electron/updater.js:260
mkdirSync(dir, { recursive: true }) - 读取本地文件electron/updater.js:265
if (statSync(finalPath).size === latest.size) return finalPath - 读取本地文件electron/updater.js:281
try { size = statSync(path).size } catch { } - 删除本地文件electron/updater.js:301
try { unlinkSync(finalPath) } catch { } - 写入本地文件electron/updater.js:302
const out = createWriteStream(finalPath) - 读取本地文件electron/updater.js:306
const rs = createReadStream(p.path) - 读取本地文件electron/updater.js:315
if (statSync(finalPath).size !== total) throw new Error('文件校验失败: 大小不符') - 删除本地文件electron/updater.js:316
for (const p of parts) { try { unlinkSync(p.path) } catch { } } - 发起网络请求electron/updater.js:325
const response = await net.fetch(latest.assetUrl, { redirect: 'follow' }) - 写入本地文件electron/updater.js:330
const file = createWriteStream(target) - 读取本地文件build/afterPack.js:37
if (!fs.existsSync(path.join(dstCli, 'node_modules', 'pnpm', 'bin', 'pnpm.cjs'))) { - 读取本地文件build/afterPack.js:38
if (!fs.existsSync(path.join(srcCli, 'node_modules'))) { - 读取本地文件build/afterPack.js:51
const missing = Object.entries(checks).filter(([, p]) => !fs.existsSync(p)).map(([k]) => k) - 读取本地文件build/afterPack.js:59
if (!fs.existsSync(source)) { - 写入本地文件build/afterPack.js:69
fs.mkdirSync(path.dirname(target), { recursive: true }) - 执行外部命令运行时拼接build/afterPack.js:70
execSync(`rsync -a --links "${source}/" "${target}/"`, { stdio: 'inherit' }) - 读取本地文件build/afterPack.js:71
console.log(`[afterPack] done: ${fs.readdirSync(target).length} top-level entries`) - 发起网络请求plugins/dsh-host-electron/src/electron-main.cjs:107
const response = await net.fetch(target, { - 发起网络请求plugins/dsh-host-electron/src/electron-main.cjs:303
const response = await net.fetch(target, { method: request.method }) - 读取本地文件plugins/dsh-host-electron/src/index.ts:67
if (configPath && existsSync(configPath)) return configPath - 读取本地文件plugins/dsh-host-electron/src/index.ts:72
const rel = readFileSync(join(pkgDir, 'path.txt'), 'utf8').trim() - 读取本地文件plugins/dsh-host-electron/src/index.ts:74
if (existsSync(bin)) return bin - 读取本地文件plugins/dsh-host-electron/src/index.ts:87
if (existsSync(c)) return c - 读取本地文件plugins/dsh-host-electron/src/index.ts:114
if (!existsSync(mainScript) || !existsSync(preloadScript)) { - 执行外部命令来自配置/变量plugins/dsh-host-electron/src/index.ts:124
const child = spawn(electronPath, [mainScript], {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 命令行工具打包桌面应用
- 离线可用
- 自动跟随上游更新
DeepSeek Harness 桌面应用——从上游自动构建 + BETA 版 dsh-host-electron 插件
README
由 DeepSeek 最新模型翻译生成dsh-desktop
把 DeepSeek Harness(dsh)打包成原生 macOS / Windows 桌面应用,并自动跟随上游仓库更新。
核心是桌面端(Electron 壳 + 内嵌 dsh 运行时,零依赖、离线可用);仓库同时包含 beta 插件 plugins/dsh-host-electron(以 dsh 原生插件方式运行桌面端)。
产物
- macOS: release/DeepSeek-Harness--arm64.dmg — 可安装的桌面应用(Apple Silicon)
- Windows: release/DeepSeek-Harness--win-x64.zip — 绿色版(解压即用)
- 应用内含完整 dsh 运行时(自带的 Node 24 + 上游 workspace),用户零网络依赖; Windows 首次启动时自动用捆绑的离线 store 安装依赖(约 10 秒)
自动跟随上游
.github/workflows/auto-build-dmg.yml(macOS)与 auto-build-win.yml(Windows)每 6 小时检查一次上游 deepseek-ai/deepseek-harness 的 HEAD:
- 上游有新 commit → 自动构建 → 以 dsh- 为 tag 发布到 GitHub Release
展开完整文档(README 剩余 1 节)
dsh-desktop 把 DeepSeek Harness(dsh)打包成原生 macOS / Windows 桌面应用,并自动跟随上游仓库更新。 核心是桌面端(Electron 壳 + 内嵌 dsh 运行时,零依赖、离线可用);仓库同时包含 beta 插件 plugins/dsh-host-electron(以 dsh 原生插件方式运行桌面端)。 产物 - macOS: release/DeepSeek-Harness--arm64.dmg — 可安装的桌面应用(Apple Silicon) - Windows: release/DeepSeek-Harness--win-x64.zip — 绿色版(解压即用) - 应用内含完整 dsh 运行时(自带的 Node 24 + 上游 workspace),用户零网络依赖; Windows 首次启动时自动用捆绑的离线 store 安装依赖(约 10 秒) 自动跟随上游 .github/workflows/auto-build-dmg.yml(macOS)与 auto-build-win.yml(Windows)每 6 小时检查一次上游 deepseek-ai/deepseek-harness 的 HEAD: - 上游有新 commit → 自动构建 → 以 dsh- 为 tag 发布到 GitHub Release - 上游无变化 → 跳过(不重复构建) - 也可以在 Actions 页面手动触发 workflow_dispatch 本地构建 npm install # electron + electron-builder npm run prepare:resources # 拉上游 → 构建 → 下载 Node 24 → resources/ npm run dist # macOS: electron-builder → release/.dmg npm run dist:win # Windows: zip 绿色版 → release/.zip 只重新生成图标: npm run icon Windows 注意:dist:win 需要 Git Bash(bash)与 pnpm(corepack enable)。 首次构建从 npmmirror 下载 Electron/Node 二进制,网络不通时可用 NODE_MIRROR / ELECTRON_MIRROR / ELECTRON_BUILDER_BINARIES_MIRROR 环境变量切换镜像,UPSTREAM_REPO 可指向上游镜像仓库。 架构 macOS (DeepSeek Harness.app) DeepSeek Harness.app ├── Electron 主进程 (electron/main.cjs) │ ├── 选空闲端口 → spawn resources/node/bin/node │ │ resources/dsh/apps/cli/lib/bin.js web --host 127.0.0.1 --port │ ├── 启动闪屏 → 轮询端口就绪 → BrowserWindow 加载 http://127.0.0.1: │ └── 退出时 SIGTERM 整个 dsh 进程组(6s 后 SIGKILL 兜底)— 无孤儿进程 └── Contents/Resources ├── node/ 独立 Node 24 runtime(dsh engines: ^22.19 || >=24) └── dsh/ 上游 workspace 完整闭包(apps/cli/lib + apps/web/dist + node_modules) Windows (win-unpacked/) win-unpacked/ ├── DeepSeek Harness.exe (Electron 主进程,逻辑同 macOS 版) └── resources/ ├── node.exe 独立 Node 24 runtime(win-x64) └── dsh/ 上游 workspace 完整闭包(apps/cli/lib + apps/web/dist + node_modules) 关键工程决策 | 决策 | 原因 | | 启动器模式(spawn dsh web + HTTP 加载) | 分发最稳定;只依赖 dsh web CLI,对上游内部 API 免疫 | | 捆绑独立 Node 24 | Electron 自带 Node 不满足 dsh engines(需 ^22.19 \|\| >=24) | | macOS afterPack rsync 复制 node_modules | electron-builder 无法解析 pnpm 符号链接布局,会静默丢弃整个 node_modules;POSIX 下 pnpm symlink 是相对的,rsync --links 可原样保留 | | Windows 首次启动现场安装依赖 | pnpm 在 Windows 的 junction 是绝对路径链接且存在依赖环(vendor/cordis ↔ vendor/include),任何拷贝/归档要么产生死链要么无限递归——node_modules 不进安装包,首次启动用捆绑的离线 store 跑 pnpm install --offline,链接生成在用户安装路径上,天然自包含 | | Windows afterPack 校验 | 钩子只校验离线资产(pnpm-cli / pnpm-store / dsh / node)是否落包,缺失即中止构建 | | 内嵌上游 git 仓库(depth 1) | 每次构建 git fetch + reset --hard,实现自动跟随;fetch 失败但本地 HEAD 与上次构建一致时跳过(幂等),不一致则硬失败 | | npmmirror 镜像 | Electron / Node 二进制从 GitHub 下载慢或超时,CI 与本地构建均走镜像 | 目录 dsh-desktop/ ├── electron/ # 应用主进程 + preload + 启动闪屏 ├── scripts/ │ ├── prepare.sh # 拉上游 → 构建 → 收集闭包(幂等,HEAD 未变则跳过) │ ├── build-dmg.sh # macOS: prepare + electron-builder │ ├── build-win.sh # Windows: prepare + electron-builder │ └── icon.sh # favicon.svg → icon.icns ├── build/afterPack.js # 打包后处理 node_modules(mac 复制 / win 重建) ├── assets/icon.icns # DeepSeek 鲸鱼图标(macOS;Windows 用 icon.png) └── .github/workflows/ # 自动跟随上游 + 发布(macOS + Windows) 已知限制 - 未签名:macOS 本地构建的 DMG 无 Developer ID 签名(Gatekeeper 拦截时右键 → 打开);Windows zip 无 Authenticode 签名(SmartScreen 提示 "仍要运行")。要消除提示需配置 CSC_LINK/CSC_KEY_PASSWORD 证书。 - macOS 仅构建 arm64(Apple Silicon);Windows 仅 x64。 - 上游为开发者预览版,构建可能偶发失败——CI 会跳过该次发布,下个周期重试。 - Windows 为 zip 绿色版:首次启动需联网无关的依赖安装(捆绑离线 store,约 10 秒);NSIS 安装版因 pnpm junction 的绝对路径/循环限制暂未提供。 Beta 备选方案:dsh-host-electron 插件(路径③) 仓库还包含一个 beta 插件 plugins/dsh-host-electron/——以 dsh 原生插件方式运行桌面端(DSH_DESKTOP=1 dsh web,dsh 进程自己拉起 Electron,RPC 走 IPC 桥接)。与打包版(路径②)互补: | | 打包版 (本工程) | 插件版 (beta) | | 形态 | 独立 .app,用户零依赖 | dsh plugin 安装的 Cordis 插件 | | 上游兼容 | 只依赖 dsh web CLI | 依赖 ctx.webServer 等内部 API | | 构建 | npm run dist | pnpm --filter ... build 后发布 npm | | 适合 | 分发、稳定使用 | 插件生态、源码集成 | 详见 plugins/dsh-host-electron/README.md。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
tuterx/dsh-desktop
把命令行工具打包成离线可用的桌面应用并自动跟随上游更新
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2
这是你的仓库?认领条目