dsh-rules:DeepSeek Harness 的 glob 激活规则插件

前言

给智能体写协作规则,常见做法是把所有约定堆进一份全局提示词。规则一多就有两个问题:无关内容占用上下文,模型也分不清「哪条规则管哪些文件」。Claude Code 用 rules.md 和 # Path: 段落解决了这件事——规则自己声明管辖的文件范围,触碰匹配文件时才生效。

如果你在 DeepSeek Harness(DSH)上开发,想要同样的机制,下面介绍的 dsh-rules 提供的就是它:规则按 glob 匹配文件,agent 读取或编辑匹配文件时,规则内容自动注入对话。

这是什么

dsh-rules 由 rj-jiangyichen 维护,当前版本 0.1.1,MIT 许可证。定位一句话可以说清:为 DSH 提供 glob 激活的规则提示——每条规则声明 glob 模式,当 agent 触碰(读取/编辑)匹配文件时规则激活,内容以一条 <rules> 快照注入对话,并覆盖先前快照,机制上对标 Claude Code 的 rules.md / # Path: 风格。

DSH 的理念是「一切皆插件」,这个插件也遵循这一点:它适用于所有 DSH 部署形态——desktop / web / tui / headless / 自定义 profile,没有桌面专属依赖。

工作机制

先看规则从文件到对话的完整链路:

  1. agent 读取或编辑一个文件,插件以会话为单位记录触碰过的路径;
  2. 每个 step 由 agent/pre-step 监听器把触碰路径与所有规则的 glob 匹配,收集激活规则;
  3. 匹配结果渲染成一条 <rules> 快照,作为用户消息注入对话。

围绕这条链路有几个值得留意的设计:

  • 可见且持久:注入的是用户消息,UI 可见,会话日志也会留存;每个快照覆盖先前快照,模型始终看到当前生效的规则集。
  • 字节预算:每次注入默认 32 KB(32768 UTF-8 字节),超预算时先丢弃低优先级规则,最后一条规则被截断;内容会转义,不会逃出框架标签。
  • 会话恢复:resume 时从日志还原最后快照及其匹配文件,避免重复注入。
  • 按会话跟踪:每个 agent/session 独立记录触碰过的文件,子代理也包括;没有声明 path 的全局规则始终激活。
  • 规则热更新:规则源每步重新探测并带版本缓存,规则文件修改后下一步即生效。文件读取优先走 harness fs 服务(含包含性检查),未挂载 fs 服务时回退到 Node 文件系统。

安装与启用

通用安装方式,从 npm registry 一步完成安装并激活(profile 按部署形态换成 desktop / web / tui / headless):

dsh plugin --profile desktop add dsh-rules

安装后重启 DSH(桌面形态重启应用,web / headless 形态重启进程)即可生效。更新用 update 子命令,也可以先 remove 再 add:

dsh plugin --profile desktop update dsh-rules

本地开发时,在仓库根目录执行下面这行命令:

dsh plugin --profile desktop add .

注意:pnpm 会在空格处拆分 add 参数,仓库路径含空格时必须通过无空格 junction 安装(如 mklink /J)。

DSH Desktop (Windows) 还提供一键脚本:先克隆仓库,再在仓库根目录运行:

node scripts\install-desktop.mjs

脚本完成后重启 DSH Desktop,插件即随下一次加载生效。

卸载有两种方式,任选其一:

# 方式一:一键脚本卸载
node scripts\install-desktop.mjs --uninstall

# 方式二:dsh 命令卸载
dsh plugin --profile desktop remove dsh-rules

安装与卸载都不会触碰 DSH 安装目录(resources\app.asar.unpacked),只改 profile 配置,完全可回退;操作后记得重启应用。环境要求:Node ^22.19.0 || >=24.0.0

规则怎么写

规则有两种来源,可以混用。

来源 A:规则文件。 项目内放在 .dsh/rules/*.md,用户级规则放在 ~/.dsh/rules/*.md(可选)。frontmatter 的 path 字段声明 glob:

---
path:
  - "src/**/*.ts"
  - "!src/**/*.test.ts"
---
规则正文(markdown,激活时注入对话)

glob 语法支持 ***?{a,b}[abc]! 排除(底层是 picomatch),路径相对项目根、用 / 分隔。path 缺省或为空时,规则成为始终激活的全局规则。frontmatter 还支持可选的 name 字段,用于同名规则去重,缺省取文件名(去掉 .md 后缀)。

来源 B:# Path: 段落。 需要 includeClaudeSections: true。插件会解析 AGENTS.md / CLAUDE.md(含 .local.md 变体与 ~/.dsh/AGENTS.md)中的 # Path: 标题:

# Project notes

# Path: src/**/*.ts, scripts/**
这一段只在触碰 src/**/*.ts 或 scripts/ 下的文件时激活

每个 # Path: 标题开启一条规则,内容持续到下一个标题或文件末尾,globs 可用逗号或空格分隔。注意第一个 # Path: 标题之前的内容不由本插件注入——那部分由 DSH 内置的 agent-instructions 注入完整 AGENTS.md/CLAUDE.md 基线。

优先级与去重规则:项目规则(rank 100)> 用户规则(rank 200)> # Path: 段落(rank 300)。同名规则只保留优先级最高的那条;渲染顺序按 (rank, name) 确定,跨 step 保持一致。

配置

插件默认以代码内置值运行;要按 profile 覆盖,在 <profile>/cordis.patch.yml 中设置入口的 config:

- id: dsh-rules
  name: dsh-rules
  config:
    includeClaudeSections: true
    projectRootMarkers: [".git", ".dsh"]

上面这段开启了 # Path: 段落解析,并把项目根标记扩展为 .git.dsh。常用配置项如下(完整列表以仓库 README 为准):

配置项 默认值 说明
dshHome $DSH_HOME / ~/.dsh 用户规则与 ~/.dsh/AGENTS.md 的根目录
projectRootMarkers [".git"] 向上查找项目根时使用的标记文件/目录
ruleDirNames [".dsh/rules"] 项目内规则目录(相对项目根,可配置多个)
includeUserRules true 是否启用 ~/.dsh/rules/*.md
includeClaudeSections false 是否解析 # Path: 段落
instructionFileCandidates ["AGENTS.md", "CLAUDE.md"] # Path: 段落的候选文件名
localInstructionFileCandidates ["AGENTS.local.md", "CLAUDE.local.md"] 每目录候选文件名
maxBytes 32768 每次注入的渲染预算(UTF-8 字节);<= 0 时禁用插件
maxSourceBytes 1048576 单条规则源文件大小上限,超限的文件被跳过

其中有两个边界容易踩到:maxBytes 设为 0 或负数会直接禁用整个插件;单个规则源文件超过 1 MB 会被整体跳过,不会部分注入。

适用场景与注意

适合谁:

  • 在 DSH 上维护多模块项目,希望「改 src 走 src 的规范、改测试走测试的规范」的开发者;
  • 从 Claude Code 迁移过来的团队——.dsh/rules/*.md 与 AGENTS.md / CLAUDE.md 里的 # Path: 段落都能直接沿用;
  • 在意上下文占用的场景:规则只在触碰匹配文件时注入,且有字节预算兜底。

注意事项:

  1. 插件以当前 dsh 进程的权限运行,安装前请先检查仓库源码与许可证(本项目为 MIT)。
  2. 本地仓库路径含空格时,必须先建立无空格 junction 再安装,否则 pnpm 会拆错 add 参数。

小结

dsh-rules 把 Claude Code 的按路径规则机制带进了 DSH:规则用 frontmatter 或 # Path: 声明 glob,agent 触碰匹配文件才注入,快照可恢复、预算可控,且适配 desktop / web / tui / headless 全部部署形态。如果你在 DSH 上管理多模块项目的协作规则,经过上面几步的安装与规则编写,就能直接用起来。

最后说明一句:上述目录页来自社区维护的插件站点,与 DeepSeek / 幻方无官方从属关系。

羽毛球分组比赛记分
小程序二维码

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

小夜