dsh-readme:把团队约束文件写进每个 Agent 的系统提示

前言

在 DSH 里跑多 Agent 会话时,常见做法是把 AgentsReadMe.md、代码规范或 style guide 贴进首轮对话,或指望用户规则里那几段话一直生效。前者会在上下文压缩后被摘要掉;后者和「每个子 Agent 都要遵守同一套硬约束」也不是同一层机制。DSH 会在每次模型步进前按顺序组装 system prompt,dsh-readme 利用这一结构,在指定文本文件存在的前提下,于该 Agent 第一次发起模型请求之前把文件内容注入为 system prompt 的一段,并在整段会话内(含主 Agent 与其派生的子 Agent)作为绑定式工作约束生效。

下面介绍插件定位、安装配置方式,以及使用时需要留意的边界。

这是什么

dsh-readme 是社区维护的 DSH 插件(GitHub:LXinH3RT/dsh-readme,目录分类 admin-security)。它读取用户指定路径上的一个文本文件——可以是团队约定、项目的 AgentsReadMe.md、写作风格指南等——并在每个 Agent 首次模型请求前,将该文件内容注入 system prompt,而不是作为普通聊天消息发送。

维护者:LXinH3RT。许可证:MIT(以仓库为准)。当前 package 版本为 0.2.0,要求 DSH >=0.1.7-rc.2。

为什么用 system prompt 段而不是消息

README 中的设计说明可以概括为两点:

  1. 结构保证「首次运行前已读」:挂载为 prompt section 时,不存在「还没组装 section 就发出请求」的竞态;section 文本可以是函数,因此每步可重新求值,但不需要 session hook 去抢时机。
  2. 抗上下文压缩:以聊天消息喂入的内容可能在长时间会话中被 summarised;system prompt 中的 section 不会因此被同样方式挤掉。

核心功能

以下能力均来自仓库 README 与 package.json 描述,未在资料中出现的细节不写。

  • 全局注入:主 Agent 与其 spawn 的子 Agent,在各自第一次模型请求前都会带上同一份约束段(在 path 已配置且可读的前提下)。
  • 懒加载:不在插件加载时读文件;在第一次 prompt 组装时读取,因此安装数小时后才开的会话仍能看到磁盘上当前内容。
  • 缓存:按 (path, size, mtime) 缓存;文件未变时每步仅 stat,不重复读盘。
  • reloadOnChange:默认 true,文件变更后重新读取;关闭则固定首次读取内容,便于 prompt caching(字节级稳定)。
  • 体积上限 maxBytes:默认 32768,范围 1024–4194304;超长会截断,且明确告知模型文件被截断,避免模型误以为读全了却违反被裁掉的部分。
  • 缺失与异常:onMissing 为 notice 时在 prompt 中留一行提示模型说明读不到;silent 则什么都不注入。空文件、未配置 path、二进制(首 8 KiB 含 NUL)、目录、不可读等各有处理;空路径或未配置时不注入空壳标题以省 token。
  • 顺序 order:默认 520,位于 plan policy(500)之后、team policy(600)之前。
  • 模板字面量:文件内 {{...}} 按字面量保留(section 注册时 interpolate: false)。
  • 单实例:section 名为 dsh-readme:constraints;同一 preset 不要挂两行本插件,否则会重复注册同名 section。
  • 设置页:在插件行的 plugins.row.config 座位注册;也可手写 profile patch 或环境变量覆盖。

模型侧看到的 framing(中文示例,摘自 README)会强调:条目为强制规范,冲突时以此为准;不要复述、摘要或转述文件,直接按文件工作。并标注来源路径、字节数与时间戳,随后原样放入文件正文。

安装与启用

插件是普通 DSH bundle。资料给出三种方式。

从本地目录安装:

dsh plugin add /path/to/dsh-readme

在 profile 的 package.json 中手动声明(本地 file:):

{
  "dependencies": { "dsh-readme": "file:/path/to/dsh-readme" },
  "dsh": { "profile": { "bundles": ["dsh-readme", "..."] } }
}

从 GitHub 依赖(git: 形式,非 dsh plugin add github:... 拼接):

{
  "dependencies": { "dsh-readme": "github:LXinH3RT/dsh-readme" },
  "dsh": { "profile": { "bundles": ["dsh-readme", "..."] } }
}

修改 bundle 列表后需重启 DSH(bundle 行在启动时读取)。安装完成后还要配置 path,见下一节。

配置

图形界面

打开 Settings → Plugins,在列出该 bundle 的行上找到 dsh-readme,点 Configure 编辑路径并保存。写入 active profile 的 patch 文档,无需重启;下一次 prompt 组装即读新路径。

页面使用宿主下发的表单状态;revision 冲突、只读字段等行为由宿主处理,而非插件自行静默丢弃。

Profile patch(手写)

# 仅用 id 定位行;不要在此重复 name:,bundle 层插入的行 name 与 file:/// URL 锚定,裸包名会导致 name mismatch 整段被跳过
- id: dsh-readme
  config:
    path: ~/workspace/AgentsReadMe.md
字段 默认值 含义
enabled true 是否注入;false 时不写任何内容进 prompt
path "" 约束文件;支持 ~、$VAR、${VAR}、%VAR%;相对路径相对会话工作目录;空表示未配置,插件保持静默
maxBytes 32768 注入上限
reloadOnChange true 文件变更是否重读
onMissing notice 读失败时 notice 或 silent
order 520 section 在 prompt 中的位置

环境变量(无面板部署可用):DSH_README_ENABLED、DSH_README_PATH、DSH_README_ORDER、DSH_README_MAX_BYTES、DSH_README_RELOAD_ON_CHANGE、DSH_README_ON_MISSING。优先级:配置 > 环境 > 内置默认;空字符串不会覆盖下层。

典型用法

  1. 在仓库或家目录维护一份约束 Markdown,例如 ~/workspace/AgentsReadMe.md,写清编码规范、禁止操作、评审 checklist 等。
  2. 按上文安装 bundle 并重启(若改了 bundles)。
  3. 在 Configure 或 patch 里设置 path 指向该文件;需要 headless 时用 DSH_README_PATH。
  4. 新开 DSH 会话,主 Agent 与子 Agent 在首次请求前都会带上「工作约束」段;改文件后若 reloadOnChange 为 true,后续步进会按 mtime 重读。

本地验证插件逻辑(不依赖 DSH 宿主):

node test/smoke.mjs

适用场景与注意

适合:需要把同一份硬约束绑定到整棵 Agent 树、且希望约束留在 system prompt 而非首轮 user 消息的团队或个人;分类落在 admin-security 也符合「治理类规则进 prompt」的用法。

务必注意:

  • 插件以当前 DSH 进程权限读 path 所指文件;安装前请自行审阅源码与 MIT 许可证,勿指向无权限或敏感路径。
  • maxBytes 截断后模型会被告知,但仍应控制单文件体积,避免关键条款落在截断线之后。
  • 不要在同一 preset 重复添加本插件多行。
  • DSH 生态是「一切皆插件」;社区目录页(SkillHub)与 DeepSeek / 幻方无官方从属关系,本文仅介绍该开源 bundle 的行为。

结尾

dsh-readme 把「一份指定文本文件」变成每个 Agent 首次运行前就生效的 system prompt 约束段,用 DSH 的 section 组装机制替代「贴消息 + 赌不被压缩」的 fragile 做法。需要安装说明与字段语义时以 GitHub README 为准。

  • 目录页:https://www.skillhub.cn/plugins/LXinH3RT/dsh-readme
  • 仓库:https://github.com/LXinH3RT/dsh-readme
羽毛球分组比赛记分
小程序二维码

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

小夜