dsh-superpowers:为每个 Superpowers 技能单独指定子代理模型

前言

团队里用 DSH 跑 Superpowers(spec-driven development)这类重度技能化的方法论时,通常会碰到一个朴素问题:preset 里每个技能本质都是一次子代理派发,但在默认 harness 下,这些子代理都跑在父会话选中的那个模型上。想在调试这类重任务上用大模型、在写测试这类轻任务上用便宜模型,没有一等公民的配置入口,只能自己在技能里写死或手动改。

goodjin/dsh-superpowers 就是针对这个痛点做的插件。它把 Superpowers 打包成一个 DSH agent preset,同时在 Settings 里提供一套「每个技能一个下拉框」的模型路由表,派发哪个技能,子代理就用哪套 provider/model。下面介绍它的能力、安装方式和配置入口。

这是什么

一句话定位:一个全局插件加上一个可选 preset,把 Superpowers 的 15 个技能和对应 persona 带进 DSH,并按技能粒度指定子代理模型。维护者是 goodjin,属于工作流分类。它解决的不是「Superpowers 怎么写」,而是「Superpowers 的各个技能该用哪个模型、由谁来决定」。

核心功能

插件分成两半:全局的 plugin 负责 Settings 分区、模型表、工具模块和自检;preset 负责可选的运行模式,包含技能、persona 与工具行。安装一次即可在 preset 选择器里看到 Superpowers。功能包括:

  • 随包提供 Superpowers 的 15 个技能,以及让 agent 真正按六阶段方法执行的 persona。
  • Settings → Superpowers 分区:每个技能一行,另有「其他子代理」行,覆盖未绑定技能的派发。
  • 统一的派发工具 delegate_skill:读取模型表,把子代理启动在对应模型上,并把子会话命名为技能名。
  • 子代理的 composer 上会只读地显示它实际运行的模型。
  • 宿主行(host row)按构造方式容错:即使插件完全失败,DSH 也能正常启动并保持可用。

模型解析顺序是:先取技能自身的 pin,再取「其他子代理」行的默认 provider/model,都没有就继承父会话的路由。技能行上的「跟随默认」会清掉该技能的 pin,但与「复用主会话模型」不是一回事——后者即使配置了默认 pair 也会被尊重,它存成一个 sentinel 并省略 agentOptions,使子代理沿用父会话模型。

安装与启用

该包不在 npm 上,直接从仓库安装:

dsh plugin --profile web add goodjin/dsh-superpowers

安装完成后,preset 选择器里会出现 Superpowers。需要把它设为默认 preset 时,配置如下:

agent-presets:
  default: superpowers

否则只在 UI 的 preset 选择器里手动选择即可。

在 DSH 0.2.x 上,preset 作为声明行随包一起发布,因此装完即用;旧版本从 ~/.dsh/.agent-presets/superpowers/ 读取,0.2.x 没有这个目录。升级时重跑同一条安装命令即可,plugin 半与 preset 半会一起更新,不存在需要手动同步的复制目录。

配置模型路由

打开 Settings → Superpowers,每个技能一行,选项在下一次派发时读取,无需重启,也不需要改 preset。路由存在 profile patch 的 superpowers-delegation-settings loader 行里(DSH 0.2.x 的插件配置放在这里,而不是 settings.yaml),因此也可以直接改 cordis.patch.yml:

- id: superpowers-delegation-settings
  name: "@goodjin2/dsh-superpowers"
  config:
    defaultProvider: minimax-cn
    defaultModel: MiniMax-M3.1-Flash-Preview
    skillModels:
      verification-before-completion:
        provider: xiaomi-token-plan-cn
        model: mimo-v2.6-pro

升级前写在 settings.yaml 里的值会在首次启动时自动迁移,迁移只填充尚未设置的字段,不会覆盖之后的手改。

验证安装

装完或升级后建议跑一条自检:

node ~/.dsh/profiles/web/node_modules/@goodjin2/dsh-superpowers/scripts/check.mjs 3080 <token>

token 来自打开 DSH 时所用的 URL,每次重启都会变化。检查会逐项报告插件对宿主侧各项依赖的探测结果。关键行是 route.exists:它直接向浏览器通道发 POST。当宿主半静默注册失败时(即 v0.2.1 修复的那个 bug),路由行看起来仍是 active,日志里也没有输出,只有这条探测能看到 404,因此不要跳过它。若检查报告失败,条目名会指出是哪个依赖发生了迁移。

升级与兼容性

DSH 没有 per-plugin 版本锁定,插件在启动时从 profile 解析。若某次 DSH 升级移动了内部 API,不会产生报错——服务照常启动,功能却悄悄失效。这正是该插件设计上要能承受、而不是要杜绝的失效模式。

支持的 DSH 版本为 >=0.1.5-rc.2 <0.3.0(在 peerDependencies 的 @deepseek-ai/dsh-tools 中声明)。超出该范围时,Desktop 插件面板会标记不兼容并阻止激活。其余三项保护:

  • 宿主行被包裹,无法阻止 DSH 启动。故障注入验证过:即使该行抛异常,DSH 仍能启动,54 个 client entries 照常挂载,插件降级为「不提供 per-skill pins」。
  • Settings 的 Superpowers 分区顶部显示自检行,依赖齐全时为绿色,否则为红色并逐项说明原因。
  • 客户端失败由宿主插件加载器按条目隔离,某条 client 出错只会显示 banner,其余 UI 仍可用。

目录结构

lib/index.js             # 宿主行:settings 命名空间、浏览器通道、自检端点
lib/client.js            # 浏览器行:Settings 分区、composer 模型标签
lib/skill-delegation.js  # delegate_skill 工具
lib/settings-schema.js   # 存储的 settings 形状与路由解析
cordis.patch.yml         # 插件新增的两条 composition rows
preset/                  # agent preset 与 15 个 Superpowers 技能
scripts/check.mjs        # 升级后兼容性检查
scripts/test.mjs         # 加载安全性与降级测试

适用场景与注意

适合已经采用或打算采用 Superpowers 六阶段方法、且希望按技能区分模型成本与能力的 DSH 工作流使用者。需要注意,插件以当前 dsh 进程的权限运行,安装前建议先阅读源码与许可证。内置技能来自 obra/superpowers,两者均为 MIT,仓库内的 THIRD_PARTY_NOTICES.md 有说明。受支持的 DSH 版本范围有限,升级 DSH 后请先运行 check.mjs,而不是等到功能静默失效再排查。

小结

这个插件的价值不在多,而在把一个细但真实的需求做好:让 Superpowers 的 15 个技能各自跑在合适的模型上,同时保证插件自身失败不会拖垮 DSH。目录页见 https://www.skillhub.cn/plugins/goodjin/dsh-superpowers ,源码见 https://github.com/goodjin/dsh-superpowers 。

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

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

小夜