dsh-plugins
DSH plugins by ohtokaah-sys: 行为宪法 / 协作模式 / 机械门禁 (tagged dsh-plugin)
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-plugins
ohtokaah-sys 的 DSH(DeepSeek Harness)插件,tagged dsh-plugin。四个零依赖插件(不 import 任何 @deepseek-ai/*,一切从注入的 ctx 拿)。前三个从 Hermes Agent 深度定制迁移过来,第四个 dsh-memory 是专为 DSH 原生 sessionQuery 设计的跨会话回忆。
一、dsh-charter —— 行为宪法
把一套「停止条件 + 发送前闸门 + 发送前扫描」规则注入系统提示,让 agent 动手前被规则机械约束,而不是靠「自觉」。
为什么需要:LLM agent 的自我约束不可靠。「写在提示词里求它听话」经常失效——尤其规则长、藏在 prompt 中部时,模型注意力低、会忘。这个插件把最高价值的几条闸门规则放进一个每轮必读的专门 prompt 段。
它注入的规则(要点):
- 🛑 停止条件:用户说「停/算了/取消」→ 立即停;工具超时/报错 → 报告等待,不自行换策略;用户声明外部操作 → 确认等待。
- 🚫 Rule 0 授权:没出现授权词(做吧/开始/执行/好/帮我…)→ 不执行。
- 🚫 Rule 5 验证声称:声称「已部署/已完成」→ 必须附
git log/grep/stat输出。 - 🚫 Rule 12 数字声称:写数字前先跑验证命令,否则标「🟡 估算」。
- 🚫 Rule 7B:正文禁含
[SILENT],用「静默模式」。 - 🚫 Rule 1 置信度:输出 >200 字 → 末段必须 🔴🟡🟢⚪ + 理由。
- 🚫 Rule 8B 历史来源:引用历史数据 → 必须标
📚 {来源} "{查询词}" → {命中数}。
场景例子:
| 场景 | 没有它(裸 agent) | 有它 |
|---|---|---|
| 「把那个文件删了」(没授权词) | 直接删 | 反问确认,等授权词 |
| agent 答「已部署完成」 | 空口白话 | 必须附验证输出 |
| agent 答「一共 37 个文件」 | 凭印象报数 | 必须附 ls | wc -l,否则标 🟡估算 |
| 用户说「停」 | 可能继续辩解 | 立即停止,不辩解 |
二、dsh-modes —— 协作模式
注入五种按触发词自动切换的协作模式,让 agent 不是「一个脑回路应对所有对话」。
| 模式 | 触发词 | 做什么 |
|---|---|---|
| Mode 1 第十人 | 第十人/红队/找漏洞 | 红队审计,找方案漏洞(1A 快扫 / 1B 逐节点审计 / 1C 外部取证) |
| Mode 2 镜子 | 镜子/反思 | 反射你的思维模式,交叉对比前后陈述、指出言行矛盾 |
| Mode 3 参谋 | 参谋/帮我决策 | 先确认「不能动的约束」→ 决策树 → 路径分析(资源/风险/退出条件) |
| Mode 4 翻译 | 翻译 | 跨受众沟通,内核精确、包装更换 |
| Mode 5 翻牌 | 翻牌 | 用三个已知盲区(隐蔽假设/过早下结论/效率冲动)扫描判断,只标「可能触发了」、不评价对错 |
场景例子:
| 用户说 | agent 反应 |
|---|---|
| 「第十人审计一下这个方案」 | 逐节点找漏洞,给反面证据 |
| 「镜子一下」 | 交叉对比你前后说过的话,指出模式 |
| 「参谋:要不要接这个项目」 | 先问约束,再走决策树、列退出条件 |
| 「翻牌」 | 只标「这个盲区可能触发了」 |
三、dsh-gates —— 机械门禁
两个代码级守卫,在 tools/pre-execute 阶段拦截不安全的文件写入。不是 prompt 规则,是代码拦截,物理上无法绕过。
- 守卫 1 §2C 文件名安全:拦截文件名含 emoji / Windows 保留字符(
/ : * ? < > |)/ 控制字符 / 尾随空格点号 / 前导连字符。 - 守卫 2 §14 凭据泄露:拦截待写入内容含明文密钥(
sk-开头长串、api_key=...长值)。
场景例子:
| 场景 | 结果 |
|---|---|
write("报告😀.md", ...) | 🚫 拦截「文件名含 emoji」 |
write("config.md", "DEEPSEEK_API_KEY: sk-…") | 🚫 拦截「凭据泄露,请改用环境变量」 |
write("a:b.md", ...) | 🚫 拦截「文件名含 Windows 保留字符」 |
write("正常文档.md", "普通内容") | ✅ 放行 |
为什么是两个独立守卫:它们是两条独立的 tools/pre-execute 监听,各自 deny、谁都不遮蔽谁——对抗链式 hook 的「first-valid-wins」问题(链式 hook 里第一个有效值会遮蔽后面的)。
四、dsh-memory —— 跨会话回忆
注册两个只读工具,让 agent 能「想起」历史会话。复用 DSH 原生 sessionQuery 精确读,不建索引、不建存储。
| 工具 | 作用 |
|---|---|
list_sessions | 列出历史会话(id + 标题 + 时间 + 工作目录) |
read_session | 读某个会话的完整消息历史 |
场景例子:
| 场景 | agent 怎么做 |
|---|---|
| 「我们之前讨论过那个方案,结论是什么?」 | list_sessions 找到相关会话 → read_session 读内容 → 回答 |
| 「接着昨天的活干」 | list_sessions 看昨天哪个会话 → 读它 → 接上上下文 |
为什么这么设计:DSH 刻意把全文搜索关了(openAt: never),但留下了 listSessions / readSurface 这些精确读。这个插件顺着窄门走,不逆设计、不重造轮子——这正是社区另一个「把 Hermes MEMORY.md 搬过来」的移植被归档的原因。
设计:可逆 + 可组合(按 Cordis 论文两个维度)
- 时间可组合(可逆):prompt 段用
ctx.effect管理、事件监听用ctx.on(自带 disposer)——卸载即撤。实测cordis_stop后门禁消失、重新 run 恢复。 - 空间可组合(可叠加、互不遮蔽):
dsh-gates两个守卫独立 deny,加多少都不互相踩。
分层:charter + modes 是「提示层」(靠模型遵守),gates 是「代码层」(物理拦截)。能机械化的规则放代码层,不能机械化的放提示层——来自真实教训「文本存在 ≠ 被遵守」。
安装
dsh plugin add @ohtokaah-sys/dsh-charter
dsh plugin add @ohtokaah-sys/dsh-modes
dsh plugin add @ohtokaah-sys/dsh-gates
dsh plugin add @ohtokaah-sys/dsh-memory
或经社区 DSH Plugin Marketplace 一键安装。
在 preset 里引用
- id: xiaoqing-charter
name: '@ohtokaah-sys/dsh-charter'
- id: xiaoqing-modes
name: '@ohtokaah-sys/dsh-modes'
- id: xiaoqing-gates
name: '@ohtokaah-sys/dsh-gates'
- id: xiaoqing-memory
name: '@ohtokaah-sys/dsh-memory'
完整文档
每个插件的完整规则全文见各自目录:packages/dsh-charter/README.md、packages/dsh-modes/README.md、packages/dsh-gates/README.md、packages/dsh-memory/README.md。写新插件见 AGENTS.md。
License
MIT