- Главная
- Плагины
- Разработка и инструменты плагинов
- dsh-policy-linter
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-linterREADME
策略体检 · 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"
}
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
scope | all / global / workspace | 默认 all:全局(DSH 家目录与 profile)+ 当前工作区 |
path | string | 只扫这个文件或目录;给了它 scope 失效 |
minSeverity | info / warn / error | 最低严重级别,默认 info |
includeSkills | boolean | 是否扫描技能目录与插件 skills/,默认 true |
format | text / json | 可读文本或结构化结果 |
maxFindings | number | 最多返回多少条,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/。
安全边界
- 只读:只调用
readFileSync/readdirSync/statSync,不写任何文件。 - 不执行:扫到
git push --force只会报告,不会运行。 - 不联网:没有网络请求。
- 有上限:最多 600 个文件、单文件 512 KB、6000 条规则、100 条问题,超出会标记截断。
- 跳过
.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
Похожие плагины
deepseek-harness
deepseek-ai/deepseek-harness
dsh-market
dsh-market/dsh-market
dsh-web (dsh-plugin-manager)
zhu1090093659/dsh-web
dsh-web
zhu1090093659/dsh-web