前言¶
在 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):構造單條規則的單行拒絕原因。