dsh-fileguard:全权模式下用软约束拦住危险删改

前言

DeepSeek Harness(DSH)在 workspace-write 下,Agent 可以直接改工作区里的文件。系统提权确认框里往往是英文路径和 $ % # 混在一起,扫一眼很难判断点「同意」后会删什么、改什么。全开全权时,误点一次就可能造成大面积删库或动到系统目录。

下面介绍社区插件 dsh-fileguard(维护者 Wldpm,分类 admin-security)。它在模型动手删、改文件之前多拦一道:要求用自然语言说明影响,再由你通过一次性 token 决定是否放行;同时用四档策略和硬限制保护盘根、系统目录等。这是软约束,不是操作系统级安全边界,但能把你从「看不懂就点同意」里拉出来。

这是什么

dsh-fileguard 是给 DeepSeek Harness 用的文件守卫插件。在全权模式下,对大部分危险删除与写入先拦截,逼模型讲清楚「动的是什么、有什么用、删改后会怎样」,再由你用 token(相当于钥匙)放行。模型自己产生的临时文件可走旁路台账,在窗口期内免审。

仓库:https://github.com/Wldpm/dsh-fileguard
社区目录页:https://www.skillhub.cn/plugins/Wldpm/dsh-fileguard
当前 package 版本为 0.2.1,许可证 MIT。

硬限制:四类永远不放行

无论档位、是否开发者模式,下面四类在规则范围内一律不放行(部分仅针对删除或写入):

类别 说明
盘根删除 如 C:\、D:\、U 盘盘根等;仅删除时生效,往盘根复制或列举不拦
系统目录删除 C:\Windows、Program Files、ProgramData、$Recycle.Bin、Recovery 等
通配符删除/写入 如 Remove-Item *.log;只读如 Get-ChildItem *.txt 不受限
改插件自身配置 配置项值只能通过设置页或斜杠命令改;cordis.patch.yml、本插件 package.json 的模型写入会被拦,读不限

原生 shell 命令与 dsh-ops 的 ops_* 工具走同一套规则,例如 ops_remove 与 Remove-Item 判定一致。

四档策略

用斜杠命令或设置页切换档位:

档位 命令 删除 写入/改盘 盘根 系统目录·删 系统目录·改
纯白名单 /guard-readonly 拦死 拦死 拦死 拦死 拦死
高拦截 /guard-high 拦一次 拦一次 拦死 拦死 拦死
默认 /guard-default 拦一次 放行 拦死 拦死 拦一次
低守卫 /guard-low 放行 放行 拦死 拦死 拦一次
  • 拦死:重试也不放行,提示中会说明不要再试。
  • 拦一次:生成一次性 token;模型需从你处拿到 token 后重发才放行,且只覆盖该批目标。
  • 放行:直接执行,模型无额外提示。

拦一次之后的流程

被拦后,模型会收到提示,大致需要:

  1. 说明要动的路径、用途及删改后果。
  2. 你在聊天框执行 /guard-gettoken 取得 16 位 token(输出只进日志,模型上下文看不到)。
  3. 模型带 token 重发,例如在命令末尾加注释:Remove-Item 'D:\work\old.log' # fg:<token>;ops_* 无命令行时原样重发调用即可。

AI 临时文件免审

插件维护旁路台账(state/ai-created.json),记录模型通过 write/edit 或 Set-Content、Out-File 等写入过的路径。在 低守卫 / 默认 档下,删除台账上的路径可直接放行。

限制包括:目录路径不放行、通配符不放行、高拦截/纯白名单档不生效;默认窗口 8 小时,台账最多 5000 条。用 /guard-temp 循环切换 1→4→8→24→72→关,或 /guard-temp 12 设小时数,/guard-temp 0 关闭。

状态目录与配置

敏感状态在插件目录下 state/(tokens.json、ai-created.json)。对该目录的读写一律拦死,避免模型窥视 token 与台账。档位、窗口等写在 profile 配置层,设置页可改;直接改 cordis.patch.yml 或插件 package.json 的写入会被拦。

主要配置项(设置页「文件守卫」或 cordis.patch.yml):

字段 默认 说明
enabled true 总开关
policy "default" low / default / high / readonly
tempHours 8 临时文件免审窗口(小时),0 关闭
devMode false 开发者模式:普通删改与 state/、配置文件可放行并记日志,盘根与系统目录仍硬拦
protectedDirs 见 README 额外保护目录列表

斜杠命令汇总:/guard-low、/guard-default、/guard-high、/guard-readonly、/guard-temp [小时]、/guard-gettoken、/guard-dev [on|off]。

安装与启用

前提:插件目录需能解析 @deepseek-ai/schemastery;用 link: 安装时若不在 profile 的 node_modules 搜索路径下,可能要手动建 junction(见 README「依赖坑」)。

方式一,从本地目录安装:

dsh plugin --profile <profile名> add <本仓库绝对路径>

方式二,手动挂载:

  1. 将仓库放到例如 ~/.dsh/plugins/dsh-fileguard。
  2. 在目标 profile 的 package.json 增加 dependencies 里的 "dsh-fileguard": "link:<仓库绝对路径>",并把 "dsh-fileguard" 写入 dsh.profile.bundles。
  3. 在 profile 目录执行 pnpm install。
  4. 重启 DSH。

不要用 cordis.patch.yml 的 - insert: 硬塞插件,否则设置页与斜杠命令可能报配置被 home patch 覆盖。正确做法是用 bundles 登记;cordis.patch.yml 里最多保留开关,例如:

- id: dsh-fileguard
  disabled: false

若加载报 Cannot find package '@deepseek-ai/schemastery',可在插件目录建 junction 指向 profile 的 node_modules\@deepseek-ai(PowerShell 示例见仓库 README)。

验证:重启后查看日志(默认 %TEMP%\dsh-fileguard.log),应出现 apply; tools=... 与 commands: /guard-low ... 两行;设置页左侧应有「文件守卫」。

已知边界(务必阅读)

插件以当前 DSH 进程权限运行,安装前应自行查看源码与 MIT 许可证。README 明确这是软约束:挡不住执意删文件的模型,例如 [System.IO.File]::Delete()、fs.rmSync、run_code 里拼 JS、write/edit 写非 state/非配置路径等绕过方式。它能做的是抬高门槛,让你有时间踩刹车;物理隔离需依赖 OS ACL 或更严格的 workspace-write 策略。

调试时可 /guard-dev on 临时放宽(盘根与系统目录仍拦),用完 /guard-dev off。

结尾

在全权模式下仍希望「先看懂再点头」,dsh-fileguard 用拦截、自然语言说明和 user-only 的 /guard-gettoken 把决定权还给你,并用档位与硬限制兜住盘根和系统目录。社区目录与 GitHub 仓库相互独立,与 DeepSeek / 幻方无官方从属关系;需要细节时以 README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜