Перейти к основному содержимому
Y

dsh-policy-linter

yyhy110421/dsh-policy-linter

Read-only linter for AGENTS.md, SKILL.md and plugin prompt files that reports conflicting rules, duplicates, vague qualifiers and dangerous commands with file and line suggestions.

Установка

dsh plugin --profile web add github:yyhy110421/dsh-policy-linter

README

策略体检 · dsh-policy-linter

给 DeepSeek Harness 用的只读规则检查插件: 在 AGENTS.md、SKILL.md 和插件技能进入模型上下文之前,先找出互相打架的规则。

DSH 会同时加载全局 AGENTS.md、工作区 AGENTS.md、技能和插件提示。两份文件各自都合理, 合在一起却可能变成「先问用户」对「直接执行」、「回复中文」对「回复英文」。 模型只能二选一,于是同一件事每次表现不一样,还很难查。

策略体检把这些冲突连同文件、行号、原文、修改建议一起列出来。

能力

  • 工具 policy_lint:扫描指定范围,按 error / warn / info 分级返回问题。
  • 设置界面:DSH 设置 → 策略体检,可改扫描范围、最低严重级别、额外路径和忽略名单。
  • 检查四类问题:
    • 规则冲突:同一主题出现相反要求(先确认 vs 直接执行、提交 vs 不提交、中文 vs 英文、并行 vs 串行、完全权限 vs 只读……)。
    • 跨文件重复:同一句话散落在多个文件里,改一处容易漏另一处。
    • 模糊限定:尽量、适当、必要时、酌情、as needed 之类的规则,模型只能猜。
    • 危险命令:rm -rf /、git push --force、DROP DATABASE、Invoke-Expression 等,防止策略文件把危险操作写成默认动作。
  • 只读:不修改任何策略文件,不联网,不执行被扫描到的命令。

为了少制造假警报:带条件的规则(如果 / 当 / 时 / if / when)被当作局部例外,不参与冲突判断; 不同技能文件不会同时加载,因此也不互相判冲突。同文件内部、全局/工作区之间、 以及全局/工作区对技能仍然会比较。

安装

在 DSH 里打开 设置 → 插件管理器,安装下面任一来源:

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

装完重启 DSH 生效。

注意:file: 安装是实体拷贝,改完源码要卸载再装才会更新;update 只支持 npm 注册表插件。 本插件不发布到 npm。

用法

在对话里直接说「检查一下策略冲突」,模型会调用:

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

参数:

参数类型说明
scopeall / global / workspace默认 all:全局(DSH 家目录与 profile)+ 当前工作区
pathstring只扫这个文件或目录;给了它 scope 失效
minSeverityinfo / warn / error最低严重级别,默认 info
includeSkillsboolean是否扫描技能目录与插件 skills/,默认 true
formattext / json可读文本或结构化结果
maxFindingsnumber最多返回多少条,1–200,默认 100

配置

设置文件:$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:设置页「扫描一次」要用的工作区路径;留空则用 DSH 宿主进程的当前目录。 对话里的 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. 只读:只调用 readFileSync / readdirSync / statSync,不写任何文件。
  2. 不执行:扫到 git push --force 只会报告,不会运行。
  3. 不联网:没有网络请求。
  4. 有上限:最多 600 个文件、单文件 512 KB、6000 条规则、100 条问题,超出会标记截断。
  5. 跳过 .git、node_modules 里的普通文档(插件 skills/ 单独收)、缓存和会话目录。

已知限制

  • 这是规则匹配,不是语义理解:它认「先确认 / 直接执行」这类固定说法,换一种写法可能漏报。
  • 主题表目前覆盖 10 类常见冲突;没覆盖的主题不会报冲突。
  • 带条件的规则不判冲突(例如「如果测试失败就提交」对「如果测试失败就不要提交」),需要人看上下文。
  • 不同技能之间的规则差异不判冲突;它们属于不同工作流,不会同时加载。
  • 冲突是否真的矛盾,需要人看一眼上下文;报告给的是证据和候选,不是最终判决。
  • 不自动修规则。改策略文件是人的决定。

开发

node test/manual.mjs   # 扫 test/fixtures,断言四类问题都能发现
  • lib/scanner.js:零依赖扫描器,可单独 import。
  • lib/index.js:宿主工具、设置接口、系统提示。
  • client.js:设置页(React.createElement,无 JSX)。

License

MIT © 2026 Yyhy110421

Похожие плагины