用途
self-review-diff 用于在提交(commit)或拉取请求(pull request)之前,对当前未提交的 Git 变更进行自我审查、审计与修复。它默认是一个会修改文件的工作流,但会根据风险等级决定是否自动修复或先征求确认。
主要能力
- 检查工作区状态:包括暂存、未暂存以及相关的未跟踪文件。
- 在 HEAD 存在时,检查合并后的已跟踪变更(git diff HEAD)。
- 读取仓库根目录及相关子目录中的 AGENTS.md 文件,以了解 lint、测试、样式、提交和审查行为。
- 构建仓库感知视图:识别变更的功能区域、公共接口、模式、生成文件、测试、快照、文档和配置;阅读附近的生产代码和测试;搜索调用点、引用、功能标志、序列化器、导航路径、UI 预览和变更 API 的消费者。
- 按审计清单审查:潜在缺陷、缺失边界情况、潜在回归、性能问题、死代码或过时代码、文件大小压力、缺失测试覆盖、缺失有用注释或文档、缺失或过时的 AGENTS.md 指引、lint 警告或错误、UI 变更中的可访问性问题,以及其他通用问题(命名、可读性、可维护性、安全、隐私、日志、指标、可观测性、所有权、文档、发布安全、兼容性)。
- 修复策略:仅自动修复低风险且明显正确的发现,例如明显的 lint、格式、导入、警告或拼写错误修复;使用现有测试辅助、夹具和模式的小型缺失测试;新变更 UI 中明显的可访问性标签、提示或状态元数据遗漏;静态引用证明未使用且不影响公共 API 等的私有死代码移除;对非显而易见变更逻辑的澄清注释。
- 高风险修复需先确认:行为变更、API 或模式变更、持久化变更、数据迁移、网络契约变更、生成代码变更、功能标志行为或发布逻辑;全仓库格式化器、广泛自动修复命令或可能重写无关文件的 lint 修复;改变焦点顺序、分组、角色、命中目标、键盘导航、手势、布局或可见 UI 行为的可访问性变更;涉及公共符号、序列化字段、资源、依赖注入、反射、构建配置、命令入口点或可能动态发现的死代码移除;快照基线变更、广泛重构、文件拆分、跨所有权边界移动代码或更改公共文档;引入新产品策略、架构策略、所有权指导或推测性理由的注释或文档;新测试基础设施、广泛夹具重写、快照测试框架变更或影响无关测试的测试辅助变更;现有测试期望重写(除非纯机械且不能掩盖行为变更);任何可能使现有行为回归或改变先前/下游提交意图的修复;在没有相关现有提交应拥有该修复时创建新提交;更新 AGENTS.md(除非用户特别要求)。
- 验证:在自动低风险修复或用户确认的高风险修复后,运行覆盖变更区域的最小相关检查,包括重新运行 git status --short 和相关 diff/stat 命令、git diff --check、git diff --staged --check、git diff HEAD --check(HEAD 存在时)、对未跟踪文本文件运行 git diff --no-index --check -- /dev/null "<file>"、聚焦单元测试、快照测试、类型检查或 lint 命令。
- 迭代循环:在验证任何自动低风险修复或用户确认的高风险修复后,从 Prerequisites 重新开始工作流,重复审计、修复和验证循环,直到一次完整通过未发现可应用的低风险修复且无需要确认的高风险发现。
- 提交与修正策略:优先遵循用户指定的提交或修正偏好;若无偏好,在聚焦 lint/测试后,优先将修复修正到相关的现有提交中;当 Graphite 适用时,优先使用 Graphite 原生操作;不使用 gt submit 或 push,除非用户明确要求。
- 报告结构:以简洁报告结束,包括 Audited、Auto-fixed、Needs confirmation、Passes、Validation、Commit status。
使用方式
该技能通过自然语言触发,例如用户要求对当前未提交的 Git diff 进行自我审查、审计、检查或修复。技能会按照上述流程执行。用户可以提供关注领域,技能会优先处理该领域,但仍会考虑完整的本地变更集,除非用户明确要求仅限范围的审计。如果用户要求仅审计或不编辑,则视为只读,报告发现而不修改文件。
适用场景
- 在提交或拉取请求之前,对本地未提交的 Git 变更进行自我审查。
- 需要审计当前工作区变更,识别潜在缺陷、回归、测试覆盖不足等问题。
- 希望在提交前自动修复低风险问题,如 lint、格式、拼写错误等。
- 需要结合仓库上下文和 AGENTS.md 指引进行审查。
限制
- 默认会修改文件,但高风险修复需先确认。
- 不推送(push),除非用户明确要求。
- 不覆盖无关的脏变更;如果无关本地变更影响相同文件,需小心处理或停止并解释冲突。
- 保留用户的暂存意图;提交或修正时,仅暂存预期的修复块,并尽可能保持预先存在的暂存和未暂存变更分离。
- 在 shell 命令中引用文件路径,尤其是来自 git ls-files 的路径,以防止空格或 shell 元字符改变检查的文件。
- 如果检查因工具缺失、认证不可用、依赖未安装或命令过于宽泛而无法运行,需在最终报告中说明。
- 验证失败后,不修正或创建提交,除非用户明确要求保留失败状态。
- 防止无限循环:跟踪会话中重复的发现/修复对;如果同一问题在修复或验证步骤后再次出现,停止并作为阻塞报告。
- 关于 Graphite 的适用条件:仅当 gt 已安装、gt --no-interactive log short --stack 成功且当前分支存在于跟踪栈中时,才视为 Graphite 活跃。
- 其他具体限制请参考官方文档。