安全升级 DSH 插件并自动回滚失败变更
30.2/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:engines.node 要求 >=24.0.0,不满足 Node 22.19.0。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add nowanti/dsh-keeper该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 46 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/11/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装engines.node 要求 >=24.0.0,不满足 Node 22.19.0
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-keeper @ 0.3.3
✗Node 引擎要求 >=24.0.0 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 13:15:07
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 60 处,展示前 32 条)
- 读取本地文件src/adapters/dsh.ts:27
accessSync(candidate, constants.X_OK) - 读取本地文件src/adapters/dsh.ts:42
if (existsSync(manifestPath)) { - 读取本地文件src/adapters/dsh.ts:44
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as { name?: unknown; version?: unknown } - 执行外部命令来自配置/变量src/adapters/process.ts:69
const child = spawn(invocation.command, invocation.args, { - 读取本地文件src/adapters/profiles.ts:43
const stat = statSync(path) - 读取本地文件src/adapters/profiles.ts:45
return JSON.parse(readFileSync(path, 'utf8')) as PackageManifest - 读取本地文件src/adapters/profiles.ts:51
return existsSync(path) ? path : null - 读取本地文件src/adapters/profiles.ts:67
if (!existsSync(root)) return versions - 读取本地文件src/adapters/profiles.ts:80
for (const entry of readdirSync(root, { withFileTypes: true })) { - 读取本地文件src/adapters/profiles.ts:85
for (const child of readdirSync(scopePath, { withFileTypes: true })) { - 写入本地文件src/adapters/runtime.ts:212
mkdirSync(dirname(logPath), { recursive: true, mode: 0o700 }) - 写入本地文件src/adapters/runtime.ts:213
mkdirSync(dirname(pidPath), { recursive: true, mode: 0o700 }) - 执行外部命令来自配置/变量src/adapters/runtime.ts:229
child = spawn(commandLine, { ...childOptions, shell: true }) - 执行外部命令来自配置/变量src/adapters/runtime.ts:231
child = spawn(this.#binary, ['--profile', runtime.profile, '--port', String(runtime.port)], { ...childOptions, shell: false }) - 写入本地文件src/adapters/runtime.ts:257
writeFileSync(pidPath, `${servicePid}\n`, { mode: 0o600 }) - 执行外部命令固定命令src/i18n.ts:337
const result = spawnSync('defaults', ['read', '-g', 'AppleLanguages'], { encoding: 'utf8', timeout: 2_000 }) - 写入本地文件src/upgrade.ts:106
mkdirSync(path, { recursive: true, mode: 0o700 }) - 读取本地文件src/upgrade.ts:110
const stat = lstatSync(source) - 写入本地文件src/upgrade.ts:113
copyFileSync(source, target) - 读取本地文件src/upgrade.ts:118
for (const entry of readdirSync(source)) safeCopyTree(join(source, entry), join(target, entry), locale) - 写入本地文件src/upgrade.ts:123
writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 }) - 写入本地文件src/upgrade.ts:124
renameSync(temporary, path) - 删除本地文件递归src/upgrade.ts:145
rmSync(target, { recursive: true, force: true }) - 读取本地文件src/upgrade.ts:165
if (existsSync(source)) safeCopyTree(source, join(stagedPath, name), locale) - 读取本地文件src/upgrade.ts:168
if (existsSync(patches)) safeCopyTree(patches, join(stagedPath, 'patches'), locale) - 读取本地文件src/upgrade.ts:170
if (!existsSync(liveModules)) throw new Error(translate(locale, 'error.profileModulesMissing', { path: profilePath })) - 读取本地文件src/upgrade.ts:173
if (!existsSync(manifestPath)) throw new Error(translate(locale, 'error.profileManifestMissing', { path: profilePath })) - 写入本地文件src/upgrade.ts:207
writeFileSync(join(stagedPath, 'pnpm-lock.yaml'), lock, { mode: 0o600 }) - 删除本地文件递归src/upgrade.ts:294
rmSync(plan.stagingRoot, { recursive: true, force: true }) - 写入本地文件src/upgrade.ts:304
copyFileSync(source, temporary) - 删除本地文件递归src/upgrade.ts:314
if (existsSync(failedModules)) rmSync(failedModules, { recursive: true, force: true }) - 删除本地文件src/upgrade.ts:323
else if (!file.existed && existsSync(live)) rmSync(live)
扫描于 2026/11/4(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 安全升级插件
- 自动回滚失败变更
- 管理兼容性
DeepSeek Harness 的安全生命周期与兼容性管理器
README
由 DeepSeek 最新模型翻译生成dsh-keeper
CI
dsh-keeper 是 DeepSeek Harness 的外部生命周期与兼容性管理器。其主要可执行文件是更短的 dshk;dsh-keeper 是等效的别名。默认工作流有意设计为一条命令:
dshk upgrade
它会发现已安装的 DSH 配置文件,评估插件候选,询问一次,在无凭据的隔离配置文件中验证确切的集合,将其作为一个可恢复的事务应用,并在任何实时检查失败时恢复上一代。
社区项目;与 DeepSeek 无关联。开发者预览版:DSH 核心升级会被报告,但尚未自动应用。
安装
需要 Node.js 24 或更高版本。
npm install --global dsh-keeper
dshk upgrade
如需一次性检查:
npx dsh-keeper status
它保护什么
- 当较新的核心尚无法以事务方式切换时,保留当前的 DSH 版本。
- 仅选择具有可用的 DSH/宿主和 Node 兼容性证据的 npm 插件候选。
- 将缺失的 peer 包视为隔离证据,而不是假定它们是用户管理的冲突。
- 暂缓处理本地补丁、权限变更、新的生命周期脚本、可变 Git 引用以及证据不足的候选。
- 绝不因为插件的远程仓库不可用就移除该插件。
- 不将任何凭据、会话、存储、SSH 密钥或提供方机密复制到暂存区。
展开完整文档(README 剩余 1 节)
dsh-keeper CI dsh-keeper 是 DeepSeek Harness 的外部生命周期与兼容性管理器。其主要可执行文件是更短的 dshk;dsh-keeper 是等效的别名。默认工作流有意设计为一条命令: dshk upgrade 它会发现已安装的 DSH 配置文件,评估插件候选,询问一次,在无凭据的隔离配置文件中验证确切的集合,将其作为一个可恢复的事务应用,并在任何实时检查失败时恢复上一代。 社区项目;与 DeepSeek 无关联。开发者预览版:DSH 核心升级会被报告,但尚未自动应用。 安装 需要 Node.js 24 或更高版本。 npm install --global dsh-keeper dshk upgrade 如需一次性检查: npx dsh-keeper status 它保护什么 - 当较新的核心尚无法以事务方式切换时,保留当前的 DSH 版本。 - 仅选择具有可用的 DSH/宿主和 Node 兼容性证据的 npm 插件候选。 - 将缺失的 peer 包视为隔离证据,而不是假定它们是用户管理的冲突。 - 暂缓处理本地补丁、权限变更、新的生命周期脚本、可变 Git 引用以及证据不足的候选。 - 绝不因为插件的远程仓库不可用就移除该插件。 - 不将任何凭据、会话、存储、SSH 密钥或提供方机密复制到暂存区。 - 重新验证已提升的配置文件,并在失败时恢复包清单、锁文件、node_modules 和常驻服务。 命令 dshk upgrade dshk upgrade -y # 仅跳过提问,绝不跳过验证 dshk upgrade --profile web dshk upgrade --plugins-only dshk upgrade --preview dshk upgrade --dry-run dshk upgrade --json dshk status dsh-keeper status # 等效的长格式可执行文件 交互式终端在耗时操作期间显示一行更新的加载指示器。JSON 和管道输出不包含进度字符。阶段计时仅在 --verbose 或 JSON 中出现。 语言 内置英语和简体中文。中文系统默认使用 zh-CN;其他系统默认使用英语。 dshk --lang en status dshk upgrade --lang zh-CN DSH_KEEPER_LANG=zh-CN dshk status JSON 回执与语言无关。兼容性和决策说明使用稳定的原因代码以及结构化参数;翻译仅发生在人类可读的呈现中。 兼容性状态 - declared:候选暴露了兼容的 DSH 宿主契约。 - unknown:证据不足以进行自动升级。 - blocked:DSH、Node 或必需的 peer 契约存在已确认的冲突。 declared 不等于已验证。自动切换仍然需要精确的包解析、隔离安装、配置组合、实时重新验证以及服务恢复。 平台状态 macOS、Linux 和 Windows 均由 GitHub 托管的原生运行器覆盖。矩阵运行单元/事务测试、双语 CLI 冒烟测试、包检查,以及使用 dsh --dump-config 的真实 DSH profile。确切的证据和剩余边界见可移植性与本地化。 开发 corepack enable pnpm install --frozen-lockfile pnpm check pnpm test:real-dsh npm pack --dry-run 架构与发布详情: - 设计 - 安全模型 - 可移植性与本地化 - 发布流程 - DSH 生态定位 中文说明 dsh-keeper 是运行在 DSH 进程之外的生命周期与兼容性工具,日常使用短命令 dshk。普通用户只需执行 dshk upgrade:系统发现候选后展示一次明确方案,用户确认才下载并隔离验证,整组通过后自动应用;任何一步失败都会恢复旧版本和原有服务。 它不是 DSH 插件,也不替代 pnpm。这样设计的原因是:当 DSH 本身或某个 profile 已经无法启动时,修复与回滚工具仍然必须可用。远端不可达只会保留当前版本并给出手动移除建议,不会触发自动卸载。 使用 --lang zh-CN 或 DSH_KEEPER_LANG=zh-CN 可固定中文;中文系统会自动选择中文。完整工程边界与验证证据见上方文档链接。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
nowanti/dsh-keeper
安全升级 DSH 插件并自动回滚失败变更
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目