DSH Hub

jinsiyu/dsh-safemode-profile

dsh-safemode-profile

BundleWorkflow1 GitHub stars· updated 2026-08-19

dsh-safemode-profile is a community DeepSeek Harness plugin. Read the repository README before installing.

Install

npx @deepseek-ai/dsh plugin --profile web add dsh-safemode-profile

Restart `dsh web` after install. Bundle APIs can change during the developer preview.

README badge

dsh-safemode-profile DSH Hub badge
[![DSH Hub](https://dshhub.dev/badge/dsh-safemode-profile.svg)](https://dshhub.dev/plugins/dsh-safemode-profile)

Paste this into your README. The star count updates with every catalog sync.

From the README

Excerpt from jinsiyu/dsh-safemode-profile, cleaned of badges and images.

dsh-safemode-profile

English

唯一职责:让 dsh --profile safemode 永远是干净的——启动即强制还原, 运行期持续守护,任何时刻都只含白名单核心 bundle。

dsh --profile safemode        # 零第三方插件启动(建议: dsh --profile safemode --port 3081)

它做什么(两个阶段)

1. 启动时:强制还原(不管 profile 有没有、改没改过)

DSH 每次启动加载本插件行时,无条件把 $DSH_HOME/profiles/safemode/ 写回白名单模板:

文件强制内容
package.jsondsh.profile.bundles = 白名单(默认 @deepseek-ai/dsh-base + @deepseek-ai/dsh-web-app),dependencies 清空
cordis.patch.yml空用户 patch 层([] 模板)
pnpm-workspace.yaml与官方 profile 相同的 pnpm 设置

与模板一致时不动(避免自触发死循环),不一致一律重写。

2. 运行期:持续守护(平时检查)

插件行存活期间双通道监控 profile 是否被改动:

  • fs.watch 实时监听package.json / cordis.patch.yml / pnpm-workspace.yaml 任何变更 → 防抖 300ms → 立即还原;
  • 30s 轮询兜底detectDrift() 全量比对(覆盖 watch 不可靠的挂载场景、 文件被外部整体替换的场景)。

发现漂移(bundle 被加/删、patch 层被写入内容、dependencies 被加东西)→ 自动还原,并记录 warn 日志:safemode profile was modified (...); restored to whitelist template

触发机制(无构建脚本,一次装好)

本包没有 postinstall / 任何构建脚本——pnpm 永远不会拦截它, dsh plugin add 一次成功、退出码 0、reconcile 正常执行,不需要 approve-builds / allowBuilds 配置。

全部工作由插件行lib/index.jslib/guard.js)承担: DSH 每次启动加载本插件时强制还原一次,并进入常驻守护。

另附手动工具(可选):node scripts/ensure-safemode.mjs 立即强制还原 一次(不想重启 DSH 或排障时用)。

安装

前置:已安装 DSH(@deepseek-ai/dsh)与 Node.js(≥18)。

方式 A(推荐,npm 一条命令) — 本插件已发布到 npm 并声明 dsh.bundle manifest,直接用官方插件命令安装:

dsh plugin --profile web add dsh-safemode-profile

方式 B(GitHub 直装) — 从源码仓库直接安装(显式指定默认分支 main,npm 与 pnpm 均兼容):

dsh plugin --profile web add github:jinsiyu/dsh-safemode-profile#main

方式 C(本地打包/未发布) — 本地构建 tgz 安装:

# 在插件目录打包
npm pack                          # → dsh-safemode-profile-0.3.5.tgz

# 安装进目标 profile(例如 web)
dsh plugin --profile web add .\dsh-safemode-profile-0.3.5.tgz

装完重启 DSH,插件行生效后 safemode 进入"强制还原 + 常驻守护"状态。 启动时插件会打印一行简短横幅(守护状态、启动命令、白名单、仓库链接)。

自定义白名单

白名单是唯一的定制入口,请通过环境变量设置(不要手动改 safemode profile 文件——任何改动都会被守护逻辑还原):

# 只想留纯 CLI(无 GUI)
$env:DSH_SAFEMODE_BUNDLES = "@deepseek-ai/dsh-base"

dsh 启动时继承该环境变量即生效(本插件读取 process.env,守护与还原 都用同一个白名单)。

加固建议:把 safemode 的三个受管文件设为只读

推荐~/.dsh/profiles/safemode/ 下三个受管文件设为只读,从文件 系统层面阻止 dsh plugin --profile safemode add <包> 向 safemode 安装 任何插件(pnpm 写这些文件失败 → 安装报错、插件进不去;DSH 启动不受 影响,它只读这些文件、只写 cordis.yml):

  • package.json(dependencies + bundles,安装的必经关卡)
  • cordis.patch.yml(用户 patch 层)
  • pnpm-workspace.yaml(pnpm 管理文件)

⚠️ 不要锁整个目录:DSH 每次启动都会重写 cordis.ymlprepareProfile 无条件 writeFileSync),目录或其内文件被锁成只读 会导致 safemode 启动失败(实测 exit 1)。Windows 的 attrib +R <目录> /S 会递归锁住所有文件(含 cordis.yml),不要用

# Windows:只锁三个文件(不要 /S 递归)
attrib +R "$env:USERPROFILE\.dsh\profiles\safemode\package.json" `
         "$env:USERPROFILE\.dsh\profiles\safemode\cordis.patch.yml" `
         "$env:USERPROFILE\.dsh\profiles\safemode\pnpm-workspace.yaml"

# POSIX:三个文件设为 444(目录仍需可读可执行,不能被锁)
chmod 444 ~/.dsh/profiles/safemode/package.json \
          ~/.dsh/profiles/safemode/cordis.patch.yml \
          ~/.dsh/profiles/safemode/pnpm-workspace.yaml

解除锁定:

Related plugins