dsh-baize-rules
在会话开始时向模型注入用户设定的“必须做 / 不能做”持久要求。
安装
dsh plugin --profile web add dsh-baize-rules
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✗ |
| 2 列装 | — |
| 3 挂载 | — |
| 4 启动 | — |
dsh: initialized profile web at /home/node/.dsh/profiles/web四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-baize-rules
[English](README.md) | 简体中文

English:dsh-baize-rules(Baize) is a dsh plugin that injects user-set, durable "must-do / must-not" requirements — plain-text rules — into the model at conversation start as a sourceduser/message.
dsh 的会话 / 全局「必须做 / 不能做」要求插件。名字取自白泽——传说中「通万物之情、晓万物之名、知万物之理」的神兽,用它来承载「用户给模型立下的行为基线」。
- 规则是纯文本,没有
must/mustNot标记——「必须做 / 不能做」由正文语言表达(例如用中文写注释。=必须,不要删除测试。=禁止)。 - 注入发生在会话起点:把当前生效规则作为一条持久
user/message注入模型请求,套用<system-reminder>框架,来源标记为source.kind='plugin'、plugin='baize-rules'。 - 无规则则不注入;字节预算小到裁光所有规则时返回
undefined,绝不注入空壳 reminder。
功能特性
特性 · 说明
三作用域,均参与注入 · global(所有会话)/ session(当前会话)/ project(按会话工作目录,仅该目录)——三者都会进入模型
持久化 · 全部落盘到 $DSH_HOME(默认 ~/.dsh),跨会话、跨重启
具体优先 · 渲染顺序 project > session > global;字节预算受压时优先保留更具体的规则
坏文件不再打断对话 · 规则文件采用容错读取:损坏或被手改坏的文件只会让该作用域降级为空 + 一条 problems 告警,不会让对话步骤失败
去重 · 按渲染文本 SHA-1 digest 抑制重复注入;injectAtEveryStep 可选每步强制刷新
长对话里始终在场 · 以下三种情况会重新发布一份快照:文本变化时、会话生命周期变化(startup/resume/clear/compact)后、以及距上次发布满 refreshAfterSteps 步(默认 20)时——规则不会只留在长对话的最开头
防逃逸 · 正文里的字面 </system-reminder> 会被转义,防止用户文本关闭插件框架
命令 + API 同源 · /baize-rules 命令与前端面板共用同一套 store/core,改动始终同一真值
标签分类 · 规则可带文字标签(流程、#前端…),面板按标签筛选。默认只用于分类,不占模型上下文预算(injectTags 可开)
模板库 · 常用规则存成模板(内容 + 标签),任意作用域一键套用;可导出/导入 JSON,跨机器、跨会话复用。套用是内容副本——之后改模板不会回写已加入的规则
并发写保护 · 每次写入都带上读取时的文件版本号;若期间被别的窗口改过,拒绝写入并提示重试,而不是静默覆盖
与 AGENTS.md 工作区指令的分工
dsh 自带 @deepseek-ai/dsh-agent-instructions,负责加载工作区指令链(AGENTS.md / CLAUDE.md)。两者互补,按「这条规则该落在哪里」来选:
· AGENTS.md(宿主自带) · dsh-baize-rules(本插件)
存放位置 · 仓库里的文件 · $DSH_HOME/rules/*.json + 面板
生效范围 · 在该仓库里工作的任何人 · 你自己的机器:全部会话 / 单个会话 / 某个目录
版本控制 · 随仓库提交、评审、团队共享,跟着仓库走 · 不进仓库,跟着 DSH_HOME 走
修改方式 · 编辑文件;下次文件触碰或恢复会话时生效 · 在面板或用 /baize-rules 修改;下一步即注入
适合 · 属于项目本身的工程约定 · 个人偏好、跨项目要求、临时会话级要求
两者都以 <system-reminder> 框架的 sourced user/message 注入,并带有同一句优先级说明,因此是互相加强而不是互相冲突。
安装
dsh 插件从 npm 仓库分发,通过 dsh plugin 安装到某个 profile。
# 从 npm 安装到 web profile(版本以发布后的实际版本为准) dsh plugin --profile web add dsh-baize-rules@0.2.4 pm2 restart dsh # dsh 由 pm2 托管时重载生效 dsh --profile web
安装时依赖的 peer 包(@deepseek-ai/ 系列、react 等)由 dsh profile 提供;若缺少,pnpm 会在 profile 目录里按 peerDependencies 解析。
卸载
# 从 profile 移除插件 dsh plugin --profile web remove dsh-baize-rules pm2 restart dsh # dsh 由 pm2 托管时重载生效
若 dsh.profile.bundles 里仍残留该条目,删掉 $DSH_HOME/profiles/web/package.json 中对应那一行后再重启一次。$DSH_HOME/rules/ 下的规则文件不会被删除——想要干净重来请自行删除。
不影响正在运行的 dsh 试装
装到另一个 profile,正在运行的 dsh 完全不受影响:
dsh plugin --profile smoke add dsh-baize-rules@0.2.4 dsh --profile smoke --dump-config # 只读取并组合配置,不会启动 dsh
--dump-config 只组合并打印配置树、不启动服务,所以可安全地与正在运行的 dsh 并存。要在那个 profile 里真正试用,再执行 dsh --profile smoke。
关于 pm2 restart dsh:它会重载你正在运行的那个 profile。安装/卸载只改磁盘上的 profile,下一次启动(或那次重启)才生效。
本地开发联调(link)
尚未发布或想改源码即时生效时,用本目录作为 link 依赖:
// /home/abc/.dsh/profiles/web/package.json
"dependencies": {
"dsh-baize-rules": "link:/home/abc/work/plugin/dsh-baize-rules"
}
随后在 profile 目录执行 pnpm install,并把 dsh-baize-rules 加进 dsh.profile.bundles。
快速开始
/baize-rules # 等价于 /baize-rules list,查看当前生效规则 /baize-rules add 用中文写注释。 # 加到默认作用域(通常是 session) /baize-rules global add 不要删除或改写现有测试。 # 明确加到 global /baize-rules list # 显示 project + session + global(含缩略 id / disabled 标注) /baize-rules list project # 只列某个作用域 /baize-rules edit <id> 只用 pnpm 构建。 # 修改某条规则文本 /baize-rules disable <id> # 停用某条(保留不删) /baize-rules enable <id> # 重新启用 /baize-rules scope global # 之后命令默认写到 global /baize-rules clear session # 清空当前会话规则 /baize-rules global clear # 同一件事:`clear <scope>` 与 `<scope> clear` 等价 /baize-rules export # 导出全部规则为 JSON # —— 标签 —— /baize-rules tag <id> 流程 发布 # 给规则打标签(幂等、去重) /baize-rules untag <id> 发布 # 去掉某个标签 # —— 模板 —— /baize-rules save <id> # 把这条规则存成模板(面板里是「存为模板 / Save as template」) /baize-rules tmpl list # 查看模板库(可按标签筛选过滤) /baize-rules from <id|#标签> # 从模板添加规则(#标签 = 该标签下全部) /baize-rules tmpl export ./templates.json # 导出模板库到 JSON 文件 /baize-rules tmpl import ./templates.json --yes # 导入(默认 dry-run 预览,--yes 才写盘)
作用域写在动词之前:写 /baize-rules global add <正文>。末尾的作用域词已不再被识别为修饰符
——/baize-rules add 部署前先跑测试 global里的global属于规则正文(以前会被当作用域,正文被截断且规则写进 global)。见[作用域写法](#作用域写法)。
命令
所有子命令挂在 /baize-rules 下;无参数时等价于 list。
/baize-rules [<scope>] <command> # scope 为 global|session|project,写在动词之前 /baize-rules [list [scope]|add <text>|remove <id>|edit <id> <text>|enable|disable <id>|tag|untag <id> <tag…>|save <id> [#tag…]|from <id|#tag>|tmpl <list|add|edit|rm|export|import>|scope <scope>|clear <scope>|export]
子命令 · 语法 · 作用
list · /baize-rules list [scope] · 列出合并后的生效规则(Project/Global/Session 节;空时显示 No active rules.)。可传作用域只列该作用域(`/baize
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:11,最后更新 2026-09-22