swift-code-review について
swift-code-reviewは、段階的な手順でSwiftの変更を確認するレビュースキルです。言語バージョンの確認、周辺コードの読解、問題の検証を経て、位置と重要度を添えて指摘を報告します。
主な機能
- 014段階のレビューゲート
- 02Swiftのバージョンとツールチェーンの確認
- 03変更箇所を含むシンボル全体の読解
- 04変更内容に応じたチェック項目の選定
- 05位置と重要度を添えた指摘の報告
活用シーン
- 01並行処理やエラー処理の変更レビュー
- 02SwiftUIの状態管理とバインディングの確認
- 03検証後のコードレビュー報告の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ existential-birds/ beagle --skill swift-code-reviewインストール後、Claude Code で/swift-code-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/common-mistakes.mdconcurrency.mderror-handling.mdobservable.md詳細
Swift コードレビュー
レビューワークフロー
以下の手順を順番どおりに実施してください。以下のすべてのパス条件を満たすまで、指摘事項を出力しないでください。
-
Swift/ツールチェーンの基準を確認する — 言語とツールの状況を把握します。
Package.swiftの// swift-tools-version、マニフェスト内のターゲットごとの Swift 言語バージョンやswiftSettings、Xcode の場合はプロジェクトまたはターゲットのビルド設定にあるSWIFT_VERSION(または同等の設定)を確認します。レビューが単一ファイルのみかどうかも記録します。
パス条件: 厳密な並行処理、移行時のみの構文、または SDK の利用可否に依存する助言を行う前に、具体的な Swift 言語バージョンまたはモード(例:Swift 6 言語モード、tools 5.10)を明記します。 -
周辺コードを読む — 変更された各
.swiftファイルについて、差分部分だけでなく、編集を含む型、関数、メソッド、またはプロパティの全体を読みます。
パス条件: 変更されたファイルごとに、変更を含む囲みシンボル(型またはメンバー)を少なくとも1つ全文読みます。 -
チェックリストの対象範囲を決める — クイックリファレンスを使って、適用するレビューチェックリストの項目とリファレンスを判断し、該当するリファレンスファイルを開きます。差分と明らかに無関係な項目はスキップします。
パス条件: レビューまたは作業メモに、適用したチェックリストの領域を記載するか、差分に関連する1行の理由を添えて N/A とします(例:「変更に SwiftUI/@Observable がない」)。 -
報告前の検証 — review-verification-protocolを読み、手順に従います。
パス条件: 報告する各指摘について、そのスキルの順序付きハードゲートを満たします(シンボル全体を読む、「未使用」とする前に使用箇所を検索する、「処理漏れ」とする前に呼び出し元を確認する、重要度を適切に調整する、[FILE:LINE]で根拠を示す)。
ハードゲート(同じ順序、簡略版)
| 手順 | 目的のパス条件 |
|---|---|
| 1 | バージョンまたは SDK に依存する助言を行う前に、Swift のバージョン/モード(または単一ファイルのみであることの明示的な制約)を記録する。 |
| 2 | 差分だけでなく、変更された各ファイルの囲みシンボル全体を読む。 |
| 3 | チェックリストの領域とリファレンスを記載するか、差分に関連する理由を添えて N/A とする。 |
| 4 | 報告するすべての問題について、review-verification-protocolを完了する。 |
出力形式
以下の形式で指摘事項を報告します。
[FILE:LINE] ISSUE_TITLE
Severity: Critical | Major | Minor | Informational
Description of the issue and why it matters.
クイックリファレンス
| 問題の種類 | リファレンス |
|---|---|
| async/await、actors、Sendable、Task | references/concurrency.md |
| @Observable、@ObservationIgnored、@Bindable | references/observable.md |
| throws、Result、try?、typed throws | references/error-handling.md |
| 強制アンラップ、保持サイクル、命名 | references/common-mistakes.md |
レビューチェックリスト
- 実行時データ(ネットワーク、ユーザー入力、ファイル)に対して強制アンラップ(
!)を使用していない - プロパティとして保持されるクロージャでは
[weak self]を使用している - デリゲートプロパティは
weakになっている - 独立した非同期処理には
async letまたはTaskGroupを使用している - 長時間実行する Task では
Task.isCancelledを確認している - Actor は保護すべき可変状態を持っている(ステートレスな Actor はない)
- Sendable 型は実際にスレッドセーフである(
@uncheckedに注意) - エラーを明示的に処理している(空の catch ブロックはない)
- カスタムエラーは
LocalizedErrorに準拠し、説明的なメッセージを持っている - ネストされた @Observable オブジェクトにも @Observable を付けている
- Observable オブジェクトへの双方向バインディングには @Bindable を使用している
リファレンスを読み込む条件
- async/await、actors、または TaskGroups をレビューする場合 → concurrency.md
- @Observable または SwiftUI の状態をレビューする場合 → observable.md
- エラー処理または throws をレビューする場合 → error-handling.md
- 一般的な Swift レビュー → common-mistakes.md
レビュー時の質問
- 並行実行できる非同期処理に
async letを使用していますか? - サスペンションポイントをまたいで Actor の状態が変化する可能性はありますか(リエントランシーバグ)?
@unchecked Sendableは実際の同期処理によって裏付けられていますか?- エラーは記録され、役立つコンテキストとともに提示されていますか?
- クロージャまたはデリゲートが保持サイクルを引き起こす可能性はありますか?