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

一键更新器 Takinggg/dsh-updater

DeepSeek Harness
Takinggg76 天前有提交已提供中文文档扫描:含敏感能力

增量拉取 npm 包并备份回滚,安全升级引擎

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Takinggg/dsh-updater
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 76 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 58 处,展示前 50 条)
  • 删除本地文件递归
    lib/engine.js:193
    await rm(stage, { recursive: true, force: true })
  • 写入本地文件
    lib/engine.js:194
    await mkdir(stage, { recursive: true })
  • 写入本地文件
    lib/engine.js:196
    await writeFile(join(stage, 'package.json'), JSON.stringify({
  • 写入本地文件
    lib/engine.js:201
    await writeFile(join(stage, '.npmrc'), 'ignore-scripts=false\n')
  • 读取本地文件
    lib/engine.js:205
    const pkg = JSON.parse(await readFile(`${dir}/package.json`, 'utf8'))
  • 读取本地文件
    lib/engine.js:211
    await access(dir, constants.W_OK)
  • 执行外部命令来自配置/变量
    lib/engine.js:223
    const child = spawn(cmd, args, {
  • 发起网络请求
    lib/engine.js:299
    const res = await fetch(url, {
  • 删除本地文件
    lib/engine.js:384
    await rm(successFile(), { force: true })
  • 读取本地文件
    lib/engine.js:433
    const raw = JSON.parse(await readFile(successFile(), 'utf8'))
  • 写入本地文件
    lib/engine.js:443
    await writeFile(successFile(), JSON.stringify({
  • 删除本地文件
    lib/engine.js:451
    await rm(successFile(), { force: true })
  • 删除本地文件递归
    lib/engine.js:458
    await rm(runtime.backupDir, { recursive: true, force: true })
  • 写入本地文件
    lib/engine.js:460
    await writeFile(join(runtime.backupDir, '.dsh-updater-from'), `${current}\n`)
  • 读取本地文件
    lib/engine.js:468
    await access(runtime.backupDir, constants.R_OK)
  • 删除本地文件递归
    lib/engine.js:473
    await rm(runtime.engineDir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/engine.js:599
    await rm(runtime.engineDir, { recursive: true, force: true })
  • 读取本地文件
    lib/resolve.js:41
    if (!dest || !existsSync(binJs)) return false
  • 写入本地文件
    lib/resolve.js:44
    await writeFile(dest, `@echo off\r\nnode "${binJs}" %*\r\n`)
  • 删除本地文件
    lib/resolve.js:46
    await rm(dest, { force: true })
  • 读取本地文件
    lib/resolve.js:105
    return existsSync('/.dockerenv')
  • 读取本地文件
    lib/resolve.js:113
    const pkg = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8'))
  • 读取本地文件
    lib/tarball.js:91
    const pkg = JSON.parse(await readFile(join(dir, 'package.json'), 'utf8'))
  • 发起网络请求
    lib/tarball.js:102
    return fetch(url, {
  • 写入本地文件
    lib/tarball.js:158
    await mkdir(dest, { recursive: true })
  • 写入本地文件
    lib/tarball.js:192
    await mkdir(out, { recursive: true })
  • 写入本地文件
    lib/tarball.js:194
    await mkdir(dirname(out), { recursive: true })
  • 删除本地文件
    lib/tarball.js:195
    await rm(out, { force: true }).catch(() => {})
  • 写入本地文件
    lib/tarball.js:202
    await mkdir(dirname(out), { recursive: true })
  • 写入本地文件
    lib/tarball.js:203
    await writeFile(out, tar.subarray(offset, offset + size))
  • 执行外部命令来自配置/变量
    lib/tarball.js:211
    const child = spawn(cmd, args, {
  • 写入本地文件
    lib/tarball.js:241
    await mkdir(dest, { recursive: true })
  • 读取本地文件
    lib/tarball.js:242
    const raw = await readFile(file)
  • 读取本地文件
    lib/tarball.js:252
    const hold = existsSync(nm) ? `${dest}.nm-hold` : null
  • 删除本地文件递归
    lib/tarball.js:254
    await rm(hold, { recursive: true, force: true })
  • 删除本地文件递归
    lib/tarball.js:257
    await rm(dest, { recursive: true, force: true })
  • 删除本地文件递归
    lib/tarball.js:261
    await rm(join(dest, 'node_modules'), { recursive: true, force: true }).catch(() => {})
  • 删除本地文件递归
    lib/tarball.js:263
    await rm(hold, { recursive: true, force: true })
  • 读取本地文件
    lib/tarball.js:269
    const before = new Set(await readdir(cache).catch(() => []))
  • 读取本地文件
    lib/tarball.js:283
    if (existsSync(guessed)) return guessed
  • 读取本地文件
    lib/tarball.js:284
    const after = (await readdir(cache)).filter((file) => file.endsWith('.tgz') && !before.has(file))
  • 删除本地文件递归
    lib/tarball.js:400
    await rm(stagedDsh, { recursive: true, force: true })
  • 写入本地文件
    lib/resolve.test.js:67
    await mkdir(join(pkg, 'lib'), { recursive: true })
  • 写入本地文件
    lib/resolve.test.js:68
    await writeFile(join(pkg, 'package.json'), JSON.stringify({ name: '@deepseek-ai/dsh', version: '0.1.0-rc.7' }))
  • 读取本地文件
    lib/tarball.test.js:81
    assert.equal(await readFile(join(dest, 'hello.txt'), 'utf8'), 'ok')
  • 写入本地文件
    lib/tarball.test.js:90
    await writeFile(join(seed, 'package.json'), JSON.stringify({ name: '@deepseek-ai/dsh', version: '0.1.0-rc.7' }))
  • 写入本地文件
    lib/tarball.test.js:91
    await mkdir(join(seed, 'node_modules', '@deepseek-ai', 'dsh-tools'), { recursive: true })
  • 写入本地文件
    lib/tarball.test.js:92
    await mkdir(join(seed, 'node_modules', 'commander'), { recursive: true })
  • 写入本地文件
    lib/tarball.test.js:93
    await writeFile(join(seed, 'node_modules', '@deepseek-ai', 'dsh-tools', 'package.json'), JSON.stringify({
  • 写入本地文件
    lib/tarball.test.js:97
    await writeFile(join(seed, 'node_modules', 'commander', 'package.json'), JSON.stringify({
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 增量拉取npm包
  • 备份与回滚

README

由 DeepSeek 最新模型翻译生成
dsh-updater DeepSeek Harness (DSH) 一键更新社区插件 · 增量 npm tarball · 备份与回滚 · 类似 Codex 安装 ·工作原理 ·截图 ·配置 ·安全 · Hero: HARNESS DSH UPDATER — community plugin for DeepSeek Harness dsh-updater 为 DeepSeek Harness(@deepseek-ai/dsh)添加了一个 设置 → 更新 面板和一个侧边栏按钮。它会检查 npm 的 next / latest,复制你当前的引擎,仅下载发生变化的包,替换正在运行的引擎,然后重启——或者在笔记本上提示你退出 DSH。 它不是 DeepSeek 官方软件。它不会 fork DSH,不会对源码执行 git pull,也从不运行 sudo 或 curl | bash。 为什么会有这个项目 完整的 npm install @deepseek-ai/dsh 会在内存中重建一个包含 200 个包的 monorepo,并且可能内存溢出(OOM)(我们在 Docker 中遇到了 1 GB 堆内存的情况)。Claude Code / Codex 风格的工具不会在每次版本升级时都重新解析整个依赖宇宙。
展开完整文档(README 剩余 1 节)
dsh-updater

DeepSeek Harness (DSH) 一键更新社区插件 · 增量 npm tarball · 备份与回滚 · 类似 Codex

安装 ·工作原理 ·截图 ·配置 ·安全 ·

Hero: HARNESS DSH UPDATER — community plugin for DeepSeek Harness

dsh-updater 为 DeepSeek Harness(@deepseek-ai/dsh)添加了一个 设置 → 更新 面板和一个侧边栏按钮。它会检查 npm 的 next / latest,复制你当前的引擎,仅下载发生变化的包,替换正在运行的引擎,然后重启——或者在笔记本上提示你退出 DSH。

它不是 DeepSeek 官方软件。它不会 fork DSH,不会对源码执行 git pull,也从不运行 sudo 或 curl | bash。

为什么会有这个项目

完整的 npm install @deepseek-ai/dsh 会在内存中重建一个包含 200 个包的 monorepo,并且可能内存溢出(OOM)(我们在 Docker 中遇到了 1 GB 堆内存的情况)。Claude Code / Codex 风格的工具不会在每次版本升级时都重新解析整个依赖宇宙。

这个插件:

1. 复用磁盘上已有的引擎(node_modules、原生插件)。
2. 从 npm registry 获取发生变化的 @deepseek-ai/* tarball。
3. 当版本匹配时保留第三方依赖(commander、koffi 等)。
4. 备份到 $DSH_HOME/engine-bak,并在失败时回滚。
5. 在进程可写的任何地方都能工作:Docker 卷、npm -g、nvm、Windows %APPDATA%\npm、pnpm/yarn 全局、本地 node_modules、npx 缓存。

安装

切勿使用 dsh plugin add github:…(未锁定版本)。克隆此仓库,然后添加绝对路径:

git clone https://github.com/Takinggg/dsh-updater.git
dsh plugin --profile web add /absolute/path/to/dsh-updater

Windows:

dsh plugin --profile web add C:\absolute\path\to\dsh-updater
打开 Settings → Updates,或 Settings 旁边的 Updates 控件。

截图

| 确认并获取 | 成功 |
| 更新浮层:从 rc.7 到 rc.8 获取变更的软件包 | DeepSeek Harness 更新后的成功弹窗 |

工作原理

1. 从 process.argv[1] 向上查找来解析 @deepseek-ai/dsh(可用 DSH_ENGINE_DIR 覆盖)。
2. 读取 npm dist-tags next 和 latest。仅当目标版本比正在运行的引擎更新时才提供(不会意外降级)。
3. 备份 → $DSH_HOME/engine-bak。
4. 暂存到 $DSH_HOME/update-stage(绝不使用 Docker 的 /tmp tmpfs)。
5. 增量 tarball 存入 $DSH_HOME/update-cache。注册表使用 Accept: application/json(避免 npm 在版本 URL 上返回 406)。针对异常注册表提供 npm view / npm pack 回退方案。
6. 覆盖安装,对确实发生变更的原生插件可选执行 npm rebuild。
7. 当安装是经典 npm 全局前缀时,恢复 dsh 的 PATH shim。
8. Docker / PID 1 / DSH_ENGINE_PERSIST=1: 进程以 0 退出,以便 Compose 重启它。重新加载后显示成功弹窗。
9. 笔记本电脑: 你退出 DSH 并再次启动它。UI 不会终止你的会话。

incremental-tarballs @deepseek-ai/dsh@ --reuse-engine --stage $DSH_HOME/update-stage

配置

| 变量 | 作用 |
| DSH_ENGINE_DIR | 强制指定引擎文件夹。 |
| DSH_HOME | 备份 / 暂存 / 缓存根目录(默认 ~/.dsh)。 |
| DSH_UPDATE=0 | 锁定更新。 |
| DSH_UPDATE_RESTART=1 / 0 | 强制通过进程退出来重启,或从不重启。 |
| DSH_ENGINE_PERSIST=1 | 受监管的容器(退出以重启)。 |
| DSH_UPDATE_STAGE | 暂存目录。 |
| DSH_UPDATE_CACHE | Tarball 缓存。 |
| DSH_UPDATE_TIMEOUT_MS | 整个任务的预算(默认 12 分钟)。 |
| DSH_UPDATE_MODE | 仅用于显示覆盖。 |

遵循 npm_config_registry、作用域 npm_config_@deepseek-ai:registry、NPM_TOKEN / NODE_AUTH_TOKEN 以用于私有注册表。

安全

- 主机 RPC 在安装前要求 { confirm: true }。
- 目标必须是已发布的 next 或 latest dist-tag。
- 不使用 sudo,不将运行中的 npm -g 安装到 Docker 引擎卷(那可能会清空前缀)。
- 会检查 tarball 路径以防止目录遍历。
- 如果验证失败,会从 engine-bak 自动回滚。

开发

npm test
npm run demo

Node 20+。零运行时依赖。

免责声明

社区插件——并非 DeepSeek 官方软件。DeepSeek 和 DeepSeek Harness 是其所有者的商标。本仓库仅安装已在 npm 上以 @deepseek-ai/dsh 发布的版本。

许可证

MIT
预览分享卡片长什么样 ↓Takinggg/dsh-updater
分享 · DeepSeek Harness Hub
Takinggg/dsh-updater

增量拉取 npm 包并备份回滚,安全升级引擎

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部