前言¶
在 DeepSeek Harness(DSH)里让 Agent 改代码,常见问题往往不是写不出来,而是动手太快:需求只读对一半、顺手重构、多加了用不上的依赖、边界只覆盖 happy path。写的时候觉得都对,事后很难自己挑出来。
社区里已有把「先评审再动手」写进上下文的思路(例如同作者的 dsh-code-review-gate),但评审方往往是固定的一种。下面介绍 dsh-second-opinion:同一套「先分析、再动手、最后交叉检查」纪律,评审方由你自己接——子代理、OpenAI 兼容 HTTP、本地命令,或只要纪律不要第二意见。
这是什么¶
dsh-second-opinion 是维护者 alxy1018-ctrl 发布的 DSH 工作流类插件(社区目录分类:工作流)。它通过向根会话注入纪律与调用约定,约束 Agent:动手前先写清问题与验收标准,把分析交给第二个「脑子」过目,代码写完和验证做完后再各复审一次;多模块任务时可两边分头写、互相查。
插件进程内不发起任何外部调用,也不绑定厂商默认端点;真正评审由 Agent 用宿主已有能力完成。注入给 Agent 的纪律正文为中文,评审方配置与契约为语言中立。当前 package 版本为 0.1.0,许可证 MIT,要求 Node.js >= 20。
核心功能¶
三件事¶
- 先分析,不动手:明确真正要解决的问题、验收标准、改动面、必须沿用的既有约定、不确定项。
- 第二意见:把「要求原文 + 分析」交给配置的评审方,专门挑毛病;结论留在内部,用户看到的是结果与理由,而不是完整内部讨论记录。
- 交叉检查:代码产出后复审 diff 关键部分,验证跑完后再复审;并行多模块时约定文件所有权,避免两边改同一处。
一次流程示例¶
你:把 X 模块改成支持批量导入
agent:先给分析(问题 / 验收标准 / 改动面 / 既有约定 / 不确定项)
→ 送 requirement 评审 → 合并意见 → 动手
→ 送 code 评审(diff 的关键 hunk)→ 修真实缺陷
→ 跑验证 → 送 test 评审 → 报告结果
评审方(四种 kind)¶
| kind | 说明 |
|---|---|
subagent(默认) |
复用宿主已有子代理路由,需自行配置 provider / model 并在设置里授权 |
http |
任意 OpenAI 兼容端点,apiKeyEnv 为环境变量名而非密钥本身 |
command |
自定义命令,契约 JSON 从 stdin 进、stdout 出 |
none |
只保留分析与交叉检查纪律,不送评审 |
自定义形态可对照仓库内 docs/reviewer-contract.md,参考 adapters/http.mjs、adapters/exec.mjs 实现。策略段与技能正文在 lib/index.js,按需加载。
会话命令¶
模式切换为每会话进程内状态,不写会话日志,重启客户端后回到 profile 默认:
/second-opinion status 看当前模式与评审方
/second-opinion check 自检评审方配置与调用方式,指出缺项
/second-opinion code 仅对代码产出类要求生效(配置默认)
/second-opinion always 一律先分析再动手
/second-opinion off 本会话关闭
defaultMode 还可被环境变量 SECOND_OPINION_MODE 覆盖(优先级高于配置),但该变量为进程级,在长驻 DSH 中会影响之后所有会话;日常建议用 /second-opinion 切换,而非环境变量。
安装与配置¶
安装¶
在已安装 DSH 的机器上,向 desktop profile 添加插件(命令来自官方 README):
dsh plugin --profile desktop add github:alxy1018-ctrl/dsh-second-opinion
从 GitHub 安装需要本机已安装 git,且 DSH 须在安装 git 之后启动。若装 git 后未重启 DSH,可能出现 'git' 不是内部或外部命令;重启客户端即可,不必纠结误导性的 allowBuilds 提示。
安装前建议阅读仓库源码与 MIT 许可证;插件随当前 DSH 进程权限运行,评审方若走 HTTP 或子代理,密钥与路由也由你在环境中自行管理。
profile 配置¶
在 profile patch 中配置,reviewer 为需要关心的项,其余有默认值:
- id: second-opinion
name: 'dsh-second-opinion'
config:
defaultMode: code # code | always | off
reviewer:
kind: subagent # subagent | http | command | none
provider: <你的路由>
model: <你的模型>
label: 我的评审方 # 可选,只影响显示
subagent 示例:
reviewer:
kind: subagent
provider: 你的-provider-id
model: 你的-model-id
http 示例:
reviewer:
kind: http
baseURL: https://api.example.com/v1
model: your-model
apiKeyEnv: YOUR_API_KEY
timeoutSeconds: 180
command 示例:
reviewer:
kind: command
command: node D:/tools/my-reviewer.mjs --json
修改 lib/index.js 中的策略段或技能正文、或 profile 配置后,需重启 DSH 客户端再用新会话确认;插件本体不重载,改文件后旧会话仍可能拿到旧文本。
典型用法¶
- 按上一节安装并写好
reviewer,重启 DSH。 - 新开用户根会话(子代理不会收到策略段注入),执行
/second-opinion check确认评审方与缺项提示。 - 用
/second-opinion code或always设定本会话模式,再提出编码类任务;观察 Agent 是否先输出分析再动手,并在阶段点尝试 requirement / code / test 评审。 - 若暂时不要第二意见但保留纪律,可
/second-opinion off,或将reviewer.kind设为none。
仓库内可在不装进 DSH 的情况下做本地自检(无网络、零外部依赖):
node test/run.mjs
或 npm test。这验证插件注册与适配器逻辑,不能替代「装进 profile、重启、真跑一次」的端到端确认——README 写明作者尚未在真实 DSH 实例完成端到端走通,首次安装应格外留意 /second-opinion check 输出。
适用场景与注意¶
适合谁:希望在 DSH 编码工作流里固定「先想清楚再写、写完再查」,且已有或愿意接一条自己的评审通道(现有模型路由、自建 API、脚本)的开发者。与 dsh-code-review-gate 相比,本插件保留相同纪律骨架,把评审方从写死改为契约 + 自接,并按阶段降级(某阶段拿不到评审不拖死全流程,纪律仍生效)。
边界(使用前心里有数):
- 评审方意见仅供参考,可能误读或夹带风格偏好,应能驳回并记录理由。
- 评审超时、报错、未配置或未授权时,Agent 按自己的分析继续,并用一句话说明原因;不会为拿评审反复重发同一段载荷。
- 策略段只注入根会话,子代理收不到(避免子代理无法再派子代理却白跑评审、每轮多背上下文)。
- 插件零 npm 外部依赖,仅用
node:内置模块;密钥只通过环境变量读取,配置里只写变量名。
生态说明:DSH 奉行「一切皆插件」;SkillHub 插件目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。目录页当前星标为 0,以页面与仓库为准。
结尾¶
dsh-second-opinion 把「先分析、再动手、最后交叉检查」做成可配置的 DSH 工作流插件,评审方由契约对接、不绑厂商。若要查看简介与分类,可打开 SkillHub 目录页;安装命令、配置字段、命令列表与已知限制以 GitHub 仓库 README 为准。