研发协作
用户明确要求「review」diff/PR/产物时…
当用户明确要求评审某个 diff、分支、未提交改动、文件或文档(代码或文档皆可),需要按已安装的 lens 集做多视角分析并输出统一形态的 triaged findings。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用户明确要求「review」diff/P特定
解决思路
- 解析自定义配置:运行 `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow`。脚本不存在说明此处未配置 BMad:提议运行 `bmad` skill 的 setup,没有 `bmad` 时先执行 `npx skills add bmad-code-org/BMAD-METHOD --skill bmad` 安装,再重跑该命令;其他任何失败则直接读取 `{skill-root}/customize.toml` 并使用默认值。
- 处理转发的激活参数:若调用方带着已解析的自定义字段调用(例如 `bmad-editorial-review` shim),对这些具名字段原样沿用(它们已含用户覆盖),只从自己的 `customize.toml` 解析剩余字段;然后按序执行每个 `{workflow.activation_steps_prepend}` 条目,把 `{workflow.persistent_facts}` 作为本会话的常驻上下文,把 `{workflow.review_guidance}` 条目当作每个 lens 的常驻评审指令。
- 按约定解析路径:裸路径(如 `references/lens-edge-case-hunter.md`)从 `{skill-root}`(本技能安装目录,`customize.toml` 所在处)解析;`{project-root}` 解析为项目工作目录;`{workflow.<name>}` 解析为 `customize.toml` 中 `[workflow]` 表的字段(按 BMad 合并规则以覆盖为准)。在 `style_guide`、`review_guidance`、`persistent_facts` 中,以 `file:` 为前缀的值是路径或 glob,需加载该文件内容;若某个 `file:` 值读不到,在输出头部点名失败的文件并继续:`style_guide` 用随包基线,其余条目用剩余条目。
- 加载内容并暂存为文件:当内容是分支、未提交工作或提交范围时,用仓库的版本控制工具把 unified diff 写入系统临时目录中唯一命名的文件,并以该文件的绝对路径作为内容。分支指与其 base branch 的 merge base 之间的 diff;未提交工作包含未跟踪文件。`claims` 同样单独暂存为自己的文件——它只是一个 lens 的输入,单独暂存正是为了让其他 lens 永远看不到它。
- 处理空或不可解码的输入:若内容为空或无法按文本解码,当调用方期望原始 findings JSON 数组(例如 legacy edge-case forwarder)时,返回 `[{"location":"N/A","trigger_condition":"Input empty or undecodable","guard_snippet":"Provide valid content to review","potential_consequence":"Review skipped — no analysis performed"}]`(不带 `lens` 字段)并停止;否则说明问题所在并索要可评审内容。
- 对内容分类:判断它是 diff、源文件、函数还是文档,以及是 **code** 还是 **docs**;作用域规则和 lens 适用性都取决于此。定义行为的文档(spec、需求、计划、story)属于 `docs`,行为类 lens 仍可能适用——按 `when` 判断。
- 选择 lens:从 `{workflow.lenses}` 中选择。`instruction` 为空的 lens 视为禁用。若用户或调用方点名了 lens,就只运行这些——`applies_to` 和 `when` 不过滤显式请求。否则运行所有已启用、且 `applies_to` 覆盖该内容类别(`any` 总覆盖)、且 `when` 适用的 lens。
- 运行前用一行播报计划:内容类别、即将运行的 lens,以及当任何 lens 设置了 `after` 时说明它运行在所指 lens 的 findings 之上。当调用方锁定了精确输出契约(要求原始 JSON 或某一固定行的 legacy forwarder)时完全跳过播报——它们的契约覆盖你输出的全部内容,而不只是 findings 块。然后按序执行每个 `{workflow.activation_steps_append}` 条目。
- 运行独立 lens(所有没有 `after` 的已选 lens):每个只看到内容与 `also_consider`,绝不看其他 lens 的 findings。遵循每个 lens 的 `instruction`;随包 lens 会即时加载其参考文件,所以只加载要运行的那些。当有 subagent 可用时,在处理任何 lens 的结果之前先启动所有独立 lens:每个 lens 起一个 subagent,把 lens 的 `instruction` 连同已解析为绝对路径的 `{skill-root}` 和各路径、已暂存内容文件的绝对路径(lens 提示只携带路径由其自行读文件,绝不传内容字节;仅当内容从未暂存为文件时才内联内容)、任何 `also_consider` 领域、常驻评审指令、`claims` 路径(只给 edge-case lens,并标注在其指令要求之前不得读取)以及约束「只返回你的 findings——不要其他输出。不要调用任何 skill,也不要自己起 subagent——你就是 reviewer。在最终消息中以文本返回 findings;不要通过宿主可能提供的任何 findings 上报工具转发」一并交给它。否则自己顺序运行各 lens,完成一个再开始下一个。
- 运行依赖 lens(所有带 `after` 的已选 lens):在其所指 lens 完成后传入该 lens 的 findings。若 `after` 目标未被选中或没有产出,该 lens 仍要运行,只是不带前置 findings。命名不同目标的依赖 lens 彼此独立:先启动所有已就绪的,再处理它们的结果,尽量同时运行。有 subagent 时用与独立 lens 相同的约束启动:'只返回你的 findings——不要其他输出。不要调用任何 skill,也不要自己起 subagent——你就是 reviewer。在最终消息中以文本返回 findings;不要通过宿主可能提供的任何 findings 上报工具转发。'
- 按输出规范组装与呈现:保留每个 lens 的全部 findings——lens 之间的重叠是信号而非重复,在 markdown 报告中注明而不是去重。若设置了 `{workflow.on_complete}` 则执行它。
- 产出包含所有 lens 全部 findings 的一个 JSON 数组,每条 finding 带:`lens`(产出它的 lens 代码)、`location`(内容中的位置,代码用 file:line-range,文档用章节)、`trigger_condition`(问题或暴露它的条件,一行)、`guard_snippet`(具体修复、防护或缺失的检查)、`potential_consequence`(按现状发布会导致什么)。每个 lens 文件会细化为其 findings 的语义,并可添加 lens 专属字段(例如删除类 findings 的 `kind`/`confidence`,verification-gap findings 的 `gap_shape`/`consumer`/`evidence`)。lens 文件也可以声明自己的 findings 形态与渲染方式——editorial lens 渲染 findings 表格——该形态对该 lens 的 findings 优先。什么都没发现时 `[]` 是合法值。任何地方都不出现 severity、priority 或 ranking。
- 按 `{workflow.output_format}` 呈现——`"json"`(fenced json 块中的原始数组)、`"markdown"` 或 `"both"`——除非调用方要求了特定形态;legacy forwarder 的输出契约永远优先,并且管辖你输出的全部内容而非仅 findings 块。markdown 报告按 lens 分组,每个 lens 用其声明的形态渲染:每条 finding 一小块,渲染各字段外加值得暴露的额外字段;某个 lens 什么都没发现时用一行;整个评审干净时给出明确的干净声明。按 `{workflow.output_preferences}` 调整报告形态。
- 当设置了 `{workflow.report_path}` 时把报告写到该路径,否则在对话中呈现。
适用边界 · 注意事项
- 用户没有明说「review」时不要调用,包括对自己刚做的编辑;对早前评审反馈采取行动属于变更而非评审。
- 未安装/未配置 BMad(缺少 `resolve_customization.py` 或 `customize.toml`)的环境无法直接运行,需先安装并完成 setup。
- 不要按本技能文件声称具备某种能力——lens 集由解析出的 `{workflow.lenses}` 决定,覆盖项会新增 lens 并替换随包 lens,必须按解析结果工作。