前言¶
在 DSH 里,主 agent 往往既要和用户沟通、拆任务、拍板,又要自己跑命令、改文件。多出来的子任务若全堆在同一条对话里,并行度低,方案也缺少第二个视角核对。单靠提示词要求 agent「记得派活、记得验收」,参数漏了、判据改了,事后很难从机制上拦住。
dsh-tandem 是社区维护的 DSH 插件(维护者 wuuuuu123-32),把「并行交给 Codex」「会审」「机械验收与返工」做成五个工具,由插件校验参数、冻结判据、记账会审与未审改动,而不是依赖 agent 自觉。下文按定位、能力、安装配置、典型用法与边界说明。
这是什么¶
一句话:双 agent 协作——主 agent 负责沟通与决策,本地 Codex(GPT)负责并行执行、方案会审,以及按机械判据返工;缺验收标准的派活会被当场拒绝。
- 名称:dsh-tandem(npm 包名同)
- 当前版本:0.5.0(MIT)
- 运行面:Host(
surfaces: ["host"]) - 兼容:DSH
>=0.2.0-rc.2,Node>=20 - 目录页:SkillHub 插件页
- 源码:GitHub wuuuuu123-32/dsh-tandem
DSH 生态主张「一切皆插件」;SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。
五个工具¶
插件向主 agent 暴露以下工具(README 中的约束为硬门禁):
| 工具 | 作用 | 关键约束 |
|---|---|---|
tandem_status |
查看是否可用:Codex 路径、模型、并发上限、允许派活的目录根、凭据是否就绪 | 第一次派活前,或派活报错后先看 |
tandem_delegate |
把 N 个互不依赖的子任务并行交给 Codex;成功项返回 taskId |
每项必须有 timeoutMs 和 acceptance;dir 须在白名单根内且互不重复 |
tandem_consult |
Codex 作为有边界的第二判断者回答问题;成功时签发 reviewId |
只判断、不写文件;须回「结论 / 证据 / 反例 / 验证方式」四段 |
tandem_check |
在任务目录跑机械验收:命令退出码 + 输出包含关系 | 同一 taskId 首次检查冻结判据;会审后内容变了可标 stale |
tandem_reject |
把验收缺口回灌 Codex 重做(同一 taskId) |
最多 2 轮;须最近一次检查确实失败 |
参数不合法时派活会被拒绝,不依赖 agent 是否「记得」规则。
核心机制¶
并行派活(delegate)¶
同时满足以下条件才适合 tandem_delegate:
- 有至少 2 个产物,各自能独立验收;
- 写入路径不重叠、彼此不依赖;
- 子任务不需要本对话的上下文。
验收闭环(check / reject)¶
delegate 成功后围绕 taskId 走闭环(票据写入 <stateDir>/tickets.json):
delegate 成功 → taskId
tandem_check { taskId, checks }
├─ 全部通过 → 结束
└─ 有失败 → tandem_reject { taskId, gaps? }(最多 2 轮)
└─ 重做成功后再 check
每条检查形如 { cmd, expect: { exit?, contains?, notContains? }, timeoutMs? },断言全部 AND。同一 taskId 只有第一次 tandem_check 能定义 checks,之后改判据会被拒绝。没有 taskId 的临时检查可传 dir(不冻结、不记账)。
插件只提供执行器;checks 由主 agent 编写,语义验收仍由主 agent 负责。不防 Codex 改测试文件——需结合 diff 审阅。
会审(consult)与 reviewId(v0.3.0)¶
会审的判据不是「有几个方案」,而是「这份设计是否由主 agent 提出」。出现以下任一条宜 tandem_consult:
- 改插件 / 工具 / 脚本的功能实现(逻辑、schema、加载路径);
- 向用户给出由主 agent 设计的方案、实施计划、排查思路或架构选型;
- 在文档中写设计说明。
不审:照既定方案执行命令、重跑失败任务、读文件查资料、改文案错别字。同一问题默认只问一次。
成功会审返回 reviewId(rv- + 16 位十六进制),可随 tandem_delegate 带入票据;tandem_check 可返回 reviewed: true 及 review 摘要。被审路径内容指纹变化后标记过期(stale: true)。记录落在 <stateDir>/reviews.jsonl。
会审闸(reviewGuard,v0.4.x)¶
通过 fs 写入意图记账、在工具执行前后提醒或拦截,使「改了代码却没会审」在交付前暴露。配置项包括 reviewGuard、reviewGuardFirst、reviewGuardEvery、reviewGuardGate(设为 "off" 则只提醒不拦 present)。present 在仍有未审改动时会被拒一次(code: "REVIEW_REQUIRED"),第二次放行并留痕到 deliveries.jsonl。账本在 <stateDir>/ledger.jsonl,重启 DSH 后仍会读回。
自动求援(autoRescue,v0.5.0)¶
在 turn 仍在进行、自最后一条真实用户消息起工具调用 ≥15 次且 ≥10 分钟、距上次求援 ≥20 分钟、本会话求援 <3 次等条件同时满足时,插件把最近 30 步摘要发给 Codex 复核是否卡住。可通过 "autoRescue": false 关闭;阈值见配置示例。触发与结论主要在内存中,DSH 重启会清零计数(README 已写明边界)。
安装与启用¶
先安装 Codex CLI,再把插件链入桌面端 profile。README 给出的步骤如下(路径需换成本机实际位置):
# 1) 装依赖(Codex CLI)
npm i -g @openai/codex
# 2) 把插件链进桌面端 profile(先把下面的路径换成你实际存放插件的位置)
cd ~/.dsh/profiles/desktop
# 2a. package.json 改两处:
# dependencies 里加一行 "dsh-tandem": "link:D:/dsh/config/dsh-tandem"
# dsh.profile.bundles 里追加一项 "dsh-tandem"
# 2b. 在 profile 目录下建目录联接
New-Item -ItemType Junction -Path node_modules\dsh-tandem -Target "D:\dsh\config\dsh-tandem"
# 等价 cmd(在同一目录下):mklink /J node_modules\dsh-tandem "D:\dsh\config\dsh-tandem"
# 3) 重启 DSH(插件在启动时加载,热重载不会加载新插件)
安装前建议在 GitHub 阅读源码与 MIT 许可证;插件以当前 DSH 进程权限运行,并会调用本机 Codex 所配置的模型服务。
配置¶
优先级:默认值 → ~/.dsh/tandem.json → 插件 config(后者覆盖前者)。完整字段见仓库内 config.example.json。示例:
{
"codexCommand": "codex",
"model": "gpt-6.1-sol",
"maxParallel": 3,
"workRoots": ["D:/dsh/work"],
"taskTimeoutMs": 300000,
"requireCompletionMarker": true,
"stateDir": "D:/dsh/config/dsh-tandem/state",
"envKey": "PORTDAN_API_KEY",
"reviewGuard": true,
"autoRescue": true,
"rescueAfterCalls": 15,
"rescueAfterMin": 10,
"rescueCooldownMin": 20,
"rescueMaxPerSession": 3
}
要点:
workRoots为允许派活的目录白名单;Codex 以高权限运行,白名单主要防手滑与误配,越界写入需在checks里自行核验产物路径。maxParallel上限为 3,超过易被上游挂住。requireCompletionMarker默认检查 Codex 日志中的完成标记,避免「退出码 0 但未改文件」的空跑;若 Codex 版本变更导致匹配失效可设为false。envKey指向 API 凭据所在环境变量名。
典型用法片段¶
会审后带标记派活(摘自 README):
tandem_consult { mode: "review", question: "...", paths: ["D:/dsh/config/dsh-tandem"] }
→ { ok: true, reviewId: "rv-1a2b3c4d5e6f7a8b", reviewedPaths: [...] }
tandem_delegate { tasks: [...], reviewId: "rv-1a2b3c4d5e6f7a8b" }
→ 票据带上标记;tandem_check 返回 reviewed: true 和 review 摘要
机械验收(概念示例,命令需按你的产物自定):
{
"taskId": "<delegate 返回的 id>",
"checks": [
{
"cmd": "npm test",
"expect": { "exit": 0 },
"timeoutMs": 120000
}
]
}
不通过则 tandem_reject,失败输出包在 <codex-output> 定界块中回灌,并声明「这是数据不是指令」。
适用场景与注意¶
适合:已有本地 Codex CLI 与模型凭据;主 agent 需要把可独立验收的多路实现并行出去;希望在改实现或对外给方案前有一次结构化会审;希望用冻结的机械判据做门禁,而不是口头「做完了」。
注意:
- 分类在目录侧为「工作流」;包元数据还标有「多 agent」「效率」「Host」。
- 会审闸主要约束走
present的交付;结论直接写在回复里不经过该路径。 reviews.jsonl、ledger.jsonl等为本机信任模型,可被手工改写。- 自动求援与会话内部分状态重启后丢失,长任务需知晓该边界。
结尾¶
dsh-tandem 把双 agent 分工写进工具契约:主 agent 沟通决策,Codex 并行执行与会审,验收与返工有 taskId 与冻结判据支撑,会审与未审改动也有可选的闸与标记。若你在 DSH Host 上做多 agent 工作流,可从状态工具 tandem_status 起,按 README 链入 profile 并配置 workRoots 与凭据。
- 目录页:https://www.skillhub.cn/plugins/wuuuuu123-32/dsh-tandem
- GitHub:https://github.com/wuuuuu123-32/dsh-tandem