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

插件批量更新加速 basaltfold/dsh-plugin-fast

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

把插件市场全部更新合并成一次安装,并修复配置报错

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 24 条)
  • 读取本地文件
    fast-update.mjs:60
    if (existsSync(p)) return p;
  • 读取本地文件
    fast-update.mjs:95
    if (!existsSync(p)) return null;
  • 读取本地文件
    fast-update.mjs:96
    try { return JSON.parse(readFileSync(p, 'utf8')).version ?? null; } catch { return null; }
  • 发起网络请求
    fast-update.mjs:101
    const res = await fetch(url, { signal: AbortSignal.timeout(20000) });
  • 读取本地文件
    fast-update.mjs:107
    if (!existsSync(pkgPath)) { console.error(`找不到 profile:${PROFILE}`); process.exit(2); }
  • 读取本地文件
    fast-update.mjs:108
    const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    fast-update.mjs:170
    const snap = (f) => { const p = join(PROFILE, f); if (existsSync(p)) copyFileSync(p, join(backup, f)); };
  • 写入本地文件
    fast-update.mjs:170
    const snap = (f) => { const p = join(PROFILE, f); if (existsSync(p)) copyFileSync(p, join(backup, f)); };
  • 执行外部命令来自配置/变量
    fast-update.mjs:200
    ? spawn(process.execPath, [pnpm, ...pnpmArgs], {
  • 执行外部命令来自配置/变量
    fast-update.mjs:203
    : spawn(pnpm, pnpmArgs, {
  • 写入本地文件
    fast-update.mjs:224
    if (existsSync(b)) copyFileSync(b, join(PROFILE, f));
  • 读取本地文件
    fix-profile.mjs:54
    if (!existsSync(join(PROFILE, 'package.json'))) {
  • 读取本地文件
    fix-profile.mjs:63
    let ws = existsSync(wsPath) ? readFileSync(wsPath, 'utf8') : 'packages:\n - .\n';
  • 读取本地文件
    fix-profile.mjs:63
    let ws = existsSync(wsPath) ? readFileSync(wsPath, 'utf8') : 'packages:\n - .\n';
  • 读取本地文件
    fix-profile.mjs:82
    const npmrcBefore = existsSync(npmrcPath) ? readFileSync(npmrcPath, 'utf8') : '';
  • 读取本地文件
    fix-profile.mjs:82
    const npmrcBefore = existsSync(npmrcPath) ? readFileSync(npmrcPath, 'utf8') : '';
  • 读取本地文件
    fix-profile.mjs:108
    if (!existsSync(p)) return out;
  • 执行外部命令固定命令
    fix-profile.mjs:127
    try { execFileSync('git', ['config', '--global', '--unset', key]); } catch { }
  • 写入本地文件
    fix-profile.mjs:144
    writeFileSync(p, kept.join('\n'));
  • 写入本地文件
    fix-profile.mjs:239
    mkdirSync(BACKUP, { recursive: true });
  • 写入本地文件
    fix-profile.mjs:240
    const keep = (p) => { if (existsSync(p)) copyFileSync(p, join(BACKUP, p.split(/[ /]/).pop())); };
  • 写入本地文件
    fix-profile.mjs:244
    if (ws !== wsBefore) writeFileSync(wsPath, ws);
  • 写入本地文件
    fix-profile.mjs:245
    if (npmrc !== npmrcBefore) writeFileSync(npmrcPath, npmrc);
  • 写入本地文件
    fix-profile.mjs:254
    writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

DSH 插件市场更新加速:把「全部更新 (N)」的 N 次串行 pnpm 调用合并成 1 次,并修复会导致更新失败的本机配置

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-fast 让 DSH 的插件市场点一下就能全部更新好,而不是一个插件等几分钟到几十分钟。 这是一个命令行工具(不是能被插件市场加载的 DSH bundle,见文末「它不是什么」)。所有数字都在一台真实机器上跑出来,不是估算。 它解决什么 DSH 插件市场的「全部更新 (N)」是严格串行的:每更新一个插件就单独起一次 pnpm add,而每一次都会重新验证并重放整份 lockfile(实测 473 条条目)。N 个插件 = N 次全树重放。 三个原因叠加,让它从「几十秒」变成「几个小时」: | 现象 | 真实原因 | | 点更新必然失败 | pnpm 11 的 minimumReleaseAge 默认 1440 分钟(24 小时),而且它做的是整份 lockfile 校验 —— 只要已装依赖里有一个版本是 24 小时内发布的,这个 profile 的所有安装/更新都会被拒(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION) | | 更新不动 / 卡很久 | git 全局配置里的代理端口关了,而所有 github: 依赖都走 git,且 git 只读全局 http.proxy,不读环境变量 |
展开完整文档(README 剩余 1 节)
dsh-plugin-fast

让 DSH 的插件市场点一下就能全部更新好,而不是一个插件等几分钟到几十分钟。

这是一个命令行工具(不是能被插件市场加载的 DSH bundle,见文末「它不是什么」)。所有数字都在一台真实机器上跑出来,不是估算。

它解决什么

DSH 插件市场的「全部更新 (N)」是严格串行的:每更新一个插件就单独起一次 pnpm add,而每一次都会重新验证并重放整份 lockfile(实测 473 条条目)。N 个插件 = N 次全树重放。

三个原因叠加,让它从「几十秒」变成「几个小时」:

| 现象 | 真实原因 |
| 点更新必然失败 | pnpm 11 的 minimumReleaseAge 默认 1440 分钟(24 小时),而且它做的是整份 lockfile 校验 —— 只要已装依赖里有一个版本是 24 小时内发布的,这个 profile 的所有安装/更新都会被拒(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION) |
| 更新不动 / 卡很久 | git 全局配置里的代理端口关了,而所有 github: 依赖都走 git,且 git 只读全局 http.proxy,不读环境变量 |
| 慢 | 下载区域镜像的 tarball 延迟差 10 倍(实测 2697ms vs 283ms);github: 悬浮规格每次都要去问 GitHub HEAD(实测 10.7 秒/次) |

其中第一条在官方桌面宿主上无解:市场被明确禁止传 --config.minimum-release-age=0(acceptsMarketPnpmFlags: false),所以只能从 profile 自己的 pnpm-workspace.yaml 解决 —— 这正是 fix-profile.mjs 做的事。

实测数字

同一台机器、同一个镜像、都是成功路径:

| 方式 | 16 个插件耗时 |
| 16 次独立 pnpm add(= 市场「全部更新」的行为) | 57 秒 |
| 一条 pnpm add a@x b@y … 装完 16 个 | 3.6 秒 |

单插件 pnpm add(热缓存)本身只要 4~5 秒 —— 所以「一个插件要几十分钟」从来不是 pnpm 的安装速度问题。

等待期那条的决定性验证(同一份真实 lockfile,只差一个键):

不加键(= 默认状态) ✗ Lockfile failed supply-chain policy check (473 entries in 7.3s) [ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION] 7 lockfile entries failed verification

只加一行 minimumReleaseAge: 0 ✓ Lockfile passes supply-chain policies (473 entries in 10ms)

完整证据链、代码定位(routes.js:4671、official-desktop.js:562 等)见 docs/诊断与优化报告.md。

用法

1. 先修配置(默认预览,零写入)

node fix-profile.mjs

确认之后落盘(会先把被改的文件备份到 profile 里的 .fix-backup-<时间戳>/):

node fix-profile.mjs --apply

它做四件事:

| # | 改动 | 为什么 |
| 1 | pnpm-workspace.yaml 写入 minimumReleaseAge: 0 | 解开「整份 lockfile 被拒」,这是更新失败的头号原因 |
| 2 | .npmrc 写入 npmmirror + 并发/重试/超时 + prefer-offline | 镜像快约 10 倍;网络抖动不再拖成整轮失败 |
| 3 | 探测 git 全局代理端口,连不上就移除 http.proxy / https.proxy | git 类插件失败的根因;代理还活着则保留不动 |
| 4 | 把悬浮的 github:owner/repo 固定到 lockfile 里已在用的那个 commit | 省掉每次安装的 GitHub HEAD 往返 |

可选:--release-age 60 保留 60 分钟等待期(保留一部分供应链保护,代价是刚发布的版本仍装不了);--region global 让市场自己发起的安装也走 .npmrc 的镜像(见下)。

关于第 2 条的生效范围:市场在 region=china 时会向子进程注入 npm_config_registry,环境变量优先级高于 .npmrc,所以不改区域的话这一步对市场发起的安装无效。--region global 会写 .dsh-market/state.json 固定区域(代价:失去 gh-proxy.com 的 GitHub 兜底)。fast-update.mjs 是显式传 --registry,不受这条影响。

2. 批量更新

node fast-update.mjs --dry-run # 先看有哪些可更新
node fast-update.mjs # 一条 pnpm 命令装完全部

常用参数:--only a,b、--registry <url>、--profile <目录>、--pnpm <宿主自带 pnpm.cjs 路径>、--include-git。

行为要点:

- 并行查 registry 最新版本,用 semver 比较(区分精确版本与 range,正确处理 prerelease)
- 一次 pnpm add 装上全部目标 —— 这是 3.6 秒 vs 57 秒的来源
- 自动备份 package.json / pnpm-lock.yaml / pnpm-workspace.yaml;失败且版本没落地就自动还原
- pnpm 11 会把「有构建脚本未批准」当 exit 1(ERR_PNPM_IGNORED_BUILDS),这是良性告警 —— 脚本会先核对版本是否真的写进去了,再决定是否回滚

更新前请完全退出 DSH。 运行中的宿主会占用依赖文件,市场本身也有「agent 运行时拒绝替换文件」的保护(routes.js:4338)。退出后跑,就不会撞上它。

它不是什么

- 不是能被插件市场加载的 DSH bundle。 它没有 dsh.bundle.patch,装进配置档不会引入任何运行时代码 —— 这是刻意为之:一个写错的 cordis 补丁会破坏别人的 DSH 启动。它就是一个 npm 包形态的命令行工具(dsh-fast-update / dsh-fix-profile 两个 bin)。
- 不改插件本身。 它只动配置档的包管理配置与 git 配置,且全部先备份。
- 不能更新 DSH 桌面端自身(宿主限制,市场条目 #900)。

已知取舍

- minimumReleaseAge: 0 等于放弃「新版本冷静期」这层供应链保护,换来「一点就成功」。想两者兼顾用 --release-age 60。
- git 类依赖需要 git 本身能连上 GitHub;本工具不代理、不改 hosts。

License

MIT
预览分享卡片长什么样 ↓basaltfold/dsh-plugin-fast
分享 · DeepSeek Harness Hub
basaltfold/dsh-plugin-fast

把插件市场全部更新合并成一次安装,并修复配置报错

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