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 / 幻方無官方從屬關係。

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

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

小夜