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

版本显示卡片 hjj345/dsh-sm-version-display

DeepSeek Harnessv1.2.23
hjj34550 天前有提交已提供中文文档扫描:含敏感能力

在侧边栏设置上方显示已装版本并检测更新

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @hjj345345/dsh-sm-version-display
npm 源 · @hjj345345/dsh-sm-version-display 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@hjj345345/dsh-sm-version-display @ 1.2.23
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/15 11:40:50

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 133 处,展示前 71 条)
  • 读取本地文件
    lib/index.js:67
    const pkg = JSON.parse(readFileSync(join(state.globalRoot, "node_modules", "@deepseek-ai", "dsh", "package.json"), "utf8"));
  • 读取本地文件
    lib/index.js:119
    const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
  • 读取本地文件
    lib/index.js:139
    const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
  • 读取本地文件
    lib/index.js:155
    const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
  • 读取本地文件
    lib/index.js:206
    const shim = readFileSync(join(binDirectory, "dsh" + extension), "utf8");
  • 读取本地文件
    lib/index.js:250
    const metadata = readFileSync(join(current, "node_modules", ".modules.yaml"), "utf8");
  • 写入本地文件
    lib/index.js:306
    mkdirSync(dirname(UPDATE_STATE_FILE), { recursive: true });
  • 写入本地文件
    lib/index.js:309
    writeFileSync(temporary, JSON.stringify(state), "utf8");
  • 写入本地文件
    lib/index.js:312
    renameSync(temporary, UPDATE_STATE_FILE);
  • 删除本地文件
    lib/index.js:320
    try { rmSync(temporary, { force: true }); } catch { }
  • 发起网络请求
    lib/index.js:370
    const response = await fetch(url, { headers: { accept: "application/json", ...headers }, signal: AbortSignal.timeout(CHECK_TIMEOUT_MS) });
  • 发起网络请求
    lib/index.js:380
    const response = await fetch(url, { headers: { accept: "text/plain, application/atom+xml", ...headers }, signal: AbortSignal.timeout(CHECK_TIMEOUT_MS)
  • 执行外部命令来自配置/变量
    lib/index.js:604
    const child = spawn(process.execPath, [join(job.runtimeDir, 'update-worker.mjs'), "--state", UPDATE_STATE_FILE, '--job', job.id], { stdio: "ignore", w
  • 执行外部命令来自配置/变量
    lib/index.js:663
    const child = spawn(process.execPath, [join(next.runtimeDir, 'update-worker.mjs'), "--state", UPDATE_STATE_FILE, '--job', state.id, "--action", action
  • 发起网络请求
    client/client.js:133
    checkStore.request = fetch(url, { headers: { accept: "application/json", "x-dsh-sm-version-display-token": typeof window.__DSH_UPDATE_TOKEN__ === "str
  • 发起网络请求
    client/client.js:149
    const response = await fetch(UPDATE_STATUS_ROUTE, { headers: { accept: "application/json", "x-dsh-sm-version-display-token": typeof window.__DSH_UPDAT
  • 发起网络请求
    client/client.js:166
    const response = await fetch(UPDATE_STATUS_ROUTE, { headers: { accept: "application/json", "x-dsh-sm-version-display-token": typeof window.__DSH_UPDAT
  • 发起网络请求
    client/client.js:178
    const response = await fetch(UPDATE_ACTION_ROUTE, { method: "POST", headers: { accept: "application/json", "content-type": "application/json", "x-dsh-
  • 发起网络请求
    client/client.js:478
    const response = await fetch("/api/dsh-sm-version-display/backups" + suffix, { method: body === undefined ? "GET" : "POST", headers: { accept: "applic
  • 发起网络请求
    client/client.js:553
    fetch(UPDATE_ROUTE + '/versions', { headers: { accept: 'application/json', 'x-dsh-sm-version-display-token': window.__DSH_UPDATE_TOKEN__ ?? '' }, sign
  • 写入剪贴板
    client/client.js:622
    await window.navigator.clipboard.writeText(command);
  • 读取本地文件
    lib/backup-manager.mjs:5
    const read = (path) => { try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return null; } };
  • 读取本地文件
    lib/backup-manager.mjs:9
    if (existsSync(absolute)) return realpathSync(absolute);
  • 写入本地文件
    lib/backup-manager.mjs:16
    mkdirSync(stateDir, { recursive: true });
  • 写入本地文件
    lib/backup-manager.mjs:19
    try { writeFileSync(temporary, JSON.stringify(data)); renameSync(temporary, path); }
  • 写入本地文件
    lib/backup-manager.mjs:19
    try { writeFileSync(temporary, JSON.stringify(data)); renameSync(temporary, path); }
  • 删除本地文件
    lib/backup-manager.mjs:20
    finally { rmSync(temporary, { force: true }); }
  • 写入本地文件
    lib/backup-manager.mjs:33
    mkdirSync(target, { recursive: true });
  • 删除本地文件
    lib/backup-manager.mjs:35
    try { writeFileSync(probe, '', { flag: 'wx' }); } finally { rmSync(probe, { force: true }); }
  • 写入本地文件
    lib/backup-manager.mjs:35
    try { writeFileSync(probe, '', { flag: 'wx' }); } finally { rmSync(probe, { force: true }); }
  • 读取本地文件
    lib/backup-manager.mjs:53
    try { if (lstatSync(backup.root).isSymbolicLink()) return false; } catch { return false; }
  • 读取本地文件
    lib/backup-manager.mjs:58
    try { return path && manifest.backup[key] === path && inside(canonical(path), canonical(backup.root)) && path !== backup.root && !lstatSync(path).isSy
  • 读取本地文件
    lib/backup-manager.mjs:64
    for (const item of readdirSync(path, { withFileTypes: true })) {
  • 读取本地文件
    lib/backup-manager.mjs:65
    const child = join(path, item.name), stat = lstatSync(child);
  • 删除本地文件递归
    lib/backup-manager.mjs:117
    rmSync(item.path, { recursive: true });
  • 读取本地文件
    lib/update-runtime.mjs:7
    export const readJson = (path) => { try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return null; } };
  • 写入本地文件
    lib/update-runtime.mjs:22
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/update-runtime.mjs:25
    writeFileSync(temp, JSON.stringify(data), 'utf8');
  • 写入本地文件
    lib/update-runtime.mjs:27
    try { renameSync(temp, path); break; }
  • 删除本地文件
    lib/update-runtime.mjs:33
    } finally { rmSync(temp, { force: true }); }
  • 写入本地文件
    lib/update-runtime.mjs:36
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/update-runtime.mjs:40
    try { writeFileSync(fd, JSON.stringify({ pid: process.pid })); } finally { closeSync(fd); }
  • 删除本地文件
    lib/update-runtime.mjs:41
    return () => { if (readJson(path)?.pid === process.pid) rmSync(path, { force: true }); };
  • 删除本地文件
    lib/update-runtime.mjs:52
    if (current && !alive(current.pid)) rmSync(path, { force: true });
  • 删除本地文件
    lib/update-runtime.mjs:54
    } finally { closeSync(guard); rmSync(path + '.reclaim', { force: true }); }
  • 写入本地文件
    lib/update-runtime.mjs:62
    mkdirSync(target, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/update-runtime.mjs:90
    const child = spawn(ps, ['-NoProfile', '-NonInteractive', '-EncodedCommand', encode(bootstrap)], { windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'
  • 执行外部命令来自配置/变量
    lib/update-runtime.mjs:136
    const child = spawn(process.execPath, workerArgs, { detached: true, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'], shell: false });
  • 写入本地文件
    lib/update-worker.mjs:38
    mkdirSync(join(globalRoot, "node_modules"), { recursive: true });
  • 写入本地文件
    lib/update-worker.mjs:39
    writeFileSync(join(globalRoot, "node_modules", ".modules.yaml"), JSON.stringify({ virtualStoreDir: join(globalRoot, ".pnpm") }), "utf8");
  • 读取本地文件
    lib/update-worker.mjs:76
    assert.equal(readFileSync(join(restored, "node_modules", ".modules.yaml"), "utf8"), readFileSync(join(globalRoot, "node_modules", ".modules.yaml"), "u
  • 写入本地文件
    lib/update-worker.mjs:78
    mkdirSync(profileRoot, { recursive: true });
  • 写入本地文件
    lib/update-worker.mjs:81
    mkdirSync(dirname(activeBin), { recursive: true });
  • 写入本地文件
    lib/update-worker.mjs:82
    writeFileSync(join(activePackage, "package.json"), JSON.stringify({ name: "@deepseek-ai/dsh", version: "0.0.2", bin: { dsh: "lib/bin.js" } }));
  • 写入本地文件
    lib/update-worker.mjs:83
    writeFileSync(activeBin, "process.exit(0);");
  • 读取本地文件
    lib/update-worker.mjs:104
    const stale = JSON.parse(readFileSync(profileManifest, "utf8"));
  • 读取本地文件
    lib/update-worker.mjs:109
    assert.equal(JSON.parse(readFileSync(profileManifest, "utf8")).pnpm.overrides["@deepseek-ai/dsh-session-query"], state.version);
  • 删除本地文件
    lib/update-worker.mjs:141
    rmSync(activeBin);
  • 执行外部命令来自配置/变量
    lib/update-worker.mjs:184
    const parent = spawn(process.execPath, ["-e", parentCode], { stdio: ["ignore", "ignore", "ignore", "ipc"], windowsHide: true });
  • 删除本地文件
    lib/update-worker.mjs:207
    rmSync(join(activePackage, "package.json"));
  • 读取本地文件
    lib/update-worker.mjs:212
    assert.equal(JSON.parse(readFileSync(join(state.backup.root, "manifest.json"))).backup.status, "error");
  • 删除本地文件递归
    lib/update-worker.mjs:215
    rmSync(root, { recursive: true, force: true });
  • 读取本地文件
    lib/update-worker.mjs:223
    state = JSON.parse(readFileSync(statePath, "utf8"));
  • 删除本地文件
    lib/update-worker.mjs:254
    try { rmSync(temporary, { force: true }); } catch { }
  • 读取本地文件
    lib/update-worker.mjs:302
    try { return (await stat(path)).isDirectory() ? "junction" : "file"; }
  • 执行外部命令固定命令
    lib/update-worker.mjs:306
    const directory = execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", "[bool]((Get-Item -LiteralPath $env:DSH_BACKUP_LINK -Fo
  • 执行外部命令来自配置/变量
    lib/update-worker.mjs:384
    execFileSync(join(process.env.SystemRoot ?? "C:\\Windows", "System32", "taskkill.exe"), ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore", wi
  • 执行外部命令来自配置/变量
    lib/update-worker.mjs:420
    const child = spawn(runnable.executable, runnable.args, { cwd, windowsHide: true, stdio: ["ignore", "pipe", "pipe"], shell: false });
  • 发起网络请求
    lib/update-worker.mjs:456
    const response = await fetch(url, { redirect: "follow", signal: AbortSignal.timeout(COMMAND_TIMEOUT_MS) });
  • 执行外部命令来自配置/变量
    lib/update-worker.mjs:472
    const child = spawn(command.executable, command.args, { detached: true, stdio: "ignore", windowsHide: false, shell: false });
  • 删除本地文件
    lib/update-worker.mjs:583
    } finally { try { rmSync(temporary, { force: true }); } catch {} }
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-settings@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 侧边栏显示已装版本
  • 检测版本更新
v1.2.272026-11-01
· 更新内容 · 修复 pnpm 版本查询返回单元素数组时的误判;严格校验注册表结果,并补充回归测试。 · 新增一键更新时选择具体 npm 版本,展示推荐/弃用标记,并由客户端和主机端共同校验目标版本。 · 完善重启后的自动验证与任务状态收敛,精简更新看板并突出待处理操作及重启/停机状态。 · 扩展版本比较、备份路由、更新终端和 UI 测试覆盖。 完整变更见 v1.2.26...v1.2.27 比较记录。
v1.2.262026-10-23
· 更新内容 · 修复 DSH 设置菜单包含快捷键提示文本或禁用项时的导航匹配问题。 · 扩展设置导航测试,覆盖快捷键文本和禁用菜单项。 · 更新插件版本、客户端关于页、发布契约及双语文档至 v1.2.26。 完整变更见 v1.2.25...v1.2.26 比较记录。
v1.2.252026-10-21
· 更新内容 · 更新 DSH 0.2.1-rc.2 开发基线,并同步设置、Remote Settings、客户端模块、UI 组件及依赖。 · 修复设置导航,支持本地化标签和已打开的菜单,避免其他对话框导致误导航。 · 新增设置导航测试并更新 DSH 0.2 兼容契约;同步中英文文档中的兼容性声明。 完整变更见 v1.2.25 提交记录。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DSH 版本检测 | dsh-sm-version-display 中文文档 · English documentation version DSH node license platform GitHub:hjj345/dsh-sm-version-display npm:@hjj345345/dsh-sm-version-display 最低支持 DSH 版本:v0.1.0-rc.6(含)。当前插件版本:v1.2.10。 简介 @hjj345345/dsh-sm-version-display 是一个面向 DeepSeek Harness(DSH)Web 界面的客户端 + host 双半区插件。它在侧边栏「设置」按钮上方显示当前已安装的 DSH 版本,并检测 npm registry 与官方 GitHub Release 的新版本。 从 v1.1.0 开始,插件同时在 DSH 设置中新增“DSH版本检测”一级页面(排序 22,位于参考插件下方)。页面复刻参考插件的卡片式设计,提供插件开关、通用设置、关于插件和安装命令;支持简体中文、English、繁體中文三种语言。检测结果会在 DSH 进程期间缓存,设置弹窗重新打开后仍可查看。检测到更新时,用户可以先查看风险并确认后由插件执行精确版本命令,也可以打开手动更新步骤逐条执行。
展开完整文档(README 剩余 1 节)
DSH 版本检测 | dsh-sm-version-display

中文文档 · English documentation

version DSH node license platform

GitHub:hjj345/dsh-sm-version-display npm:@hjj345345/dsh-sm-version-display

最低支持 DSH 版本:v0.1.0-rc.6(含)。当前插件版本:v1.2.10。

简介

@hjj345345/dsh-sm-version-display 是一个面向 DeepSeek Harness(DSH)Web 界面的客户端 + host 双半区插件。它在侧边栏「设置」按钮上方显示当前已安装的 DSH 版本,并检测 npm registry 与官方 GitHub Release 的新版本。

从 v1.1.0 开始,插件同时在 DSH 设置中新增“DSH版本检测”一级页面(排序 22,位于参考插件下方)。页面复刻参考插件的卡片式设计,提供插件开关、通用设置、关于插件和安装命令;支持简体中文、English、繁體中文三种语言。检测结果会在 DSH 进程期间缓存,设置弹窗重新打开后仍可查看。检测到更新时,用户可以先查看风险并确认后由插件执行精确版本命令,也可以打开手动更新步骤逐条执行。

这里有三个名称需要区分:

- npm 包名:@hjj345345/dsh-sm-version-display
- DSH 运行时插件 ID:dsh-sm-version-display
- GitHub 仓库:hjj345/dsh-sm-version-display

插件版本 v1.2.10 表示本插件版本;卡片中显示的是运行时读取到的 DSH 版本,两者不是同一个版本号。

功能特性

- 版本卡片:在侧边栏底部「设置」按钮上方显示圆角版本卡片,并独占一行。
- 运行时读取:host 半区在渲染页面时读取已安装的 @deepseek-ai/dsh 版本,DSH 升级并重启后自动跟随。
- 安全回退:host 版本暂时不可用时显示“版本未知”,不会猜测或伪造固定版本。
- 更新检测:页面加载、每 30 分钟以及窗口重新回到前台时检查 npm 和 GitHub Release;结果在 DSH 进程内缓存。
- GitHub 限流回退:GitHub API 受限时自动改用官方 Releases Atom Feed;npm 检测不受影响。
- 版本类型:GitHub 版本区分预发布 Alpha、测试版 Beta、公测版 RC 和正式版 Release。
- 语义化比较:内置轻量版本比较逻辑,支持 Alpha、Beta、RC、正式版和多位数字版本号比较。
- 手动刷新:卡片内提供刷新按钮,检查期间显示加载状态,完成后显示 DSH 原生 Toast。
- DSH 设置页:在 DSH 设置中注册“DSH版本检测”,位于参考插件 sm-context-piano(排序 21)下方,使用默认齿轮图标(排序 22)。
- 设置卡片:包含插件名称、副标题、开关、通用设置、关于插件和安装命令,整体复刻参考插件的设计。
- 三语设置:支持简体中文、English、繁體中文,默认简体中文,并持久化语言选择。
- 展开式检测:在设置页按钮下方并排显示 npm 与 GitHub 版本、类型、发布时间、Release 链接、当前安装方式和插件管理方式。
- 双路径更新:更新前必须确认风险;支持 host 后台自动执行,或打开完整命令和步骤手动更新。
- 更新输出:自动更新时显示执行命令、实时输出、成功/失败状态和重启要求。
- 安全一键更新:仅执行 host 内固定的精确版本命令;请求仅限本机回环地址,GitHub 源码版本无对应 npm 包时仅提供手动构建步骤。
- 响应式布局:侧边栏折叠为窄栏时显示圆形版本图标,文本空间不足时自动换行。
- 主题适配:使用 DSH 设计系统变量,跟随浅色和深色主题。
- 悬停提示:卡片和窄栏图标会显示插件英文名 dsh-sm-version-display 及当前版本。

实际效果截图 / Screenshots

侧边栏版本卡片:

侧边栏窄栏悬停提示:

设置页总览:

双源版本检测结果:

更新确认弹窗:

更新执行记录、关于插件与安装命令:

示例状态:

vX.Y.Z(最新版) vX.Y.Z(有更新:vA.B.C)

安装与卸载

从 npm 安装(推荐)

在安装了 DSH 的机器上执行:

dsh plugin --profile web add @hjj345345/dsh-sm-version-display

安装完成后重启 DSH Web 服务或重新打开 Web 界面:

dsh web

卸载:

dsh plugin --profile web remove @hjj345345/dsh-sm-version-display

本地开发链接

本地开发时可以使用 link: 指向插件目录。下面的路径只是示例,请替换为实际路径,不要把个人电脑路径写入 README、源码或 npm 包:

dsh plugin --profile web add link:C:/path/to/dsh-sm-version-display

本地链接仅用于开发调试;正式使用应切换回 npm 包安装。

设置页与版本更新

打开 DSH 设置并选择 DSH版本检测。点击“检测DSH版本”后,npm 与 GitHub 结果会在按钮下方展开显示,并在本次 DSH 进程期间保留。只有用户点击“收起检测结果”后才会折叠;重新启动 DSH 后状态重置。

更新命令始终区分 npm 和 npx;如果本机是 pnpm 全局安装,还会优先显示 pnpm 命令:

npm 全局安装
npm install --global @deepseek-ai/dsh@

npx 临时执行指定版本
npx --yes @deepseek-ai/dsh@ web

pnpm 全局安装
pnpm add --global @deepseek-ai/dsh@

npx 没有需要替换的全局安装;GitHub Release 如果没有对应 npm 包,则需要按照弹窗中的 clone、checkout、pnpm install、build 和启动步骤手动执行。任何更新完成后都需要重启 DSH Web 服务。

自动更新会先显示来源、目标版本、版本类型和风险,用户确认后才执行。执行期间设置页会显示命令和输出。Alpha、Beta、RC 版本可能包含破坏性变更;切换版本前建议备份 .dsh 配置和 profile 数据。回退时请使用明确的旧版本号,例如 @deepseek-ai/dsh@0.1.1-rc.2。

工作原理

DSH host process
lib/index.js
└─ 监听 webserver/index-inject 读取已安装 @deepseek-ai/dsh/package.json 的 version 注入 globalThis["__DSH_VERSION__"]、__DSH_INSTALL_INFO__ 和页面级更新 token │ ▼ DSH Web browser client/client.js ├─ 注册 sidebar.footer.action 版本卡片和 settings.section 设置页 ├─ 读取 window.__DSH_VERSION__ 并渲染版本卡片 ├─ GET 本机检查路由(host 缓存 npm 与 GitHub Release) └─ POST 本机更新路由(仅固定精确版本命令)比较当前版本和两个来源的版本

发布包中的关键文件:

| 文件 | 作用 |
| lib/index.js | host 半区;注入当前 DSH 版本 |
| client/client.js | client 半区;卡片、更新检测、Toast 和样式 |
| cordis.patch.yml | 将插件挂载到 DSH profile 层 |
| LICENSE | MIT 开源许可证 |

隐私与网络说明

- host 半区只读取本机已安装的 DSH 包清单中的版本字段和安装路径类型,不向浏览器暴露绝对路径。
- host 半区查询 npm Registry 与 GitHub Releases,并在 DSH 进程内缓存结果;GitHub API 限流时回退到官方 Releases Atom Feed;更新请求携带 host 注入的页面级 token。
- 更新路由只接受本机回环请求和匹配 token,命令和参数在 host 内固定,不接受浏览器传入任意命令。
- 请求不携带 DSH 登录凭据、会话内容或用户文件,插件也不会读取聊天内容。
- npm registry 请求失败时保留当前版本显示,并在手动检查时显示通用错误提示。
- 仓库和 npm 包均排除 .env、.npmrc、令牌、密钥、证书、日志、依赖目录及本地 DSH 数据。

兼容性

| 项目 | 要求 |
| DSH | >= v0.1.0-rc.6 |
| 已验证支持的 DSH RC | dsh-0.1.5-rc.1、dsh-0.1.5-rc.2 |
| Node.js | >= 20(host 运行环境) |
| 平台 | DSH Web |
| 插件版本 | v1.2.10 |
插件使用 DSH 官方扩展点:dsh.client、sidebar.footer.action、settings.section、webserver/index-inject、ctx.slots.inject/register 和 ctx.settingsScope。如果 DSH 后续发生不兼容的扩展点变更,需要相应适配。

开发与本地验证

本插件使用与 DSH 客户端插件一致的手写 bundle 格式:window.__ModuleLoader__.load({ id, factory }),不需要额外编译器或运行时依赖。

在项目根目录执行:

npm run check
npm run build

npm run build 会执行 host/client 语法检查、版本比较自测、设置页/更新链路契约检查、包完整性检查和 README 检查。

更新日志

v1.2.10 - 2026-09-15

- 修复升级状态文件并发写入失败:host 与升级 Worker 使用带进程号和随机标识的独立临时文件,避免多个进程共享 .tmp 文件互相覆盖。
- 增强 Windows 原子替换可靠性:状态文件重命名遇到 EPERM、EACCES 或 EBUSY 时按有限次数重试,并在成功或失败后清理临时文件。
- 消除 Worker 启动后的重复状态写入,避免 host 在记录 Worker PID 时覆盖 Worker 已写入的最新升级状态。
- 补充发布契约校验:覆盖 host/Worker 的状态写入重试常量、SharedArrayBuffer 等待机制,并禁止旧共享临时文件名回归。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.10,发布日期为 2026-09-15。

v1.2.9 - 2026-09-15

- 优化 DSH 升级备份进度与心跳看板:实时展示备份扫描/复制进度、当前步骤、目标版本、命令及已处理文件数量,升级过程更容易定位和跟踪。
- 增强 Worker 心跳机制:记录最近活动时间,超过 10 分钟没有进度时标记为心跳超时,并提供继续等待、自动修复或一键回滚选项,避免误判长时间任务状态。
- 完善升级修复流程:增加 Web profile 修复步骤,处理 profile、配置导出、端口占用和 DSH 仍在运行等常见失败场景,并提供手动修复命令与提示。
- 强化更新动作交互:新增更新执行看板、目标版本和无命令输出状态,失败操作按钮支持等待、自动修复和回滚,并在动作切换期间正确停止或恢复 Worker。
- 扩展三语文案与发布契约校验,覆盖心跳超时、进度看板、profile 修复、更新动作和升级 Worker 相关内容。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.9,发布日期为 2026-09-15。

v1.2.8 - 2026-09-14

- 完善 DSH 一键升级安全流程:新增独立升级 Worker,按备份、目标版本预检、全局依赖树修复、安装目标版本和安装结果/profile 校验分步执行,避免长时间升级任务阻塞主进程。
- 增加可恢复环境备份:升级前备份全局 DSH 目录与 DSH profile 数据,生成包含版本、路径、文件数和字节数的 manifest,并限制目录遍历不跟随符号链接。
- 增强失败处理:升级 Worker 持久化步骤、输出、警告和状态;任务异常中断会标记为失败,备份完成后提供自动修复与一键回滚,回滚后再次校验恢复的 DSH 版本并保留恢复副本。
- 增强客户端更新交互:显示备份路径、备份文件数、步骤状态和 peer dependency 警告;失败时支持自动修复或一键回滚,并轮询新的更新动作任务状态。
- 将 lib/update-worker.mjs 纳入 npm 发布白名单,并补充 Worker 自测、虚拟存储目录解析、客户端更新动作和发布文件契约校验。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.8,发布日期为 2026-09-14。

v1.2.7 - 2026-09-07

- 移除全局 pnpm 不支持的 --virtual-store-dir 参数。
- 当检测到旧版全局虚拟存储布局时,先串行执行 pnpm install --global --force 重建全局依赖树,再执行普通 DSH 更新命令。

v1.2.6 - 2026-09-07

- 修复 PNPM .modules.yaml 为单行 JSON 时无法读取 virtualStoreDir 的问题,确保一键更新会沿用现有全局虚拟存储目录。
- 增加 JSON 格式和旧版行式格式的解析自测,避免更新命令再次回退为未带目录参数的旧命令。

v1.2.5 - 2026-09-07

- 修复 PNPM 全局更新的虚拟存储目录兼容性:从已解析的 DSH 包路径向上查找 .modules.yaml,读取并校验 virtualStoreDir,在可用时将其传入更新命令,避免 PNPM 依赖树位置不一致导致更新失败。
- 增强命令路径处理:兼容 .modules.yaml 中的引号格式、Windows 绝对路径和最多 10 层父目录查找;对包含空格、& 或引号的参数进行安全转义,保证 Windows cmd.exe 执行文本正确。
- 补充发布契约校验:覆盖虚拟存储目录解析、--virtual-store-dir 参数和现有客户端注入契约,防止 PNPM 更新兼容修复回退。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.5,发布日期为 2026-09-07。

v1.2.4 - 2026-09-03

- 修复 DSH 新旧客户端模块加载兼容性:将 dsh.client.inject 中的过时 @deepseek-ai/dsh-client-runtime 替换为 @deepseek-ai/dsh-client-modules,保留语言、设置页、插槽和 UI 原语模块注入。
- 强化发布契约校验:明确要求 @deepseek-ai/dsh-client-modules 存在,并禁止已过时的 @deepseek-ai/dsh-client-runtime 残留,避免客户端加载入口回退。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.4,发布日期为 2026-09-03。

v1.2.3 - 2026-09-03

- 补充双语 README 的实际效果截图,覆盖侧边栏版本卡片、侧边栏窄栏悬停提示、设置页总览、npm/GitHub 双源版本检测结果、更新确认弹窗,以及更新执行记录、关于插件和安装命令。
- 将 images/Screenshot/ 纳入 npm 发布白名单,确保发布包包含 README 所引用的 6 张截图资源。
- 同步发布契约校验:纳入截图目录的发布文件清单,更新当前插件版本与发布日期校验,避免文档、包元数据和实际发布内容不一致。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.3,发布日期为 2026-09-03。

v1.2.2 - 2026-09-02

- 修复新版 DSH 设置服务兼容性:移除对 settingsNamespace 辅助函数的直接导入,改用设置命名空间字符串注册插件设置,兼容新增的 @deepseek-ai/dsh-settings 版本。
- 扩展 peerDependencies 版本范围:支持 @deepseek-ai/dsh-settings 的 0.1.2-alpha.2、0.1.2-alpha.4,以及 @deepseek-ai/schemastery 的 3.18.2,同时保留既有兼容版本。
- 更新发布契约校验:验证新的字符串命名空间注册方式,确保 DSH 设置兼容修复不会在后续改动中回退。
- 同步插件包、客户端关于页面和双语文档的版本标识为 v1.2.2,发布日期为 2026-09-02。

v1.2.1 - 2026-09-02

- 修复 GitHub 版本检测的限流容错:GitHub API 请求失败时自动尝试 Releases Atom Feed,并统一 API 与 Feed 返回的版本、类型、标签、发布日期、Release 链接和 npm 可用性信息。
- 增强 GitHub 检测状态展示:能够区分 API、备用 Feed、限流和暂时不可用状态;侧边栏版本卡片、Tooltip、检测结果卡片和更新提示会同步显示 npm/GitHub 来源与状态。
- 优化 Release 链接:无论数据来自 GitHub API 还是 Atom Feed,均规范为官方 Release 页面,并提供多语言“一键直达/Click to open”入口。
- 完善三语文案:补齐简体中文、英文和繁体中文的稳定渠道 latest、更新来源、检测通道、Feed 状态、限流提示和 Release 直达文案;语言下拉项统一保持 语言/Language。
- 补充发布契约校验:覆盖 GitHub Feed 回退、限流错误、检测通道、Feed 文案、Release 直达文案及三语多语言键,确保新链路不会被后续改动破坏。
- 更新插件包、客户端关于页面和双语文档的版本标识为 v1.2.1,发布日期为 2026-09-02。

v1.2.0 - 2026-09-01

- 重构双源版本检测:同时查询 npm Registry 与官方 GitHub Releases,显示当前版本、最新版本、发布类型、发布日期、Release 标签、链接及 npm 可用性。
- 增强版本识别与比较:支持 Alpha、Beta、RC、正式版及多位数字版本,并区分最新、可更新、当前版本更高和检测失败等状态。
- 完善检测时机与缓存:页面加载时检测,每 30 分钟自动刷新,窗口回到前台时按间隔刷新;结果由 DSH 进程缓存,避免重复请求。
- 更新设置页结果展示:新增可展开的 npm/GitHub 双卡片,展示当前安装方式和插件管理器,并提供稳定渠道 latest 的清晰中文、英文和繁体中文文案。
- 增加安全更新流程:更新前明确展示来源、目标版本、发布类型和风险,只有经过确认的固定版本命令才会执行。
- 增强主机端更新保护:更新接口限制为回环地址、合法来源和页面级令牌,校验目标是否过期,避免重复任务,并记录命令输出、完成状态、失败原因和重启提示。
- 覆盖多种更新方式:npm 与 pnpm 支持主机端一键更新,npx 提供临时执行命令;没有对应 npm 包的 GitHub 版本自动回退到 clone、checkout、安装、构建和启动步骤。
- 同步插件包、关于页面及双语文档的版本标识为 v1.2.0,发布日期为 2026-09-01,并补充对应的构建与多语言契约校验。

v1.1.1 - 2026-08-29

- 新增黑白描边版插件 Logo,并应用到双语 README 和设置页顶部。
- 设置页图标沿用参考项目的桌面端 54px 展示尺寸,使用内联 PNG 保证 npm 安装后可用。

v1.1.0 - 2026-08-29

- 新增 DSH 设置中的“DSH版本检测”一级导航,使用默认齿轮图标。
- 新增复刻参考项目的插件设置卡片和三语语言设置。
- 新增展开式版本检测结果、npm/npx/pnpm 更新区分和安全一键更新路由。
- 统一所有用户可见插件版本为 v1.1.0。

v1.0.1 - 2026-08-29

- 修复 scoped npm 包的 DSH bundle 导入名,保持运行时插件 ID 不变。

v1.0.0 - 2026-08-28

- 首次发布 DSH Web 版本显示插件。
- 支持运行时读取 DSH 版本、npm registry 更新检查、手动刷新和 Toast 提示。
- 支持侧边栏响应式布局、浅色/深色主题以及中英文界面。
- 增加版本比较、超时控制和版本不可用时的安全回退。

作者

作者:Jack·Huang 邮箱:jack698698@gmail.com

License

本项目以 MIT License 发布。Copyright © 2026 Jack·Huang。
预览分享卡片长什么样 ↓hjj345/dsh-sm-version-display
分享 · DeepSeek Harness Hub
hjj345/dsh-sm-version-display

在侧边栏设置上方显示已装版本并检测更新

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