dsh-policy-linter:在规则进上下文之前做策略体检

前言

DeepSeek Harness(DSH)会把全局 AGENTS.md、工作区 AGENTS.md、技能(SKILL.md)和插件自带提示一起送进模型上下文。单看每一份文件往往都合理,叠在一起却可能出现互相矛盾的要求:一边写「先问用户再动手」,一边写「直接执行」;一边要求「回复中文」,另一边要求「回复英文」。模型只能择一执行,同一件事每次表现可能不一致,事后也很难对照是哪条规则在打架。

dsh-policy-linter(策略体检)是社区插件,由 Yyhy110421 维护,归类为工作流。它在规则进入模型之前做只读扫描,把冲突连同文件、行号、原文和修改建议列出来,不改动任何策略文件。

这是什么

策略体检是给 DSH 用的只读规则检查插件:扫描 AGENTS.md、SKILL.md 以及插件技能目录中的 Markdown 规则,按严重程度分级报告问题。插件不联网、不执行扫描到的命令,也不自动修改策略内容;最终是否改规则由人决定。

核心功能

工具 policy_lint

对话中可让模型调用工具 policy_lint,对指定范围扫描,按 error / warn / info 返回结果。默认示例如下:

{
  "scope": "all",
  "minSeverity": "warn",
  "format": "text"
}

参数含义(摘自 README):

参数 类型 说明
scope all / global / workspace 默认 all:全局 + 当前工作区
path string 只扫该文件或目录;指定后 scope 无效
minSeverity info / warn / error 最低严重级别,默认 info
includeSkills boolean 是否扫技能目录与插件 skills/,默认 true
format text / json 文本或结构化输出
maxFindings number 最多返回条数,1–200,默认 100

四类检查

  1. 规则冲突:同一主题出现相反要求(先确认 vs 直接执行、提交 vs 不提交、中文 vs 英文、并行 vs 串行、完全权限 vs 只读等)。
  2. 跨文件重复:同一句规则散落在多个文件,改一处易漏另一处。
  3. 模糊限定:含「尽量」「适当」「必要时」「as needed」等表述,模型只能猜测。
  4. 危险命令:如 rm -rf /、git push --force、DROP DATABASE、Invoke-Expression 等,避免策略把危险操作写成默认动作。

为减少误报:带条件的前缀(如果 / 当 / if / when)视为局部例外,不参与冲突判断;不同技能文件不会同时加载,因此技能之间不做冲突判定。同文件内部、全局与工作区之间、以及全局/工作区对技能仍会比较。

设置界面

在 DSH 设置 → 策略体检 中可调整扫描范围、最低严重级别、额外路径和忽略名单,并支持从设置页触发扫描。

安装与启用

DSH 生态理念是「一切皆插件」;社区目录站点(如 SkillHub)与 DeepSeek / 幻方无官方从属关系,安装前请自行查看源码与许可证(本插件为 MIT © 2026 Yyhy110421)。插件以当前 DSH 进程权限运行,只读本地文件。

在 DSH 中打开 设置 → 插件管理器,安装下列任一来源(命令须与仓库 README 一致):

github:Yyhy110421/dsh-policy-linter
file:<本仓库的绝对路径>

装完后重启 DSH 生效。

注意:file: 安装是实体拷贝,改源码后需卸载再装才会更新;update 仅支持 npm 注册表插件,本插件不发布到 npm。package.json 中版本为 0.1.0,运行环境要求 Node ^22.19.0 || >=24.0.0。

配置与扫描范围

配置文件路径:$DSH_HOME/data/policy-linter.json(无 DSH_HOME 时使用 ~/.dsh)。

{
  "scope": "all",
  "minSeverity": "info",
  "includeSkills": true,
  "extraPaths": [],
  "ignoreIds": [],
  "workspacePath": ""
}
  • extraPaths:额外要扫的文件或目录(目录会递归查找 .md)。
  • ignoreIds:从报告中复制如 conflict:confirm:xxxxxxxxxx 的 ID,仅影响报告展示。
  • workspacePath:设置页「扫描一次」用的工作区;留空则用宿主进程当前目录。对话里的 policy_lint 仍使用会话自己的工作区。

扫描覆盖:

  • 全局:DSH_HOME 下的 AGENTS.md / CLAUDE.md / GEMINI.md、profile 的 AGENTS.md、DSH_HOME/skills、profile 的 skills/,以及 profile 内插件包的 skills/、bundled-skills/。
  • 工作区:根目录的 AGENTS.md / CLAUDE.md / GEMINI.md、.dsh/AGENTS.md、.dsh/skills、skills/。

典型用法

  1. 安装并重启 DSH 后,在对话中说「检查一下策略冲突」,模型会按需要调用 policy_lint。
  2. 需要只看工作区或全局时,将 scope 设为 workspace 或 global。
  3. 临时只扫某个目录或文件时,传入 path,并视情况调整 minSeverity 与 format: "json" 便于脚本处理。
  4. 对已知误报,把报告中的 ID 写入配置里的 ignoreIds。

安全边界与已知限制

安全边界(README 原文要点):

  1. 只读:仅使用 readFileSync / readdirSync / statSync。
  2. 不执行:报告中的危险命令不会运行。
  3. 不联网。
  4. 有上限:最多约 600 个文件、单文件 512 KB、6000 条规则、100 条问题,超出会标记截断。
  5. 跳过 .git、node_modules 内普通文档(插件 skills/ 单独收集)、缓存与会话目录。

使用前应知晓:

  • 检查基于规则匹配,不是语义理解;换一种说法可能漏报。
  • 主题表目前覆盖约 10 类常见冲突,未覆盖主题不报冲突。
  • 冲突是否真矛盾需人结合上下文判断;报告提供证据与候选,不是终审。
  • 不同技能之间的差异故意不判冲突。

适合在持续维护 AGENTS.md、多套技能与工作区规则的团队里,在改规则后或发版前做一次体检,减少「规则看起来都对、合在一起却打架」的情况。

结尾

dsh-policy-linter 在策略进模型之前做只读冲突与风险扫描,配合设置页与 policy_lint 参数即可接入日常流程。更多信息见社区目录页与仓库 README。

  • 目录页:https://www.skillhub.cn/plugins/Yyhy110421/dsh-policy-linter
  • GitHub:https://github.com/Yyhy110421/dsh-policy-linter
羽毛球分组比赛记分
小程序二维码

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

Xiaoye