← Back to home@ohtokaah-sys

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