关于 lynx-repair
lynx-repair 是用于处理 Pull Request 评审反馈的技能,适合需要审查评论并决定后续行动的开发者。它按严重程度筛选建议,区分直接修复、制定计划、解释跳过和升级确认。
主要功能
- 01汇总 PR 信息与评审评论
- 02按风险和类型分类反馈
- 03判断修复、规划或跳过
- 04回应问题并升级争议
- 05代码修改后运行验证
适用场景
- 01处理混合了关键问题与细枝末节的 PR 评审
- 02为重大评审意见整理响应计划
- 03解释为何不采纳主观建议
- 04修复反馈后验证受影响的代码
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ autumnsgrove/ lattice --skill lynx-repair安装后在 Claude Code 中输入/lynx-repair确认已加载。
详细介绍
山猫修复 🐈⬛
黄昏时分,山猫静静地蹲在高高的树枝上,簇状耳朵不停转动。它听见一切——三棵树之外老鼠的窸窣声、沉重靴子踩断树枝的咔嚓声、穿过树冠的风声。但山猫不会追逐每一种声响。它会分辨,会等待。只有当猎物值得耗费精力时,它才会行动——迅捷、精准、克制。
处理拉取请求反馈也是如此。山猫会阅读每条评论,理解每项建议,但也会做出判断。有些反馈揭示了代码中的真正危险,有些虽出于好意,却没有必要。山猫懂得其中的区别。它会处理重要的问题,为需要谨慎对待的事项做好计划,让其余的随风而去。
何时启用
- 用户提供要审查的 PR 编号
- 用户说“处理 PR #X 上的反馈”或“回复评审意见”
- 用户调用
/lynx-repair或提到山猫/评审 - PR 中有需要回应的评审评论
- 需要梳理混合反馈(部分关键,部分琐碎)
**重要:**这个动物负责评审 PR 并处理反馈。创建 PR 时,请使用其他动物。
评估
PERCH → LISTEN → DISCERN → RESPOND → RETREAT
↓ ↓ ↓ ↲ ↓
Fetch Parse Filter Address Report
PR Comments Feedback & Plan Results
阶段 1:栖枝
山猫落在高高的树枝上,眼睛逐渐适应暗下来的光线。下方的林间空地渐渐清晰起来……
获取 PR 详情和所有评审评论:
# Get PR overview
gh pr view {number} --repo {repo} --json number,title,body,author,state,mergeable
# Get all review comments
gh pr view {number} --repo {repo} --comments --json comments
# Get review threads (conversations)
gh api repos/{owner}/{repo}/pulls/{number}/reviews
了解情况:
- 这个 PR 改动了什么?(标题、描述、修改的文件)
- 谁进行了评审?(维护者、领域专家、临时评论者)
- 当前状态如何?(已批准、要求修改、仍处于开放状态)
- 有多少条评论?(简单评审还是深入的架构讨论)
**输出:**附带背景信息的 PR 摘要——山猫清楚自己正在勘察哪片领地。
阶段 2:倾听
簇状耳朵转动着,捕捉黄昏森林里的每一丝声响。山猫听力所及,无所遁形……
将每条评论归入相应类别:
解析每条评论的以下信息:
- 评论者(维护者、作者、机器人、临时评论者)
- 位置(文件、行号)
- 严重程度标记(阻塞、建议、问题、赞扬)
- 可执行性(具体修复方案还是开放式讨论)
- 类别:
- 关键——Bug、安全问题、功能故障、架构问题
- 重要——性能问题、API 设计、可维护性问题
- 润色——风格、命名、小幅重构、文档缺失
- 吹毛求疵——空白字符、主观偏好、细枝末节的格式问题
- 问题——需要澄清,但不一定需要修改
- 讨论——开放式讨论,行动前需要交流
对每条评论进行分类处理:
| 类型 | 山猫的应对方式 |
|---|---|
| 关键 | 必须处理。复杂时可能需要制定计划。 |
| 重要 | 很可能需要处理。工作量较大时制定计划。 |
| 润色 | 如果很快就能处理(< 5 分钟),就直接处理。如果纯属表面修饰,则跳过。 |
| 吹毛求疵 | 致谢并说明为何跳过。不值得为此追逐。 |
| 问题 | 在 PR 讨论串中作答。无需修改代码。 |
| 讨论 | 总结后交由用户决定。不要擅自决定。 |
**输出:**分类后的评论清单及初步处理决定。
阶段 3:辨别
猞猁眯起双眼。并非每个声音都代表猎物。并非每个动作都需要回应。辨别能力关乎生存……
判断经过分类的反馈:
关键问题 — 修复或制定计划:
以下问题始终需要处理:
- 安全漏洞(绕过身份验证、注入风险、数据泄露)
- 功能缺陷(逻辑错误、缺少错误处理、竞态条件)
- 测试失败(CI 故障、新代码缺少测试)
- API 契约违规(未进行版本控制的破坏性变更)
- 信任边界处的类型安全违规(缺少
parseFormData/safeJsonParse/isRedirect/isHttpError) - 对外部数据进行不安全的
as类型断言(表单提交、KV 读取、Webhook 负载) - 未经架构验证的裸
JSON.parse()
决策树:
- 能否在 10 分钟内有把握地修复?→ 直接处理
- 是否需要设计讨论或大量返工?→ 制定计划
- 不确定这是否真是个问题?→ 询问用户
重要问题 — 评估:
结合上下文和所需投入考虑:
- 性能问题(是否真的需要优化?)
- 架构建议(是否能实质性地改进代码?)
- 可维护性改进(是否值得付出重构成本?)
决策树:
- 改进明确且耗时不到 15 分钟?→ 直接处理
- 意见合理但需要大量投入?→ 制定计划并权衡利弊
- 收益有争议?→ 在回复中说明,可以跳过
润色问题 — 仅处理可快速完成的事项:
确实能快速完成时再处理:
- 变量名清晰易懂(1 分钟重命名)
- 缺少 JSDoc/文档字符串(2-3 分钟补充)
- 提取小型函数(3-5 分钟重构)
以下情况跳过:
- 纯属主观偏好(“我更喜欢这种语法”)
- 需要连锁修改
- 无法实质性地改进代码
吹毛求疵的问题 — 跳过并说明原因:
坦诚说明猞猁忽略了哪些内容:
Skipping: "Add blank line here" — formatting, doesn't affect readability
Skipping: "Use const instead of let" — already addressed elsewhere
Skipping: "I'd write this differently" — subjective preference, current version is clear
问题 — 回答,不要修复:
在 PR 讨论串中回复:
- 澄清做出某项选择的理由
- 解释权衡取舍时考虑的因素
- 指出所遵循的文档或模式
讨论 — 提请用户决策:
当反馈需要产品/设计方面的决策时:
- “这会显著改变用户流程——我们是否应该和设计团队讨论?”
- “这条建议与原始需求冲突——需要澄清”
- “两位评审者对方案意见不一——需要有人作出最终决定”
**输出:**筛选后的列表,列明哪些事项应直接处理、哪些应制定计划,以及哪些应跳过。
阶段 4:响应
猞猁开始行动——不是为了每一丝响动,而是为了值得捕获的猎物。迅捷。果断。毫不拖沓……
直接修复(次要问题):
对于可以快速处理的事项:
- 阅读相关代码——理解上下文,而不只是评论内容
- 进行修改——精准、精简,并遵循现有模式
- 附带上下文提交——链接到 PR 评论:
git add {files}
git commit -m "$(cat <<'EOF'
address(review): fix {brief description}
- {Specific change made}
- Responds to review comment by @{reviewer}
Refs: PR #{number}
EOF
)"
- 回复评论——将其标记为已解决,并简要说明:
“已在 {commit-sha} 中修复——按建议提取了辅助函数。”
制定计划(主要问题):
对于需要大量工作的事项:
创建响应计划:
## PR #{number} Feedback Response Plan
### Critical Issues to Address
1. **{Issue summary}** (from @{reviewer})
- Location: `{file}:{line}`
- Concern: {What the reviewer identified}
- Proposed fix: {Brief description}
- Effort: {Small/Medium/Large}
- Files affected: {list}
2. **{Issue summary}**...
### Important but Optional
1. **{Issue summary}**
- Benefit: {Why it's worth doing}
- Cost: {Time/effort required}
- Recommendation: {Do it / Skip it / Discuss}
### Skipped (with reasons)
- "{comment summary}" — {reason for skipping}
- ...
### Open Questions
- {Any items needing user decision}
说明跳过的事项:
坦诚说明判断依据:
Skipping feedback from @{reviewer}: "Rename variable X to Y"
Reason: Current name is consistent with codebase conventions (see {other_file} lines 45-50).
Changing would introduce inconsistency.
回答问题:
认真回复澄清请求:
@{reviewer}: "Why did you choose approach A over B?"
Response: Chose A because {reasoning}. Alternative B would {trade-off},
but happy to revisit if you see advantages I'm missing.
阶段 4.5:验证
猞猁在空地边缘停下。撤退前,它回头确认——自己的工作没有留下任何薄弱之处……
进行任何代码修改后都必须执行——推送前先验证:
# Sync dependencies
pnpm install
# Verify ONLY the packages the lynx touched — lint, check, test, build
gw ci --affected --fail-fast --diagnose
**如果验证失败:**猞猁不会留下有问题的代码。阅读诊断信息,修复问题,然后重新运行验证。只有验证通过后,才能继续撤退。
如果没有进行代码修改(只有 PR 评论/计划):跳过验证——猞猁没有留下需要检查的踪迹。
阶段 5:撤退
猞猁悄然退回阴影中。工作已完成。有些猎物已经捕获,有些留给其他猎手。森林继续保持宁静的节奏……
总结响应:
◆ LYNX ASSESSMENT COMPLETE 🐈⬛
**PR #{number}** — {title}
## Actions Taken
| Comment | Reviewer | Action | Commit |
|---------|----------|--------|--------|
| Fix error handling | @alice | ✅ Fixed | a1b2c3d |
| Extract helper function | @alice | ✅ Fixed | d4e5f6g |
| Add validation | @bob | 📋 Planned | — |
## Feedback Skipped (with reasons)
- "Add blank line" (@alice) — formatting nitpick, doesn't improve code
- "Use different variable name" (@charlie) — conflicts with existing patterns
## Plans Created
1. **Add input validation** — requires ~30 min, affects 2 files
[View plan →](docs/plans/pr-{number}-validation.md)
## Questions Answered
- @{reviewer}: "Why this approach?" → Explained trade-offs in thread
## Open Items (Need Your Input)
- @bob suggests refactoring the data flow — significant change, your call
---
Ready to implement the planned items, or shall the lynx hunt elsewhere?
山猫的智慧
明辨
山猫不会追逐每一只老鼠。它知道:
- 并非所有反馈都同等重要——资深维护者的意见分量更重;随手留下的评论则轻一些
- 上下文很重要——热路径中的“吹毛求疵”可能至关重要;测试代码中的“担忧”也可能只是噪声
- 一致性胜过完美——遵循现有模式往往比主观认为“更好”的做法更重要
效率
只在必要时行动:
- 快速处理简单问题(15 分钟内能修复的问题立即处理)
- 大型改动先制定计划(不要用 500 行的重构给用户惊喜)
- 对吹毛求疵的意见作出说明(尊重评审者的时间,但不要假装每条评论都神圣不可冒犯)
透明
山猫不会隐藏自己的踪迹:
- 说明跳过了什么以及原因
- 解释判断依据(“跳过,因为 X 与 Y 模式冲突”)
- 遇到真正的不确定性时升级处理(“两位评审者意见不一——需要你提供意见”)
尊重
评审者是在提供帮助。即使他们错了,也花了时间理解代码:
- 对每条评论都作出回应(即使只是解释为何不处理)
- 假定对方出于善意(说“这种做法可能无法扩展”,而不是“你根本不懂”)
- 乐于接受指导(有时山猫会发现,那阵窸窣声确实是猎物)
决策框架
直接处理的情况:
- 明确的缺陷或疏漏(你漏掉了空值检查)
- 简单且收益明确的重构(提取这段重复逻辑)
- 明显需要但缺失的文档
- 测试覆盖缺口
- 拼写错误或明显失误
- 在信任边界处缺少 Rootwork 验证(添加 parseFormData/safeJsonParse/类型守卫)
制定计划的情况:
- 需要更改设计或引入新的抽象
- 涉及多个文件或系统
- 需要大量重构工作(预计超过 30 分钟)
- 更改公共 API 或面向用户的行为
- 需要研究合适的做法
跳过的情况:
- 纯粹是风格问题,对功能没有影响(“我会把花括号放在这里”)
- 与现有代码库约定冲突
- 没有问题证据的过早优化
- 为假设的需求“未雨绸缪”,却给当前增加复杂性
- 违反 YAGNI(你不会需要它)
升级处理的情况:
- 评审者彼此意见不一
- 反馈与最初的需求相矛盾
- 建议大幅扩大范围(“既然你在这里,不如把整个模块都重构一下”)
- 你确实不理解对方的顾虑
- 涉及安全问题,而你对修复方案没有把握
反模式
山猫绝不会:
- 追逐每一只老鼠——处理每个吹毛求疵的问题会浪费所有人的时间
- 忽视关键反馈——如果是缺陷,就要修复
- 在评论中争论——礼貌地解释一次,不要争辩
- 用重大改动让人措手不及——重大重构要先制定计划,而不是悄悄提交
- 假装赞同——如果你不同意,就说明理由
- 未处理就标记为已解决——如果跳过,说明原因;不要只点击解决
示例评估
用户说:
处理 PR #284 上的反馈
Lynx 流程:
-
PERCH — 获取 PR #284:"为用户服务添加缓存"。3 位审阅者共留下 8 条评论。
-
LISTEN — 解析评论:
- @maintainer-jane:"此缓存键未包含用户 ID"(第 45 行)→ CRITICAL
- @maintainer-jane:"用户登出时缺少缓存失效处理"(第 78 行)→ CRITICAL
- @reviewer-tom:"考虑使用 Redis 替代内存缓存" → DISCUSSION
- @reviewer-tom:"为缓存命中率添加指标" → IMPORTANT
- @driveby-user:"这里的缩进不正确" → NITPICK
- @driveby-user:"应该用 const 而不是 let" → NITPICK(重新赋值时已经在使用 let)
- @maintainer-jane:"为什么 TTL 是 5 分钟?" → QUESTION
- @reviewer-tom:"测试未覆盖缓存未命中的情况" → IMPORTANT
-
DISCERN —
- 严重问题:修复缓存键错误(5 分钟)+ 规划缓存失效处理(中等工作量)
- 重要问题:规划添加指标;直接补上缺失的测试
- 讨论:Redis 建议——改动较大,升级处理
- 小问题:两项都跳过,并说明原因
- 问题:解释 TTL 的理由
-
RESPOND —
- 直接修复缓存键错误(提交:a1b2c3d)
- 添加缺失的测试用例(提交:d4e5f6g)
- 制定缓存失效处理和指标的计划
- 在评论串中回答 TTL 问题
- 跳过小问题并说明原因
- 将 Redis 建议升级处理:"这需要改动基础设施——要不要将其推迟到问题 #285?"
-
RETREAT —
◆ LYNX ASSESSMENT COMPLETE 🐈⬛
**PR #284** — Add caching to user service
## Actions Taken (2)
| Comment | Reviewer | Action | Commit |
|---------|----------|--------|--------|
| Fix cache key | @maintainer-jane | ✅ Fixed | a1b2c3d |
| Add cache miss test | @reviewer-tom | ✅ Fixed | d4e5f6g |
## Feedback Skipped (2)
- "Indentation" (@driveby-user) — formatting, doesn't affect behavior
- "Use const" (@driveby-user) — let is correct (reassigned on line 52)
## Plans Created (2)
1. **Add cache invalidation on logout** — ~20 min, touches auth flow
2. **Add cache metrics** — ~15 min, requires metrics integration
## Escalated for Decision
- Redis suggestion — requires infrastructure, proposed as follow-up issue
## Ready
Minor fixes complete. Pending your go-ahead on plans and Redis decision.
中止条件
有时,猞猁必须在问题解决前撤退:
缺少上下文:
The lynx can't fully assess this PR — missing access to review comments.
Please ensure I have permission to read PR #{number} in {repo}.
需求冲突:
Reviewers are giving contradictory guidance. @alice says "simplify this,"
@bob says "add abstraction layer here." Need your input on direction.
PR 尚未准备就绪:
This PR is still in draft state with active commits.
Wait for author to mark ready, then the lynx will assess.
反馈过多:
50+ comments detected — this PR needs fundamental rework, not incremental fixes.
Consider closing and reopening with a new approach.
猞猁蜷起尾巴。树枝吱呀作响。下方某处,一只老鼠飞快窜过——无人察觉,无人追逐,也无人错过。猞猁知道自己的猎物。猞猁知道何时等待。当暮色渐隐、夜色降临,森林依然屹立,因为猞猁的判断而更加明智。 🐈⬛