前言¶
在 DSH 的插件生态中,有时需要强制模型遵守特定的输出格式,例如禁止使用全角圆括号。dsh-write-rule-guard 插件通过在写入前拦截内容,实现了这一需求。
插件简介¶
由 betterer 维护,分类为 admin-security,开源协议为 MIT。该插件通过 cordis 配置注入,默认拦截全角括号 [\uFF08\uFF09],并支持自定义正则规则。
核心功能¶
- 内容拦截:拦截
edit、write、edit_remote、write_remote等工具的写入内容,根据配置的正则规则进行检查。 - 状态机控制:拦截命中后,将当前回合的 pwsh 禁用,防止模型改用 pwsh 绕过。
- 状态恢复:写入工具执行成功后,解除 pwsh 禁用状态;回合结束时恢复允许。
- 工具函数:提供
compilePattern、findMatches等工具函数用于处理正则匹配。
安装与启用¶
使用以下命令安装插件:
dsh plugin --profile web add github:better-er/dsh-write-rule-guard
安装完成后,插件会通过 cordis.patch.yml 注入默认配置,重启 DSH web 后即可生效。
配置方法¶
插件的配置文件位于 ~/.dsh/profiles/web/cordis.patch.yml。通过覆盖 config 字段,可以调整拦截规则、禁用文案等。
配置项说明:
- enabled:是否启用拦截(默认 true)。
- rules:规则列表,包含 pattern(正则)、message(拦截文案)、enabled(开关)。
- extraTools:额外拦截的工具列表,默认包含 dsh-remote-file-system 的 edit_remote 和 write_remote。
- pwshMessage:处于禁 pwsh 态时的拦截文案,支持 {reason} 占位符。
- joiner:多条规则命中时的拼接分隔符。
配置示例:
- id: dsh-write-rule-guard
config:
enabled: true
pwshMessage: '本次写入未遵循用户偏好,已被用户拒绝写入。'
rules:
- enabled: true
pattern: '[\uFF08\uFF09]'
message: '本次写入未遵循用户偏好,已被用户拒绝写入。请修改为不使用括号的描述方式。行:{lines};文件:{file}'
extraTools:
- name: edit_remote
contentKey: new_string
- name: write_remote
contentKey: content
适用场景与注意事项¶
- 适用场景:需要在编辑文件或写入内容时强制执行格式约束(如禁止特定字符)。
- 环境要求:Node.js 版本需 >= 26.3.1,需依赖
@deepseek-ai/dsh。 - 已知局限:拦截成功后仅禁用当前回合的 pwsh。如果写入工具(如 edit/write)执行成功,状态机会将 pwsh 解除禁用。这意味着模型可能通过一次成功的写入来绕过守卫,从而在后续操作中再次使用 pwsh 写入违规内容。这是一个取舍后的行为,无法防止通过成功写入解除禁用后的绕过尝试。
导出工具¶
插件导出了以下工具函数:
- compilePattern(pattern):编译用户正则,非法时返回 null。
- findMatches(content, pattern):扫描文本,返回匹配位置清单。
- collectLines(hits):提取命中所在的不重复行号。
- fillMessage(template, ctx):替换报错文案占位符。
- buildReason(message, file, hits, pattern):构造单条规则的单行拒绝原因。