dsh-preset-rules:用规则文件生成 agent preset 补丁层

前言

DeepSeek Harness(DSH)的 agent preset 会随产品更新增减条目。若把覆盖写死在 YAML 里,一次升级就可能和上游快照脱节:新 preset 不会出现,旧覆盖仍留着,排查成本高。DSH 的分层补丁模型里,profile 之上还可以叠 cordis.patch.yml 这类补丁层;问题在于补丁若全靠手写维护,容易过时。

dsh-preset-rules 把工作流收窄为:维护一份短小的规则文件,在每次启动时按当前安装自带的 preset 声明重新生成补丁,输出仍是普通 YAML,可读、可 diff、可删。下面介绍它的定位、规则语法与使用步骤。

这是什么

dsh-preset-rules 是 DSH 的一个 bundle 插件(单 host 插件)。启动时读取当前安装附带的 preset 声明,应用你在 $DSH_HOME/preset-rules.rules 里写的规则,把结果写到 $DSH_HOME/cordis.patch.yml。该文件是常规 dsh 补丁层:DSH 在 profile 层之后应用它,文件监视器会在内容变化时重组树。

维护者为 wannaknowhys,仓库 wannaknowhys/dsh-preset-rules,社区目录页 SkillHub 条目。分类属于工作流:用声明式规则驱动 preset 层面的批量调整,而不是在 UI 里逐项点选。许可证 MIT(见仓库 README)。

为何要生成而非手写补丁

手写 override 会「冻结」在某个时间点的结构。DSH 发版新增 preset 行时,冻结副本不会自动跟上,用户往往要等到行为异常才发现。每次启动按规则重新生成,可以在不增加日常手工步骤的前提下让快照与当前安装对齐;生成物仍是明文 YAML,便于审查。相同输入产生相同字节,无事可做时不会无意义地重写文件。

环境与依赖

  • DSH 0.2.x
  • Node.js >= 20(bundle 内运行时版本可能更高)

插件在 DSH 进程权限下运行;安装前宜自行查看仓库源码与 LICENSE。

安装

官方 README 给出的安装方式如下。

通过 DSH 插件命令(desktop profile):

dsh plugin --profile desktop add dsh-preset-rules

从 GitHub 检出路径安装(非 npm 场景):

dsh plugin --profile desktop add github:wannaknowhys/dsh-preset-rules

也可在 Harness UI 的插件管理器中安装(Creator 模式会写入相同的 bundle patch)。

规则文件与首次初始化

插件不会自动创建规则:没有规则文件时,每次启动只打一行日志,不改动任何文件,避免首次安装「静默无感」。

初始化示例规则文件(带注释):

node bin/preset-rules.js --init

默认规则路径为 $DSH_HOME/preset-rules.rules。最小示例如下:

# $DSH_HOME/preset-rules.rules
presets = all; entry = id: time-context; action = hide()

建议先用 check 模式确认影响,再切回默认 apply。可在插件配置里设 mode: check,或直接用 CLI:

node bin/preset-rules.js --check

check 只打印将要发生的变更,不写盘;确认无误后使用默认的 apply。

规则语法

一行一条规则,三个子句用分号分隔,顺序不限:

presets = all; entry = id: time-context; action = hide()
子句 取值说明
presets all、单个 id、{a, b}、not(x),以及子句之间的 + / -
entry *、id: value、name: value、{a, b}、not(...)、+ / -
action 当前可用 hide();disable()、enable()、set(path, value) 为 0.2 预留

二元 +、- 两侧需有空格;标识符可含 -、.、@、/。# 起行内注释。

README 中的示例:

presets = not(minimal); entry = id: time-context; action = hide()
presets = {standard, cordis}; entry = not(id: persona); action = hide()

诊断信息含 file:line:column。未知 preset 或规则未匹配任何项为警告;语法错误、未知 action 或误用预留 action 会中止运行,且不覆盖先前的输出文件。

运行模式

mode 行为
apply(默认) 校验通过且字节有变化时才写入
check 计算并打印结果,不写文件
off 不做任何事

CLI 参数

node bin/preset-rules.js [--check|--apply] [--rules <file>] [--target <file>] [--source <dir>] [--json]
node bin/preset-rules.js --init [--rules <file>]

默认:--rules 指向 $DSH_HOME/preset-rules.rules,--target 指向 $DSH_HOME/cordis.patch.yml。--source 指定 @deepseek-ai/dsh-web-app 包目录;桌面安装与 npm 安装均可自动探测。读取打包在 app.asar 内的文件需要 Electron-as-node,桌面应用已具备该环境。

生成文件与安全边界

生成文件头部带标记,例如(结构摘自 README,版本与 hash 随环境变化):

# generated by dsh-preset-rules 0.1.0 — do not edit
# source: @deepseek-ai/dsh-web-app 0.2.2-rc.1
# source-hash: sha256:…
# rules-hash: sha256:…
- id: preset-cordis
  name: '@deepseek-ai/dsh-agent-preset'
  config:
    id: cordis
    order: 4
    plugins: [ … ]

该文件由本插件「认领」:若目标文件不是以上述生成标记开头,插件拒绝覆盖——手写补丁应放在 profile 层而非与此生成物混用。

生成的补丁层在本机全局共享:同一机器上的各 profile 共用 $DSH_HOME/cordis.patch.yml。

卸载

移除插件后,删除 $DSH_HOME/cordis.patch.yml;或清空规则文件并启动一次。按需清理 $DSH_HOME/preset-rules.rules。

适用场景与注意

适合希望在 DSH 升级后仍用少量规则(例如按 preset 隐藏 time-context 等 entry)稳定复现 preset 树形态的用户。不适合把复杂、一次性的手工 YAML 补丁塞进本插件的目标文件——那些应走 profile 层。

社区目录 SkillHub 与 GitHub 仓库独立于 DeepSeek / 幻方,并非官方应用商店;安装与规则生效仍以本机 DSH 进程为准,使用前请核对仓库版本(当前 npm 包版本 0.1.0)与许可证。

结尾

dsh-preset-rules 把 agent preset 的个性化收成可编辑规则,在每次启动时生成 cordis.patch.yml,减轻 dsh 更新后补丁过时的风险。进一步细节见 GitHub README(含 简体中文)与 SkillHub 目录页。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye