sgcop の RuboCop 設定を、導入先プロジェクトの .rubocop.yml にセットアップ・更新する。標準(rubocop.yml)か厳格版(rubocop_strict.yml)かの導入方針をまず確認して inherit_gem を整え、既存 .rubocop.yml から sgcop と重複する不要設定を削除する。gem 依存のカスタム Cop(enumerize 系など)は必要時のみ確認。そのうえで rubocop --auto-gen-config で .rubocop_todo.yml を生成し、違反(ノイズ)が多い Cop は無効化・Exclude・段階対応を提案、無効化したら todo を作り直す。
rubocop-todo-fix
.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
含まれるファイル(2)
- SKILL.md31.0 KB
- references/cop-fix-guide.md19.7 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
rubocop-todo-fix
rubocop --auto-gen-config で生成された .rubocop_todo.yml には、既存コードの違反が「いったん許容」
として列挙されている。これを潰していくための運用支援スキル。safe autocorrect(-a)だけで完結する
Cop はまとめてバッチ処理し、unsafe autocorrect や手動修正が必要な Cop も、挙動変更のリスクに応じた
(safe バッチより狭い)単位でバッチにまとめて潰す。
sgcop-setup が .rubocop_todo.yml を生成するところで終わるのに対し、
本スキルはその続き——生成済みの todo を実際に消化する工程——を担う。
導入先の Rails/Ruby プロジェクトで実行する(sgcop gem 本体の開発スキルではない)。
このスキルがやること / やらないこと
- やる:
.rubocop_todo.ymlから 潰す対象を選ぶ。Tier(safe autocorrect / unsafe autocorrect / 手動修正)ごとに、そのリスクに見合ったしきい値・基準で複数 Cop をバッチにまとめる。- 対象 Cop のエントリを todo から削除して 違反を再び検出される状態に戻す。
- 修正する: Tier 順(
rubocop -a→rubocop -A〈unsafe・要テスト〉→ 手動修正)でバッチを 処理する。同じ Tier のバッチはまとめて一度に適用・確認する。 - アプリ仕様上やむを得ない違反だけ、理由コメント付きで最小範囲の
Exclude/ 無効化に倒す。 - 再 rubocop で 違反ゼロを確認(挙動を変えたら関連テストだけ実行)し、必要なら
.rubocop_todo.ymlを作り直して 停止する。
- やらない:
.rubocop_todo.ymlの生成そのものはしない(sgcop-setupの担当。本スキルは「生成済みを潰す」)。- コミット / push / PR 作成はしない。 1 サイクル潰したら停止し、差分確認とコミットはユーザーに委ねる。
- Tier をまたいでバッチにしない。 safe / unsafe / 手動修正はリスクの質が異なるので、 1 回のバッチは同じ Tier の Cop だけで構成する。
なぜこの形か: 既存違反を一度に全部直すと差分が巨大化してレビュー不能になる。「潰す → ユーザーが差分を確認してコミット → 次へ」というレビュー単位の運用にすると、変更の責任範囲が 把握しやすく、挙動が変わっても切り分けやすい。一方で 1 Cop ずつ処理すると、サイクル数 (起動〜レビュー〜コミットの往復)だけが無駄に増えてしまう。そこで Tier ごとに「レビューが 破綻しない範囲」を見極めてバッチ化する:safe autocorrect は挙動を変えないので件数ベースで 最も広く(目安100件)まとめられる。unsafe autocorrect は挙動が変わりうるので、それより 狭い件数(目安30件)に抑える。手動修正はさらに読み解きコストが件数に比例しないため、 件数ではなく「性質が近い少数の Cop(目安2〜3個)」という基準でまとめる。
引数
--auto: 起動時にこの引数が渡されたら、1 サイクルをユーザー確認なしで回しきるモードに入る。 スキップするのは「進めてよいか」の確認ゲートだけで、それ以外の原則は一切変わらない:- **1 サイクル = 選んだバッチ(Tier をまたがない)**の原則、コミット・push・PR をしない原則、
サイクル完了で停止する原則は
--autoでも不変。複数サイクルの自動連続実行はしない。 - 人間の判断が要る曖昧な分岐は
--autoでも勝手に決めない(手順 5 参照)。触らず残して報告する。 - 手順 6 の関連テスト検証は
--autoでも省かない。 unsafe autocorrect を無確認で当てる分、 関連テストが挙動変更を検知する唯一の安全網になるため、むしろ飛ばしてはいけない。 - WHY: 確認ゲートは「差分が想定外に大きくならないか」「挙動変更を許容するか」を人に確かめる
ためのもの。
--autoは呼び出し側がその判断を事前に委譲した状態、と位置づける。委譲できるのは 「自動で潰してよい」判断までで、曖昧な Exclude 判断や壊れたテストの承認までは委譲されない。
- **1 サイクル = 選んだバッチ(Tier をまたがない)**の原則、コミット・push・PR をしない原則、
サイクル完了で停止する原則は
- 引数が無ければ(従来どおり)各確認ゲートでユーザーに確認する。
重要な前提
- 1 サイクル = 選んだバッチ(1 つの Tier にまとめた Cop 群)を潰しきるまで。 潰し終えたら 自動で次へ進まず、そこで停止してユーザーに制御を返す。次を潰したいときはユーザーが改めて このスキルを起動する。
- safe autocorrect(
-a)と unsafe autocorrect(-A)を区別する。-Aはコードの挙動を 変えうるので、適用後は変更箇所に関連するテストで検証する(手順 6。全テストは流さず CI に任せる)。 safe バッチはこの性質を利用して最も広い単位でまとめて処理する(切り離しルールは手順 4 参照)。 - テスト/lint の実行コマンド・コーディング規約・コミット記法は そのプロジェクトの流儀に従う (このスキルでは決め打ちしない)。Cop ごとの autocorrect 可否の見分け方・Tier の進め方・ 各 Tier のバッチの組み方・Exclude/無効化の書き方は references/cop-fix-guide.md にまとめてある。
手順
1. 前提を確認する
- プロジェクトルートに
.rubocop_todo.ymlがあるか確認する。 - 無ければ ここで止め、先に生成するよう案内する(生成は本スキルの役割ではない):
- sgcop を使っているプロジェクトなら
sgcop-setupスキル、または直接bundle exec rubocop --auto-gen-configで.rubocop_todo.ymlを作ってから戻ってくるよう促す。 - WHY: 本スキルは「列挙済みの違反を消化する」のが役割。潰す対象(todo)が無ければ仕事が始まらない。
- sgcop を使っているプロジェクトなら
.rubocop.ymlの先頭にinherit_from: .rubocop_todo.ymlがあることも確認する (--auto-gen-configが自動追記する。これが無いと todo が読まれない)。
2. 潰す対象を選ぶ
.rubocop_todo.ymlの各 Cop 見出しコメントにある# Offense count: Nと autocorrect 対応状況を読み、 候補を提示する。- ユーザーが特定 Cop / 特定モードを指定していればそれを優先する。 指定が無ければ以下の方針で選ぶ (見分け方・打ち切り基準は references/cop-fix-guide.md 参照)。
経路A: safe バッチ(safe autocorrect のみで完結する Cop)— しきい値内(目安100件)で複数 Cop を
まとめる。候補一覧と合計件数をユーザーに提示し、対象範囲を確認する。--auto 時、または実行環境が
非対話でユーザーの応答を待てない場合は、提示(ログ出力)だけ行い、確認を待たずにしきい値内の
バッチをそのまま対象にする。(安全側の理由: safe autocorrect は挙動を変えないため、確認なしで
進めても手順6の検証で違反ゼロを確認できれば取り消し可能な範囲に留まる。)
経路B: unsafe/手動修正のバッチ(unsafe autocorrect対応、または autocorrect 非対応の Cop)— Tier ごとに、そのリスクに見合った基準で複数 Cop をバッチにまとめる(Tier をまたいでは まとめない。組み方・打ち切り基準は references/cop-fix-guide.md 参照)。
- Tier 2 バッチ(unsafe autocorrect): 件数ベース。経路Aより狭いしきい値(目安30件)に収まる 範囲で複数 Cop をまとめる。挙動が変わりうる修正なので、経路Aと同じ件数まで許容すると 手順6のテストで問題が起きたときの切り分けが大変になるため、上限を絞る。
- Tier 3 バッチ(手動修正): 件数ではなく 性質が近い少数の Cop(目安2〜3個。例:
Metrics/MethodLengthとMetrics/AbcSizeのように同じ箇所に重なって出る Cop)でまとめる。 手動修正は1件ごとの読み解きコストが件数に比例しないため、件数上限より「レビュアーが 1つの意図として読める Cop の組み合わせか」を基準にする。
3. 対象 Cop のエントリを .rubocop_todo.yml から削除する
- 選んだ Cop(バッチ対象すべて)の見出しコメントと設定ブロックを まるごと削除 する。
- WHY: todo に残したままだと違反は「許容」され続け、修正すべき対象として浮かんでこない。
削除して縛りを復活させることで、
rubocopが再びその違反を報告する状態になる。
4. 修正する
経路A(safe バッチ)
- バッチ対象の Cop 全体に
--onlyを付けずに一括でrubocop -aを当てる:bundle exec rubocop -a。--onlyを外すのは、ある Cop の修正が引き金で新規発生する別 Cop の違反(連鎖違反)まで 一括で自動修正するため(詳細は references/cop-fix-guide.md 参照)。--onlyなしのこの1回の実行結果(残った offense の一覧)が、そのまま残違反判定と手順6 最終検証を兼ねる(連鎖違反まで含めて検証される)。 - 結果に違反が残った Cop があれば、その Cop だけバッチから切り離し、経路Bの手順
(Tier 2 → Tier 3)に回す。バッチ側は safe で完結した Cop だけでこのサイクルを完了させる。
切り離した Cop は別サイクルとして扱う(このサイクル内では深追いしない)。残った Cop が
todo に載っていた対象 Cop なのか、autocorrect の連鎖で新規発生した別 Cop なのかを区別する:
前者は切り離して別サイクルに回すが、後者は切り離さず手順6の副作用処理としてこのサイクル内で
扱う。
- 切り離した Cop のエントリは手順 3 で削除済みなので、
bundle exec rubocop --auto-gen-configで todo に戻しておく。 戻さずに放置すると、todo に載らない生の違反として残り、 手順 6 のプロジェクト全体検証が通らなくなる。
- 切り離した Cop のエントリは手順 3 で削除済みなので、
経路B(unsafe/手動修正のバッチ、Tier 順)
references/cop-fix-guide.md に従い、上から順に試す。各 Tier で違反が
残ったら次の Tier へ進む。Tier 2・Tier 3 ともバッチ全体に一括で適用し、一部の Cop だけ残った・
テストで問題が出た場合はその Cop だけバッチから切り離す(経路Aの切り離しルールと同じ考え方。
切り離した Cop は --auto-gen-config で todo に戻し、別サイクルとして扱う)。
- Tier 1:
rubocop -a(safe autocorrect) — 挙動を変えない安全な自動修正。まずこれを試す。 autocorrect は絞らない:bundle exec rubocop -a(--onlyは付けない。連鎖違反を 取りこぼさないため)。 - Tier 2:
rubocop -A(unsafe autocorrect) — safe で残った分に、バッチ対象の Cop 全体へ 一括で 当てる:bundle exec rubocop -A(--onlyは付けない)。挙動が変わりうるので、 当てる前にユーザーに一言断り、適用後は手順 6 で必ずテストする。--auto時、または実行環境が 非対話でユーザーの応答を待てない場合は、断りを省いて適用してよい(手順 2 の経路Aと同じ扱い)。 ただし手順 6 の関連テスト検証は省かない(無確認で当てる分、テストが唯一の安全網)。 テストが落ちたら、原因になった Cop だけバッチから切り離す。切り離しは次の2点がそろって 初めて完了とみなす: ① その Cop が-Aで書き換えた箇所を取り消す(対象ファイルが他の Cop の変更と混在していなければgit checkout -- <file>で丸ごと戻せる。混在している場合は 該当 Cop 由来の変更箇所だけを手動で戻す)。②--auto-gen-configで.rubocop_todo.ymlに 戻す。①を忘れると、todo で「許容」に戻したはずの Cop の書き換えがコードに残ったまま次工程に 進んでしまう。切り離した Cop は別サイクルとして扱い、残りの Cop でこのサイクルを完了させる。 原因の切り分けが付かない場合のみ、そのサイクルを停止してどの Cop に-Aを当ててどのテストが 落ちたかを報告する。 - Tier 3: 手動修正 — autocorrect 非対応の Cop、または自動修正後に残った違反を、意味を変えない
範囲で 個別に直す。バッチにまとめた Cop(目安2〜3個)を続けて直してよいが、どの修正がどの
Cop 由来かコミットメッセージや差分から追えるように、Cop ごとに一区切りつけながら進める。
書き方はプロジェクトのコーディング規約に従う。
- メソッド抽出ではコメントの対応先も見直す。 ガード節・処理のまとまりを別メソッドへ切り出すと、 直前にあった説明コメントがテキスト上「たまたま近い」別メソッドの直前に取り残されることがある。 抽出後は各コメントを「テキスト上の直前行」ではなく「意味的に何を説明しているか」で読み直し、 対応するメソッドの直前に付け直す。
5. 仕様上やむを得ない違反は Exclude / 無効化する
修正がアプリ仕様上不適切な違反だけ、.rubocop.yml での Exclude / 無効化、またはコード側の
インライン # rubocop:disable で対応する。修正できるものは Tier 1〜3 で直し、ここに倒すのは
「直すと仕様が壊れる / その箇所には Cop の指摘が当てはまらない」ものに限る。
- できるだけ狭い範囲に限定する。特定ファイル/ディレクトリだけの
Excludeか、該当行だけの インライン# rubocop:disableを第一候補にし、Cop 全体のEnabled: falseはそのプロジェクトに 合わないと判断したときだけ。 - 必ず理由コメントを残す(記法はプロジェクトの規約に従う)。
- WHY: 「あえてチェックを外した」判断はコードにも差分にも現れにくい。理由が無いと、後から別の人 (や別の AI)が対応漏れと誤認して蒸し返したり、漫然と放置されたりする。
- 自明に直せるか無効化が妥当か 判断が割れるものはユーザーに相談 してから決める。
--auto時は相談で止まる代わりに、その違反には手を付けず残し、最終報告に「要判断」として 列挙する(手順 7)。Tier 1〜3 で自明に直せるもの・明確に Exclude/インライン disable 相当の ものは従来どおり自動で処理してよい。曖昧なものだけ人に残す。- WHY: Exclude / 無効化は「あえてチェックを外す」判断でコードにも差分にも現れにくく、誤ると後で
対応漏れと誤認されて蒸し返される。自動で倒すと責任の所在が曖昧になるため、
--autoでも ここだけは人に委ねる。 - 人に残した「要判断」の違反は、その Cop のエントリを削除したままにせず、手順 7 で
--auto-gen-configを実行して todo に拾わせ、見出しコメントに「要判断: <理由>」を一言 添える。 これにより違反が todo 上で「許容」され CI を壊さず、かつ次に見た人(や別の AI)が その Cop を素通りせず要判断状態だと気づける。- WHY: 手順 3 でエントリを削除した Cop に判断保留の違反が残ると、そのままでは todo にも 载っていない生の違反として CI で検出され続けてしまう。かといって黙って todo に戻すと 「もう解決済み」と誤認されて蒸し返されない。要判断である旨をコメントで残すことで、 両方の問題を同時に避けられる。
- WHY: Exclude / 無効化は「あえてチェックを外す」判断でコードにも差分にも現れにくく、誤ると後で
対応漏れと誤認されて蒸し返される。自動で倒すと責任の所在が曖昧になるため、
6. 検証する
- 経路A(safe バッチ)は手順 4 の実行結果をそのまま使う。 再実行不要。挙動を変えない前提なので 関連テストの実行も不要。
- 経路Bはバッチ対象の Cop に絞って再実行し、違反ゼロを確認する:
bundle exec rubocop --only <Cop1>,<Cop2>,...。 - サイクルの最後に、必ずプロジェクト全体で
bundle exec rubocop(--only無し、対象ファイル 指定も無し)を実行し、違反ゼロを確認する。 これがこのサイクルの完了条件であり、経路A・経路B 共通の最終ゲート。まだ todo に残っている(今回のサイクル対象外の)他 Cop の違反はinherit_from: .rubocop_todo.ymlで抑制されるため出てこない想定で、ここで検出される違反は todo に載っていない新規のものだけのはず。- WHY:
--only <Cop>や変更ファイルだけの実行では見えない副作用がある(例: autocorrect で不要な代入を消したらメソッド本体が空になりLint/Void等が新規発生する、 手順 5 の Exclude/無効化の書き方が構文として誤っている、など)。プロジェクト全体を通すことで 初めて「このサイクルで CI を壊していない」と言い切れる。 - 手順 5 で「要判断」の違反を残した場合は、その Cop をこの時点ではまだ todo に戻していない
(todo に戻すのは手順 7)。 そのままでは全体検証がその違反で失敗してしまうので、
要判断の Cop だけ手順 7 を先に済ませてから全体検証する(
--auto-gen-configで todo に 戻し「要判断」コメントを添えたあと、あらためて全体実行する)。 - それでも全体実行で違反が残っていたら、このサイクルは未完了として扱い、原因を調査してから
解消する。 想定される原因ごとの対応:
- autocorrect の副作用でスコープ外の Cop が新規違反を出した → その違反を Tier 1〜3
の要領でこのサイクル内に含めて直す(バッチの選定基準は、あくまで 選定時にどの Cop を
まとめて着手するかを縛るものであり、副作用の後始末まで対象を広げるかどうかを
縛るものではない)。手順4の autocorrect から
--onlyを外したことで、safe に直せる 連鎖違反はこの時点(autocorrect 実行時)で既に解消されている。ここで残るのは、safe に 直せなかった連鎖違反や、Exclude/無効化の設定ミスなど autocorrect では対応できない ものだけという役割分担になる。- ただし新規違反の発生箇所が適用済みマイグレーション等の「書き換えてはいけないファイル」 の場合は、コード修正ではなく Exclude / インライン disable に倒す(Tier 1〜3 の対象に 含めない)。適用済みマイグレーションはロールバック定義も含めて過去のスキーマ操作の記録 そのものであり、rubocop 違反の解消目的であっても書き換えると履歴と実際のDBスキーマが 乖離する。判断基準は references/cop-fix-guide.md の「Exclude のパス指定」参照。
- バッチから切り離した Cop のエントリを todo に戻し忘れている → 手順 4 の
とおり
--auto-gen-configで戻す。 - 手順 5 で Exclude / 無効化した設定が誤っている(YAML の書き方・対象範囲のミスなど)→ 設定を直す。
- autocorrect の副作用でスコープ外の Cop が新規違反を出した → その違反を Tier 1〜3
の要領でこのサイクル内に含めて直す(バッチの選定基準は、あくまで 選定時にどの Cop を
まとめて着手するかを縛るものであり、副作用の後始末まで対象を広げるかどうかを
縛るものではない)。手順4の autocorrect から
--auto時も原因調査と解消は省略しない。 確認ゲートを省くのは「進めてよいか」の 合意だけで、全体成功というゴール自体は--autoの有無に関係なく変わらない。
- WHY:
- Tier 2(unsafe)または手動修正でコードの挙動に触れた場合は、変更箇所に関連するテストだけを
そのプロジェクトの流儀で実行し、壊れていないことを確認する。バッチ内の複数 Cop をまとめて
1 回のテスト実行で検証してよい(Cop ごとに個別実行する必要はない。バッチは全 Cop が同じ
Tier =同程度のリスクという前提でまとめているので、変更ファイル全体に対して一度テストを
通せば十分)。
- 関連テストの絞り方:
git diff --name-onlyで変更ファイルを出し、対応する spec/test、修正した クラス/メソッドを使う箇所など、今回の差分が影響しうる範囲に限定して走らせる。全テストは 流さない(重いので CI に任せる)。 - 影響範囲が差分から自明でないほど広い場合のみ(例:
Metrics/*系をメソッド分割・クラス抽出して 呼び出し側が散る、1 Cop でも大量ファイルにまたがる修正)、変更したシンボルの利用箇所と対応する spec の洗い出しを 探索エージェントに委ねてよい。差分から関連 spec がすぐ辿れる通常ケースでは 不要(手間の方が勝つので、デフォルトは上記のgit diff起点の手動絞り込み)。 - WHY:
rubocopの pass はスタイルの整合しか見ない。unsafe autocorrect や手動修正は挙動を 変えうるので、関連テストを通して初めて「この変更で壊していない」と言える。全体の網羅は CI の 役割で、ここで毎回フルスイートを回すと 1 サイクルが重くなりレビュー単位の軽快さが失われる。
- 関連テストの絞り方:
7. todo を再生成して停止する
- 注意: ここでの再生成は「todo からエントリが消えて空いた分を綺麗にする」ためだけの操作。
手順 5 で決めた Exclude / 無効化の設定内容そのものは
.rubocop.ymlに書くのであって、--auto-gen-configの出力(.rubocop_todo.yml)に理由コメントを足して着地させるものではない。--auto-gen-configは実行のたびに Exclude/無効化していない残存違反を全部拾い直して.rubocop_todo.ymlを丸ごと作り直すため、.rubocop.yml側に書いた恒久設定と混同しないこと。 - 手順 5 で Exclude / 無効化した場合、その Cop の項目が
.rubocop_todo.ymlに残って紛らわしいのでbundle exec rubocop --auto-gen-configで作り直す。- 違反を全部修正しきった(Exclude/無効化していない)場合は、その Cop のエントリは手順 3 で既に 削除済みなので、再生成は必須ではない。todo の他項目の件数を更新したいときだけ実行する。
- バッチ(経路A・経路Bいずれも)から Cop を切り離した場合も、その Cop の項目は手順 3 で 削除済みなので再生成不要。切り離した Cop は改めて別サイクルで扱う。
- 手順 5 で「要判断」の違反を手を付けずに残した場合は、再生成が必須。
bundle exec rubocop --auto-gen-configを実行してその Cop を todo に戻したあと、生成された.rubocop_todo.ymlを自分で開いて(--auto-gen-configはコメントを自動で足してくれないので 手動編集する)、見出しコメントの直後に「要判断: <理由を一言>」を追記する。 (この todo 反映自体は手順 6 の全体検証より前に行う必要がある。手順 6 の該当箇所を参照。)- WHY: 手順 3 で todo エントリを削除済みのまま要判断の違反を放置すると、todo にも载らない生の 違反として CI を壊し続ける。再生成して todo に戻し、かつ「要判断」と分かるコメントを添える ことで、CI を壊さずに「解決済みではない」ことも伝わる。
- 1 サイクルが完了したらここで停止し、ユーザーに制御を返す。 差分確認・コミットはユーザーが行う。
- WHY: レビュー単位で運用するため。バッチはあくまで「1サイクルで扱える Cop 数を、Tier ごとの
リスクに見合う範囲で増やす」ものであり、複数サイクルを自動連続実行するものではない。
次を潰したいときは、ユーザーが改めてこのスキルを起動する。
--autoでもこの停止原則は 不変(--autoは「1サイクルを確認なしで回しきる」だけで「複数サイクル連続」ではない)。
- WHY: レビュー単位で運用するため。バッチはあくまで「1サイクルで扱える Cop 数を、Tier ごとの
リスクに見合う範囲で増やす」ものであり、複数サイクルを自動連続実行するものではない。
次を潰したいときは、ユーザーが改めてこのスキルを起動する。
--auto時の最終報告には次を含める(差分確認・コミット判断の材料になる):- 潰した Cop / バッチと結果(違反ゼロを確認した旨)。
-A(unsafe)を当てた場合はどの Cop に当てたか+手順 6 の関連テスト結果。- 手順 6 で見つかったスコープ外の新規違反(既存の「次回
--auto-gen-configで拾う todo 候補」報告に含める)。 - 手順 5 で残した「要判断」の違反一覧(自動で倒さず人に残したもの)。
8. 全 Cop を潰しきったら .rubocop_todo.yml 自体を削除する
- 手順 7 の結果、
.rubocop_todo.ymlに Cop のエントリが1つも残っていない(「要判断」で 戻した項目も無い)状態になったら、todo 運用そのものが不要になったとみなし、以下を行う。.rubocop_todo.ymlを削除する。.rubocop.ymlのinherit_fromから.rubocop_todo.ymlへの参照を削除する (他ファイルへの参照と併記されていた場合は、その1行だけを取り除き残りは維持する。inherit_fromが.rubocop_todo.yml単体だった場合はinherit_fromキー自体を削除する)。bundle exec rubocopを実行し、削除後も違反ゼロであることを確認する。- WHY:
.rubocop_todo.ymlは「未対応の違反を一時的に許容する」ための仕組み。中身が空になった まま放置すると、空ファイルと不要なinherit_from参照がプロジェクトに残り続け、次に見た人 (や別の AI)が「まだ何か許容されている違反があるのでは」と誤解する余地を残す。空になった 時点で撤去してしまえば、todo 運用が完了したことがファイル構成からも一目で分かる。
- 1つでも Cop エントリが残っている場合はこのステップを行わない。 手順 7 までで停止する (まだ消化中の todo を早まって消すと、残りの違反が生の違反として CI を壊す)。
- このステップも手順 7 までと同じサイクルの終端として扱い、削除できたらここで停止して
ユーザーに制御を返す(コミットはユーザーが行う)。
--auto時も削除の実行自体は他の safe な 自動処理と同様に確認なしで行ってよいが、削除した旨は最終報告に必ず含める。
注意点・つまずきやすいところ
- Tier をまたいでバッチにしない。 safe / unsafe / 手動修正は挙動変更のリスクが異なるので、 1 回のバッチは同じ Tier の Cop だけで構成する。
- バッチのしきい値・打ち切り基準は references/cop-fix-guide.md 参照。 経路A(safe)は件数ベースで最も広く、Tier 2(unsafe)はそれより狭い件数、Tier 3(手動修正)は 件数ではなく性質が近い少数の Cop、という基準の違いに注意する。
- safe と unsafe を区別する。
-a(safe)は基本そのまま信頼してよいが、-A(unsafe)は挙動が 変わりうる。-Aを当てたら手順 6 の関連テストを飛ばさない。逆に、ここで全テストを流す必要はない (重いので CI に任せ、手元では差分に関連するテストだけ確認する)。 - 検出は絞る/autocorrect は絞らない。 残違反の確認・検証(autocorrect を伴わない実行)は
--only <Cop>を付ける——まだ todo に残した他 Cop の違反が出力に混ざらず、潰したい Cop の 進捗が見やすくなる。一方 autocorrect(-a/-A)には--onlyを付けない——付けると 対象 Cop の修正が引き金で新規発生する別 Cop の違反(連鎖違反)が自動修正されずに残ってしまう。 todo が対象外 Cop の違反をマスクしてくれるので、絞らなくても安全(詳細は references/cop-fix-guide.md 参照)。さらに手順 6 最後の 全体検証は--onlyを付けず対象ファイル指定も無しで実行する(この検証の目的そのものが 「絞り込みでは見えない副作用が無いか」の確認なので、絞ってしまうと意味がない)。まとめると 3区分: 検出・検証=絞る/autocorrect=絞らない/全体検証=絞らない。 - サイクルの終端条件は「プロジェクト全体で
bundle exec rubocopが違反ゼロ」。 対象 Cop だけ潰して停止するのではなく、手順 6 の全体検証まで含めて初めてサイクル完了とみなす。 - 無効化は最小範囲+理由コメント。 Cop 全体を無効に戻すのは最後の手段。まず
Excludeで ファイル/ディレクトリ単位に絞れないか考える。 - コミットしない。 このスキルの責務は「選んだバッチを違反ゼロにして停止」まで。 コミット・PR はユーザーの手で。
- todo が空になったら消す。
.rubocop_todo.ymlの中身を全部潰しても、ファイル自体と.rubocop.ymlのinherit_from参照は自動では消えない。手順 8 で明示的に削除・参照解除まで 行う。
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
同じリポジトリのスキル
概要と使いどころ