mcpField
L
lynx-repair

lynx-repair

github.com/autumnsgrove测试与质量668 次安装5 天前更新
代码仓库

关于 lynx-repair

lynx-repair 是用于处理 Pull Request 评审反馈的技能,适合需要审查评论并决定后续行动的开发者。它按严重程度筛选建议,区分直接修复、制定计划、解释跳过和升级确认。

主要功能

  1. 01汇总 PR 信息与评审评论
  2. 02按风险和类型分类反馈
  3. 03判断修复、规划或跳过
  4. 04回应问题并升级争议
  5. 05代码修改后运行验证

适用场景

  1. 01处理混合了关键问题与细枝末节的 PR 评审
  2. 02为重大评审意见整理响应计划
  3. 03解释为何不采纳主观建议
  4. 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:响应

猞猁开始行动——不是为了每一丝响动,而是为了值得捕获的猎物。迅捷。果断。毫不拖沓……

直接修复(次要问题):

对于可以快速处理的事项:

  1. 阅读相关代码——理解上下文,而不只是评论内容
  2. 进行修改——精准、精简,并遵循现有模式
  3. 附带上下文提交——链接到 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
)"
  1. 回复评论——将其标记为已解决,并简要说明:

    “已在 {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 流程:

  1. PERCH — 获取 PR #284:"为用户服务添加缓存"。3 位审阅者共留下 8 条评论。

  2. 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
  3. DISCERN —

    • 严重问题:修复缓存键错误(5 分钟)+ 规划缓存失效处理(中等工作量)
    • 重要问题:规划添加指标;直接补上缺失的测试
    • 讨论:Redis 建议——改动较大,升级处理
    • 小问题:两项都跳过,并说明原因
    • 问题:解释 TTL 的理由
  4. RESPOND —

    • 直接修复缓存键错误(提交:a1b2c3d)
    • 添加缺失的测试用例(提交:d4e5f6g)
    • 制定缓存失效处理和指标的计划
    • 在评论串中回答 TTL 问题
    • 跳过小问题并说明原因
    • 将 Redis 建议升级处理:"这需要改动基础设施——要不要将其推迟到问题 #285?"
  5. 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.

猞猁蜷起尾巴。树枝吱呀作响。下方某处,一只老鼠飞快窜过——无人察觉,无人追逐,也无人错过。猞猁知道自己的猎物。猞猁知道何时等待。当暮色渐隐、夜色降临,森林依然屹立,因为猞猁的判断而更加明智。 🐈‍⬛

评论

支持 Markdown