前言¶
在 DSH 里用 OpenViking 技能或记忆记下「写脚本前先看清单」「改文件前先备份」这类操作约定,很常见。真正开始改代码、写文件时,模型并不总会主动去读这些约定——记了但干活时不提就不用,和没记差不多。靠每轮全量塞进提示词或只靠 AGENTS.md,要么费 token,要么仍然不稳定。
下面介绍维护者 HeliosTangDev 发布的 DSH 工作流插件 dsh-ops-conventions(GitHub:HeliosTangDev/dsh-ops-conventions):在动手前把极短「门铃」和操作索引路径注入上下文,并可选用硬拦截,在未读过 INDEX.md 前拒绝写类工具调用。分类为工作流;社区目录页见 SkillHub 条目。
这是什么¶
dsh-ops-conventions 是 DeepSeek Harness 的 Cordis 组合包插件,MIT 许可。定位是:把「操作约定」在动手前确定性写进会话上下文,并可选地强制模型先读约定入口清单;约定内容本身可放在包内示例目录、自建目录,或与 OpenViking 技能目录对齐,插件负责注入时机与(可选)执行门槛。
核心功能¶
依据仓库 README,能力可概括为以下几点。
- 门铃注入:每会话、每约定版本只注入一次(README 称约 150 token;FAQ 亦提到约 70 token 量级的一条插件来源消息)。不按「像不像要动手」过滤,闲聊轮也会注入;改约定目录里的
VERSION后,下一轮任意类型消息会再次注入。 - 内置常驻约定:门铃里自带 6 行左右常驻约定(收尾自检、记忆归并、
_tasks清空、不列多方案、备份回滚、只改工具区等),减少对可能被 OpenViking 抽取重写的profile.md段的依赖。 - 注入日志:每次注入记一行日志(含选中的约定目录、索引是否存在),便于核对是否生效。
- 硬拦截(默认开启):在「操作类」轮次中,若本会话尚未成功
read过INDEX.md,对write、edit等写类工具直接deny,并提示先读索引;读过后本会话放行。闲聊轮不拦;bash/ shell 默认不拦,可在配置里加入拦截列表。 - 零配置可用:包内自带
skills/示例清单;也可指向自有目录或 OpenViking 存储路径。
钩子异常时 fail-open(放行)并写日志;无有效 INDEX.md 时不拦。多会话各自独立。
安装与启用¶
官方推荐用仓库内的安装脚本(跨平台、零依赖),不要凭插件名自行拼接 dsh plugin add。
git clone https://github.com/HeliosTangDev/dsh-ops-conventions.git
cd dsh-ops-conventions
node install.mjs # 默认装到 ~/.dsh/profiles/desktop
node install.mjs /path/to/profile # 指定 profile
node install.mjs /path/to/profile --uninstall # 卸载
脚本会把包复制到 <profile>/node_modules/dsh-ops-conventions,在 package.json 的 dependencies 登记,并把包名加入 dsh.profile.bundles(未加入则不会加载)。
手动安装时,需把整个仓库放到 <profile>/node_modules/dsh-ops-conventions,并在 package.json 中声明依赖与 bundles;必须保留包内的 dsh.bundle.patch 指向 cordis.patch.yml,否则插件管理器会报「没有声明组合包」且不会加载。
装完后:在 DSH 插件页对 dsh-ops-conventions 关掉再打开即可热重载(改 skills/ 或配置时一般不必重启 DSH)。若改的是 index.mjs / rule.mjs,关掉再打开不保证重新 import,重启 DeepSeek Harness 最稳。
约定目录与配置¶
约定目录需包含 INDEX.md;VERSION 可选,用于触发重新注入。
skills/
├── INDEX.md # 入口清单(注入文本里给出的路径)
├── VERSION # 版本号;修改后下一轮会重新注入
└── ops-scripts/
└── SKILL.md # 各类清单,由 INDEX.md 引用
包内示例含六类:ops-scripts、ops-notes、ops-files、ops-check、ops-longtask、ops-dsh,可按需改成自己的清单。
skillsDir 解析顺序(逐个检查目录内是否真有 INDEX.md,取第一个有效):
- 配置项
skillsDir - 环境变量
DSH_OPS_CONVENTIONS_DIR - 包内
skills/ - OpenViking:
~/.openviking/data/viking/default/user/default/memories/ops-conventions ~/.dsh/ops-conventions/skills
在 profile 的 cordis.patch.yml 中可写例如:
- id: dsh-ops-conventions
name: "dsh-ops-conventions"
config:
skillsDir: "D:/my-conventions/skills"
enforce: true
# blockedTools: ["write", "edit", "bash"]
| 配置项 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
skillsDir |
DSH_OPS_CONVENTIONS_DIR |
包内 skills/ |
约定目录,需含 INDEX.md |
logFile |
DSH_OPS_CONVENTIONS_LOG |
~/.dsh/ops-conventions/ops-conventions.log |
注入 / 拦截日志 |
enforce |
— | true |
false 时只注入门铃,不硬拦截 |
blockedTools |
— | write edit multi_edit apply_patch notebook_edit |
可自行加入 bash / pwsh |
典型用法:保持默认或把 skillsDir 指到你的清单;开启 enforce 时,模型在写文件前会被要求先 read 注入消息中的 INDEX.md 并按清单执行,再重试写操作。若出现「硬拦截」拒绝,按提示路径读索引即可;不需要拦截时设 enforce: false。
机制简述¶
- 监听
agent/pre-step(waterfall):在模型调用前,若该会话该版本尚未注入,则追加一条instructions来源的消息。 - 硬拦截监听
tools/pre-execute:操作类轮次且未成功读过INDEX.md时,对配置的写类工具返回deny;tools/result观察到成功的 INDEX 读取后放行。 - 日志中可出现
inject vN、guard deny、guard index-read、guard loaded enforce=...等条目,用于核对行为。
适用场景与注意¶
适合已经把操作约定写在 OpenViking 技能或本地 Markdown 清单里、又希望 DSH 在会话里稳定提醒并在需要时强制先读索引的用户。插件以当前 DSH 进程的权限运行,安装前请阅读 GitHub 仓库 源码与 MIT 许可证;本地脚本安装不会出现在插件市场搜索结果里,需在「已装」列表中确认。若卡片报「没有声明组合包」,检查 package.json 是否保留 dsh.bundle.patch。
结尾¶
dsh-ops-conventions 针对「约定记了但干活时不提就不用」:用版本化的短门铃 + 可选硬拦截,把「先读 INDEX.md」变成可核对、可配置的工作流步骤。目录与文档:SkillHub、GitHub。