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

一键更新器 StefanIsMe/dsh-updater-plugin

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

一键更新 DSH 源码,自动备份并保留本地改动

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件
查看扫描证据(共 85 处,展示前 59 条)
  • 读取本地文件
    packages/host-updater/src/config.ts:105
    if (!existsSync(path)) return defaultUpdaterConfig()
  • 读取本地文件
    packages/host-updater/src/config.ts:106
    const raw = JSON.parse(readFileSync(path, 'utf8')) as unknown
  • 写入本地文件
    packages/host-updater/src/config.ts:117
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    packages/host-updater/src/config.ts:120
    writeFileSync(temp, `${JSON.stringify(config, null, 2)}\n`, 'utf8')
  • 写入本地文件
    packages/host-updater/src/config.ts:121
    renameSync(temp, path)
  • 读取本地文件
    packages/host-updater/src/engine.ts:105
    if (existsSync(file)) {
  • 读取本地文件
    packages/host-updater/src/engine.ts:106
    const raw = JSON.parse(readFileSync(file, 'utf8')) as Partial<EngineState>
  • 写入本地文件
    packages/host-updater/src/engine.ts:187
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    packages/host-updater/src/engine.ts:218
    writeFileSync(temp, body + '\n')
  • 写入本地文件
    packages/host-updater/src/engine.ts:220
    renameSync(temp, file)
  • 删除本地文件
    packages/host-updater/src/engine.ts:222
    try { rmSync(temp, { force: true }) } catch { }
  • 读取本地文件
    packages/host-updater/src/engine.ts:280
    if (!existsSync(dir)) return []
  • 读取本地文件
    packages/host-updater/src/engine.ts:282
    const dirs = readdirSync(dir).filter(n => /^\d{4}-\d{2}/.test(n)).sort().reverse()
  • 读取本地文件
    packages/host-updater/src/engine.ts:287
    if (existsSync(mPath)) {
  • 读取本地文件
    packages/host-updater/src/engine.ts:288
    const m = JSON.parse(readFileSync(mPath, 'utf8')) as { createdAt?: string; headSha?: string | null }
  • 读取本地文件
    packages/host-updater/src/git.ts:18
    const match = readFileSync(path, 'utf8').match(/^gitdir: (.+) *$/)
  • 读取本地文件
    packages/host-updater/src/git.ts:30
    if (existsSync(join(gitDirectory(repoPath), marker))) return marker
  • 读取本地文件
    packages/host-updater/src/git.ts:39
    if (!existsSync(marker)) return null
  • 读取本地文件
    packages/host-updater/src/git.ts:41
    return readFileSync(marker, 'utf8').split('\n')[0]?.trim() || null
  • 执行外部命令固定命令
    packages/host-updater/src/git.ts:134
    const child = spawn('git', [...args], { cwd: repoPath, env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 读取本地文件
    packages/host-updater/src/index.ts:67
    if (!existsSync(pkgPath)) return null
  • 读取本地文件
    packages/host-updater/src/index.ts:68
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version?: unknown }
  • 读取本地文件
    packages/host-updater/src/index.ts:111
    this.config = existsSync(join(stateDirOf(repoPath), 'config.json'))
  • 写入本地文件
    packages/host-updater/src/index.ts:848
    mkdirSync(dirname(dst), { recursive: true })
  • 写入本地文件
    packages/host-updater/src/index.ts:849
    writeFileSync(dst, draft, 'utf8')
  • 写入本地文件
    packages/host-updater/src/index.ts:1007
    mkdirSync(dirname(dst), { recursive: true })
  • 写入本地文件
    packages/host-updater/src/index.ts:1008
    writeFileSync(dst, blob.stdout, 'utf8')
  • 写入本地文件
    packages/host-updater/src/index.ts:1149
    mkdirSync(dirname(dst), { recursive: true })
  • 写入本地文件
    packages/host-updater/src/index.ts:1150
    writeFileSync(dst, content, 'utf8')
  • 读取本地文件
    packages/host-updater/src/invariant.ts:29
    if (existsSync(cfgPath)) {
  • 读取本地文件
    packages/host-updater/src/invariant.ts:30
    const raw = JSON.parse(readFileSync(cfgPath, 'utf8')) as { buildCommand?: unknown }
  • 读取本地文件
    packages/host-updater/src/invariant.ts:44
    if (existsSync(cfgPath)) {
  • 读取本地文件
    packages/host-updater/src/invariant.ts:45
    const raw = JSON.parse(readFileSync(cfgPath, 'utf8')) as { autoApply?: unknown }
  • 读取本地文件
    packages/host-updater/src/invariant.ts:57
    if (existsSync(cfgPath)) {
  • 读取本地文件
    packages/host-updater/src/invariant.ts:58
    const raw = JSON.parse(readFileSync(cfgPath, 'utf8')) as { expectedRemoteUrl?: unknown }
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:62
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:71
    writeFileSync(join(dir, 'manifest.json'), `${JSON.stringify(meta, null, 2)}\n`)
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:80
    try { writeFileSync(join(dir, 'local.patch'), patch.stdout) } catch { }
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:91
    const stat = lstatSync(src)
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:94
    mkdirSync(dst, { recursive: true })
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:95
    for (const child of readdirSync(src)) snapshot(rel ? `${rel}/${child}` : child)
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:96
    } else if (stat.isFile()) copyFileSync(src, dst)
  • 写入本地文件
    packages/host-updater/src/pipeline.ts:99
    writeFileSync(join(dir, 'checkpoint-complete'), '1\n')
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:104
    if (existsSync(src) && statSync(src).isFile()) {
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:104
    if (existsSync(src) && statSync(src).isFile()) {
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:118
    if (!existsSync(dir)) return
  • 读取本地文件
    packages/host-updater/src/pipeline.ts:120
    const dirs = readdirSync(dir).filter(n => /^\d{4}-\d{2}/.test(n)).sort().reverse()
  • 删除本地文件递归
    packages/host-updater/src/pipeline.ts:125
    try { rmSync(join(dir, stale), { recursive: true, force: true }) } catch { }
  • 执行外部命令来自配置/变量
    packages/host-updater/src/pipeline.ts:393
    const child = spawn(program, actual.slice(1), {
  • 写入本地文件
    packages/host-updater/src/relaunch.ts:48
    mkdirSync(stateDir, { recursive: true })
  • 写入本地文件
    packages/host-updater/src/relaunch.ts:51
    copyFileSync(supervisorSourcePath(), scriptPath)
  • 写入本地文件
    packages/host-updater/src/relaunch.ts:67
    writeFileSync(join(stateDir, 'arm.json'), `${JSON.stringify({ pid: process.pid, at: new Date().toISOString() }, null, 2)}\n`)
  • 写入本地文件
    packages/host-updater/src/relaunch.ts:68
    writeFileSync(join(stateDir, 'spawn.json'), `${JSON.stringify(payload, null, 2)}\n`)
  • 执行外部命令来自配置/变量
    packages/host-updater/src/relaunch.ts:69
    const child = spawn(process.execPath, [scriptPath, stateDir], {
  • 读取本地文件
    packages/host-updater/src/workflow.ts:10
    if (!existsSync(path)) return null
  • 读取本地文件
    packages/host-updater/src/workflow.ts:11
    const value = JSON.parse(readFileSync(path, 'utf8')) as UpdaterOperation
  • 写入本地文件
    packages/host-updater/src/workflow.ts:21
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    packages/host-updater/src/workflow.ts:24
    writeFileSync(temp, `${JSON.stringify(operation, null, 2)}\n`)
  • 写入本地文件
    packages/host-updater/src/workflow.ts:25
    renameSync(temp, path)
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 一键更新源码
  • 自动备份
  • 保留本地改动

草稿永不丢。一键保持最新——DeepSeek Harness 的草稿安全自更新器

README

由 DeepSeek 最新模型翻译生成
DSH 更新器 在保留本地插件和更改的同时,更新 DeepSeek Harness 源代码检出。主机服务、模型工具、浏览器设置页面和生成的 Remote 产物必须针对已安装的 DSH 修订版一起构建。 这是一个源代码集成套件。它不是独立的 npm 安装,也不会更新单独管理的 Electron 桌面应用程序。DSH 的预稳定 API 可能会发生变化;可能需要进行兼容性修复。验证失败会使更新保持未完成状态,并保留恢复数据。 通过你的 DSH 代理安装 将以下内容复制到你的 DSH 实例的聊天中: 从 https://github.com/StefanIsMe/dsh-updater-plugin 在此 DSH 源代码检出中安装更新器。先阅读其 README.md 和 docs/INSTALL.md。检查实际的 DSH 版本、仓库、活动配置文件、包布局和启动命令;不要假设我的操作系统、用户名、目录、端口、模型或提供商。 在修改任何内容之前,备份我的配置、会话、本地插件、已跟踪的更改(包括索引和删除)、未跟踪的文件以及现有的更新器恢复记录。保留现有的备份和 stash。使用文档化的源代码映射集成主机和客户端更新器包;根据此已安装的 DSH 修订版调整导入和清单,而不替换无关配置。保持更新器为可选,并在我的活动代理预设中启用其工具。
展开完整文档(README 剩余 1 节)
DSH 更新器

在保留本地插件和更改的同时,更新 DeepSeek Harness 源代码检出。主机服务、模型工具、浏览器设置页面和生成的 Remote 产物必须针对已安装的 DSH 修订版一起构建。

这是一个源代码集成套件。它不是独立的 npm 安装,也不会更新单独管理的 Electron 桌面应用程序。DSH 的预稳定 API 可能会发生变化;可能需要进行兼容性修复。验证失败会使更新保持未完成状态,并保留恢复数据。

通过你的 DSH 代理安装

将以下内容复制到你的 DSH 实例的聊天中:

从 https://github.com/StefanIsMe/dsh-updater-plugin 在此 DSH 源代码检出中安装更新器。先阅读其 README.md 和 docs/INSTALL.md。检查实际的 DSH 版本、仓库、活动配置文件、包布局和启动命令;不要假设我的操作系统、用户名、目录、端口、模型或提供商。

在修改任何内容之前,备份我的配置、会话、本地插件、已跟踪的更改(包括索引和删除)、未跟踪的文件以及现有的更新器恢复记录。保留现有的备份和 stash。使用文档化的源代码映射集成主机和客户端更新器包;根据此已安装的 DSH 修订版调整导入和清单,而不替换无关配置。保持更新器为可选,并在我的活动代理预设中启用其工具。

配置实际的上游远程和分支、适合此检出的构建命令、重启前验证、确切的 DSH 配置文件启动命令,以及经过身份验证的重启后应用程序检查。将凭据保存在我现有的本地凭据存储中;切勿将它们复制到插件源代码、报告或 Git 提交中。

一起构建主机更新器、工具、生成的 Remote 主机/客户端产物和浏览器 UI。运行更新器回归测试和真实的配置文件组合检查。验证 updater_start 和 updater_conflict_context 在运行中的主机中可调用,而不仅仅是列在工具目录中。在这些检查通过后重启,然后验证经过身份验证的访问、更新器状态、会话加载以及我启用的插件的保留情况。如果必需的检查失败,请修复并重新运行;不要将不可用或失败的检查标记为成功。用通俗的语言告诉我验证结果。

有关包映射和验证要求,请参阅安装详细信息。

安装后更新 DSH

打开 Settings → Updater 并启动 AI 更新,或询问你的代理:

使用 updater_start 更新 DSH。我授权本次更新进行备份、兼容性修复、测试和重启。保留我的插件、设置、对话和本地更改。常规技术决策由你自行处理。使用 updater_conflict_context 和 updater_write_merged 进行修复,然后用 updater_start 恢复。轮询 updater_status;仅在操作完成且重启后检查通过后才报告完成。如果运行时和工具不一致,请先修复并重建已安装的更新器,然后再重试。

该工作流会固定所获取的提交、备份本地状态、合并上游、按记录的 stash ID 恢复已保存的更改、运行配置的检查,并验证重启后的应用程序。冲突需要具备工具使用能力的智能体。更新器不选择任何模型或提供商。

低成本更新

更新流水线已经会运行 pnpm install 和构建本身,因此智能体无需重新运行完整测试套件即可信任一次更新。说 “低成本更新 DSH” 会告诉智能体轮询 updater_status 直至完成,并仅验证传入提交实际触及的表面,而不是重新运行整套测试并消耗 API token。

低成本更新 DSH。调用 updater_start,让流水线执行备份、合并、安装和构建;轮询 updater_status 直到阶段稳定。跳过完整测试套件,按比例投入精力——仅验证传入提交触及的表面。常规技术决策由你自行处理,并在更新需要时重启。用通俗语言告诉我结果。

这是安全的,因为完成状态由网关而非智能体掌控:在重启后的应用程序通过其配置的重启后验证之前,更新不会被报告为成功;如果任何检查失败,恢复数据都会被保留。要求低成本更新只会改变智能体重新测试的程度,而绝不会改变更新是否经过验证。

通过省略“低成本”仍可进行全保真更新——在上游大幅跃迁之后,或当你更改了许多本地文件时,这很有用。

恢复副本和 stash 可能包含私有用户数据。它们保留在用户的 DSH 安装中,不得上传到此仓库。参见 SECURITY.md。

开发与范围

更新器代码位于 packages/host-updater 和 packages/client-ui-updater。此仓库仅包含更新器。

测试在目标 DSH 工作区中运行,因为此源码工具包引用了 DSH 工作区包及其 TypeScript/构建配置。请遵循 docs/INSTALL.md 中特定于版本的命令。此仓库的 GitHub URL 必然标识其公开所有者;私有路径、电子邮件地址、凭据和对话记录不是安装输入。
预览分享卡片长什么样 ↓StefanIsMe/dsh-updater-plugin
分享 · DeepSeek Harness Hub
StefanIsMe/dsh-updater-plugin

一键更新 DSH 源码,自动备份并保留本地改动

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