mcpField
C
combine-code-review

combine-code-review

github.com/existential-birds测试与质量85118 次安装11 周前更新
代码仓库

关于 combine-code-review

combine-code-review 是面向使用 Swift Combine 的代码审查技能,供审查 Combine 代码的开发者使用。它聚焦订阅生命周期、内存引用、操作符、错误处理和 UI 线程,并设置报告问题前的核验门槛。

主要功能

  1. 01检查订阅与 AnyCancellable 保留
  2. 02识别闭包中的循环引用风险
  3. 03核对发布者操作符用法
  4. 04审查错误处理链
  5. 05检查 UI 更新的主线程调度

适用场景

  1. 01审查 sink 与 assign 的生命周期管理
  2. 02排查 Combine 链中的潜在内存问题
  3. 03检查搜索流的 flatMap 与 switchToLatest 选择
  4. 04核对 UI 发布者链的线程调度

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/existential-birds/beagle --skill combine-code-review

安装后在 Claude Code 中输入/combine-code-review确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
error-handling.md
memory.md
operators.md
publishers.md

详细介绍

Combine 代码审查

快速参考

问题类型参考资料
Publishers、Subjects、AnyPublisherreferences/publishers.md
map、flatMap、combineLatest、switchToLatestreferences/operators.md
AnyCancellable、保留循环、[weak self]references/memory.md
tryMap、catch、replaceError、Neverreferences/error-handling.md

审查清单

  • 当 self 持有 cancellable 时,所有 sink 闭包都使用 [weak self]
  • 不使用 assign(to:on:self)(使用 assign(to: &$property) 或 sink)
  • 所有 AnyCancellables 都存储在 Set 或属性中(而非直接丢弃)
  • Subjects 通过 eraseToAnyPublisher() 以 AnyPublisher 的形式公开
  • 正确使用 flatMap(不在需要 map + switchToLatest 时使用)
  • 在 flatMap 内处理错误,以保持主链继续运行
  • tryMap 后接 mapError,以还原错误类型
  • 在更新 UI 前使用 receive(on: DispatchQueue.main)
  • 事件使用 PassthroughSubject,状态使用 CurrentValueSubject
  • 使用 retry 时,将 Future 包装在 Deferred 中

何时加载参考资料

  • 审查 Subjects 或 publisher 的选择 → publishers.md
  • 审查操作符链或组合 publishers → operators.md
  • 审查订阅或内存问题 → memory.md
  • 审查错误处理或 try* 操作符 → error-handling.md

硬性关卡(报告问题前必须通过)

按顺序完成。前一个关卡尚未通过时,不要跳到后续关卡。

  1. 范围 — 通过: 至少指出一个正在审查且导入 Combine 或使用快速参考中 API 的文件或类型(例如 AnyPublisher、@Published、PassthroughSubject)。如果均不适用,则以“超出范围”结束。
  2. 订阅保留 — 通过: 对范围内的每个 sink、assign 和 store(in:),说明 AnyCancellable 保留在哪里(属性、Set、任务生命周期),或标记为 临时 并用一句话说明原因(例如无法超出调用方生命周期的同步一次性操作)。如果无法从代码片段判断,请说明 未知 并询问周边的存储代码,不要假定安全。
  3. 保留循环结论 — 通过: 对于已确认的泄漏问题,说明捕获链(例如 self → 已存储的 cancellable → 强引用 self 的闭包)。对疑似情况标记为 风险 / 待验证,不要说成已确认泄漏。论证安全时,引用所依据的 [weak self]、[unowned self] 或无捕获模式。
  4. UI / 主线程 — 通过: 对于链中对 UIKit/SwiftUI 的更新,指出 UI 操作前的 receive(on: DispatchQueue.main)、@MainActor 或等效机制;或者使用 file:line 标出缺少调度的问题。
  5. 严重程度和清单 — 通过: 每个 高 或 严重 项都包含 file:line(或精确引用的代码行),并指出违反了 审查清单 中的哪一项。低严重程度的备注可以省略行号,但仍必须能从指定文件中复现。

审查问题

  1. 是否保留了所有订阅?(检查是否丢弃了 AnyCancellables)
  2. 是否有 sink 或 assign 可能与 self 形成保留循环?
  3. 搜索或自动补全场景中,flatMap 是否应改为 switchToLatest?
  4. publisher 失败时会发生什么?(会导致主链终止吗?)
  5. try* 操作符之后,错误类型是否得到保留或正确映射?

评论

支持 Markdown