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

插件批量更新 ricardooooooa/dsh-plugin-batch-toggle

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

一键顺序更新全部 npm 插件并保留原启用状态

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 68 处,展示前 60 条)
  • 读取本地文件
    src/index.ts:27
    const manifest = JSON.parse(await readFile(join(profile.dir, 'package.json'), 'utf8'))
  • 写入本地文件
    src/store.ts:115
    await mkdir(this.directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/store.ts:121
    await rename(temporary, this.snapshotPath)
  • 删除本地文件
    src/store.ts:123
    try { await unlink(temporary) }
  • 删除本地文件
    src/store.ts:130
    try { await unlink(this.snapshotPath) }
  • 写入本地文件
    src/store.ts:135
    await mkdir(this.directory, { recursive: true, mode: 0o700 })
  • 读取本地文件
    src/store.ts:144
    const source = await readFile(path, 'utf8')
  • 删除本地文件
    src/store.ts:166
    try { await unlink(temporary) }
  • 删除本地文件
    src/store.ts:173
    try { await unlink(path) }
  • 删除本地文件
    src/store.ts:202
    await unlink(this.lockPath)
  • 发起网络请求
    src/ui/store.ts:166
    const response = await fetch(`${baseUrl}/${path}`, { method, credentials: 'same-origin', cache: 'no-store', signal: controller.signal })
  • 写入本地文件
    src/update-store.ts:108
    await mkdir(this.directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    src/update-store.ts:114
    await rename(temporary, this.path)
  • 删除本地文件
    src/update-store.ts:116
    try { await unlink(temporary) }
  • 删除本地文件
    src/update-store.ts:123
    try { await unlink(this.path) }
  • 写入本地文件
    tooling/dev-dsh.mjs:15
    for (const dir of [home, agentsHome, cwd, documents]) await mkdir(dir, { recursive: true })
  • 读取本地文件
    tooling/dev-dsh.mjs:17
    try { await access(path.join(dir, '.env')) } catch { continue }
  • 写入本地文件
    tooling/dev-dsh.mjs:21
    await writeFile(patch, `- id: workspace-controller\n config:\n documentsDirectory: ${JSON.stringify(documents.replaceAll('\\', '/'))}\n`)
  • 读取本地文件
    tooling/dev-dsh.mjs:31
    try { await access(path.join(home, 'profiles', config.profile, 'package.json')) } catch {
  • 执行外部命令来自配置/变量
    tooling/dev-dsh.mjs:36
    const child = spawn(config.desktopExecutable, args, { cwd, env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 执行外部命令固定命令
    tooling/dev-dsh.mjs:59
    ? spawnSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', timeout: 5000 })
  • 发起网络请求
    tooling/dev-dsh.mjs:87
    const bootstrap = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(1000) })
  • 发起网络请求
    tooling/dev-dsh.mjs:90
    ? await fetch(new URL(url).origin, { headers: { Cookie: cookie }, redirect: 'manual', signal: AbortSignal.timeout(1000) })
  • 写入本地文件
    tooling/dev-dsh.mjs:104
    await writeFile(path.join(dev, 'runtime-report.json'), JSON.stringify(report, null, 2) + '\n')
  • 写入本地文件
    tooling/dev-dsh.mjs:111
    await writeFile(path.join(dev, 'runtime.log'), redact(output))
  • 读取本地文件
    tooling/development.mjs:57
    const config = JSON.parse(await readFile(path.join(root, 'config/development.json'), 'utf8'))
  • 读取本地文件
    tooling/development.mjs:95
    if (!(await stat(filename)).isFile()) throw Object.assign(new Error('Not a file'), { code: 'NOT_FILE' })
  • 读取本地文件
    tooling/doctor.mjs:10
    const projectPackage = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8'))
  • 读取本地文件
    tooling/doctor.mjs:16
    const pkg = JSON.parse(await readFile(require.resolve(`${name}/package.json`), 'utf8'))
  • 写入本地文件
    tooling/doctor.mjs:21
    await mkdir(path.join(root, '.dev'), { recursive: true })
  • 写入本地文件
    tooling/doctor.mjs:22
    await writeFile(path.join(root, '.dev/environment-report.json'), JSON.stringify(report, null, 2) + '\n')
  • 请求外部主机registry.npmjs.org
    tooling/fixture-registry.mjs:55
    try { const upstream = await fetch(`https://registry.npmjs.org${pathname}`, { signal: AbortSignal.timeout(15000) }); response.writeHead(upstream.statu
  • 发起网络请求
    tooling/fixture-registry.mjs:55
    try { const upstream = await fetch(`https://registry.npmjs.org${pathname}`, { signal: AbortSignal.timeout(15000) }); response.writeHead(upstream.statu
  • 读取本地文件
    tooling/integration.mjs:12
    const pkg = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8'))
  • 写入本地文件
    tooling/integration.mjs:21
    for (const dir of [home, agents, cwd]) await mkdir(dir, { recursive: true })
  • 执行外部命令来自配置/变量
    tooling/integration.mjs:26
    const child = spawn(config.desktopExecutable, ['--expose-internals', cli, ...args], { cwd, env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] }
  • 执行外部命令固定命令
    tooling/integration.mjs:30
    const timer = setTimeout(() => spawnSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' }), 90000)
  • 写入本地文件
    tooling/integration.mjs:38
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    tooling/integration.mjs:39
    await writeFile(path.join(directory, 'package.json'), JSON.stringify({ name, version: '1.0.0', type: 'module', main: 'index.js', dsh: { bundle: { patc
  • 写入本地文件
    tooling/integration.mjs:40
    await writeFile(path.join(directory, 'index.js'), `export const name = ${JSON.stringify(name)}; export function apply(ctx) { ctx.effect(() => () => {}
  • 写入本地文件
    tooling/integration.mjs:41
    await writeFile(path.join(directory, 'cordis.patch.yml'), `- insert:\n - id: ${name}\n name: ${name}\n`)
  • 读取本地文件
    tooling/integration.mjs:45
    await access(tgz)
  • 写入本地文件
    tooling/integration.mjs:47
    await writeFile(path.join(profile, '.npmrc'), 'registry=https://registry.npmjs.org/\nfetch-retries=0\nfetch-timeout=15000\n')
  • 读取本地文件
    tooling/integration.mjs:57
    const initial = JSON.parse(await readFile(manifestPath, 'utf8'))
  • 执行外部命令来自配置/变量
    tooling/integration.mjs:67
    const child = spawn(config.desktopExecutable, ['--expose-internals', cli, '--profile', 'batch-integration', '--patch', patch, '--host', '127.0.0.1', '
  • 发起网络请求
    tooling/integration.mjs:76
    const bootstrap = await fetch(launchUrl, { redirect: 'manual' })
  • 发起网络请求
    tooling/integration.mjs:80
    const request = (route, options = {}) => fetch(`${origin}/api/dsh-plugin-batch-toggle/${route}`, { ...options, headers: { Cookie: cookie, ...options.h
  • 执行外部命令固定命令
    tooling/integration.mjs:93
    spawnSync('taskkill.exe', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore', timeout: 5000 })
  • 发起网络请求
    tooling/integration.mjs:101
    const response = await runtime.request('status')
  • 读取本地文件
    tooling/integration.mjs:109
    const selected = async () => JSON.parse(await readFile(manifestPath, 'utf8')).dsh.profile.bundles
  • 发起网络请求
    tooling/integration.mjs:119
    assert.ok([401, 403].includes((await fetch(`${runtime.origin}/api/dsh-plugin-batch-toggle/status`)).status))
  • 发起网络请求
    tooling/integration.mjs:120
    assert.ok([401, 403].includes((await fetch(`${runtime.origin}/api/dsh-plugin-batch-toggle/disable`, { method: 'POST' })).status))
  • 发起网络请求
    tooling/integration.mjs:121
    assert.equal((await runtime.request('disable', { method: 'POST', headers: { Origin: 'https://evil.invalid', 'Sec-Fetch-Site': 'cross-site' } })).statu
  • 读取本地文件
    tooling/integration.mjs:158
    const events = (await readFile(path.join(home,'fixture-events.jsonl'),'utf8')).trim().split('\n').map(line=>JSON.parse(line))
  • 写入本地文件
    tooling/pack.mjs:9
    await mkdir(destination, { recursive: true })
  • 执行外部命令来自配置/变量
    tooling/pack.mjs:10
    const built = spawnSync(process.execPath, [path.join(root, 'tooling/build.mjs')], { cwd: root, stdio: 'inherit', windowsHide: true })
  • 执行外部命令来自配置/变量
    tooling/pack.mjs:14
    const result = spawnSync(process.execPath, [npmCli, 'pack', '--ignore-scripts', '--json', '--pack-destination', destination], { cwd: root, encoding: '
  • 读取本地文件
    tooling/pack.mjs:23
    const digest = createHash('sha256').update(await readFile(filename)).digest('hex')
  • 写入本地文件
    tooling/pack.mjs:24
    await writeFile(`${filename}.sha256`, `${digest} ${item.filename}\n`)
  • 写入本地文件
    tooling/pack.mjs:25
    await writeFile(path.join(destination, 'package-report.json'), JSON.stringify({ filename: item.filename, sha256: digest, files: item.files, size: item
扫描于 2026/11/4(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-layout@deepseek-ai/dsh-client-ui-plugin-manager@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-plugin-manager
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 管理器和市场支持 npm 插件一键更新,保留启用状态,并可持久恢复。

README

由 DeepSeek 最新模型翻译生成
DSH Plugin Batch Toggle · 插件一键更新 在 DeepSeek Harness 的插件管理和 dshmarket 中,用一颗 一键更新 按钮顺序更新 npm 来源插件,自动取消使用并恢复原启用状态。原先关闭的插件更新后仍保持关闭。 English · 更新记录 · 问题反馈 安装 v0.2.0 运行验收基线为 DSH 0.2.1-rc.5,兼容声明为 >=0.2.1-rc.5 <0.2.2-0,需要 Node.js 24+。 1. 在 DSH 中打开 插件 → 添加插件。 2. 粘贴下面的 v0.2.0 预编译安装包链接,或先下载后填写文件的绝对路径。 3. 安装并启用本插件;若 DSH 提示需要重启,按提示重启。 https://github.com/ricardooooooa/dsh-plugin-batch-toggle/releases/download/v0.2.0/dsh-plugin-batch-toggle-0.2.0.tgz 预编译包无需 TypeScript 或其他构建工具。GitHub Release 已发布;截至 2026-10-30,未发布到 npm,未提交社区目录收录 PR。请使用上面的发行附件安装。 目前准备的是 dshmarket 社区目录收录。
展开完整文档(README 剩余 1 节)
DSH Plugin Batch Toggle · 插件一键更新

在 DeepSeek Harness 的插件管理和 dshmarket 中,用一颗 一键更新 按钮顺序更新 npm 来源插件,自动取消使用并恢复原启用状态。原先关闭的插件更新后仍保持关闭。

English · 更新记录 · 问题反馈

安装 v0.2.0

运行验收基线为 DSH 0.2.1-rc.5,兼容声明为 >=0.2.1-rc.5 <0.2.2-0,需要 Node.js 24+。

1. 在 DSH 中打开 插件 → 添加插件。
2. 粘贴下面的 v0.2.0 预编译安装包链接,或先下载后填写文件的绝对路径。
3. 安装并启用本插件;若 DSH 提示需要重启,按提示重启。

https://github.com/ricardooooooa/dsh-plugin-batch-toggle/releases/download/v0.2.0/dsh-plugin-batch-toggle-0.2.0.tgz

预编译包无需 TypeScript 或其他构建工具。GitHub Release 已发布;截至 2026-10-30,未发布到 npm,未提交社区目录收录 PR。请使用上面的发行附件安装。

目前准备的是 dshmarket 社区目录收录。此 tarball-only 发行版不会进入要求 npm 元数据的官方 Discover 索引;下文的 Discover 入口是指安装后的界面按钮。

升级本插件请使用 DSH 的添加/更新插件入口,它不会在一键更新中更新自己。若使用桌面 profile 的命令行安装,应先完全退出桌面端,并使用同一 rc.5 安装附带的 CLI。

使用

点击插件管理或 dshmarket 页头的 一键更新。每个符合条件的包依次执行:检查版本 → 必要时取消使用 → 移除旧包 → 安装更新 → 恢复原启用意图并核对结果。

- 界面显示当前项、阶段、进度、失败数量和逐项结果。单项明确失败并完成收尾后,继续处理后面的项目。
- 运行时同一按钮变为 停止更新;停止请求等待当前项安全收尾或回滚,不会立即终止安装进程。
- 批量更新 标签提供完整结果与恢复状态;“添加插件”菜单也有入口。详情页只显示自身的操作按钮,不重复显示页头按钮。
- 若有 v0.1 遗留恢复记录,先按记录接续恢复;再次运行也会优先处理上一轮未完成项。

支持官方 Installed、Discover、dshmarket 标签的共用页头,以及 dshmarket 独立设置/侧栏面板。

更新范围与限制

自动更新仅适用于可管理、以自身包名从 npm 注册表安装的第三方 bundle。本插件、市场载体、官方/核心组件、只读和不可管理项会跳过。Git、本地 file/link、tarball/URL 与 npm 别名来源也会跳过,原因可在详情查看。

查询到的 latest 是参考版本。实际安装通过 DSH 官方插件管理 SDK,遵守其注册表配置、兼容性检查、脚本审批和 minimumReleaseAge 等策略;刚发布的最新版本可能尚不可安装。结果分别显示更新前、查询最新和实际安装版本。

安装或校验失败会尽力重装原版本并恢复原启用意图。结果和未完成项保存在当前 profile 的 .dsh-plugin-batch-toggle/,重启后可接续处理。回滚并非完全撤销:第三方脚本、数据变更与运行状态不保证能够还原;回滚失败的项目会保留恢复责任。卸载本插件前应先处理未完成项。

其他已知限制:

- DSH 要求重启时显示提示,本插件不自动重启。
- 官方启用 API 会把恢复的 bundle 追加到列表末尾,不能保证与保留包交错的完整配置优先顺序原样复原。
- 不强制开启包内原先关闭的 Cordis 插件项。
- 页头入口依赖 DOM 标记兼容层;宿主页面结构变化时,可使用原生“批量更新”标签或菜单。

接口使用 DSH 现有 Owner 认证和同源校验,不额外监听端口,不需要模型密钥。本插件不上传会话;查询和安装会访问配置的 npm 注册表。

界面预览

以下截图均来自 rc.5 独立测试 profile。更新结果中的 dsh-update-fixture-* 是控制注册表中的测试包,不代表已验证所有社区插件。

插件管理: Installed、Discover 和市场共用页头的一键更新入口。

rc.5 插件管理中的一键更新入口

dshmarket: 市场标签中保留相同入口,与市场自己的更新按钮分开显示。

rc.5 dshmarket 中的一键更新入口

结果详情: 测试包 B 更新失败后回滚,后续测试包继续更新;详情页没有重复页头按钮。

独立测试包的更新结果与回滚详情

开发与验证

./tooling/bootstrap.ps1
./tooling/pnpm.ps1 run check
./tooling/pnpm.ps1 run release:pack
./tooling/pnpm.ps1 run test:integration:updates
2026-10-30 的本地验收通过类型检查、108 项自动测试、前后端构建,以及真实 rc.5 的控制注册表集成场景:A/C/D 更新成功,B 失败后回滚且后续继续,原先关闭的 D 保持关闭且未执行。测试使用隔离配置档,不执行日常插件集合的一键更新。完整范围与边界见 验证记录。

发布说明 · 社区收录准备与 PR 草稿 · 当前设计 · MIT License
预览分享卡片长什么样 ↓ricardooooooa/dsh-plugin-batch-toggle
分享 · DeepSeek Harness Hub
ricardooooooa/dsh-plugin-batch-toggle

一键顺序更新全部 npm 插件并保留原启用状态

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