一键导入
rubocop-todo-fix
.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | rubocop-todo-fix |
| description | .rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。 |
| disable-model-invocation | true |
| license | MIT |
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 をバッチにまとめる。rubocop -a → rubocop -A〈unsafe・要テスト〉→ 手動修正)でバッチを
処理する。同じ Tier のバッチはまとめて一度に適用・確認する。Exclude / 無効化に倒す。.rubocop_todo.yml を作り直して 停止する。.rubocop_todo.yml の生成そのものはしない(sgcop-setup の担当。本スキルは「生成済みを潰す」)。なぜこの形か: 既存違反を一度に全部直すと差分が巨大化してレビュー不能になる。「潰す → ユーザーが差分を確認してコミット → 次へ」というレビュー単位の運用にすると、変更の責任範囲が 把握しやすく、挙動が変わっても切り分けやすい。一方で 1 Cop ずつ処理すると、サイクル数 (起動〜レビュー〜コミットの往復)だけが無駄に増えてしまう。そこで Tier ごとに「レビューが 破綻しない範囲」を見極めてバッチ化する:safe autocorrect は挙動を変えないので件数ベースで 最も広く(目安100件)まとめられる。unsafe autocorrect は挙動が変わりうるので、それより 狭い件数(目安30件)に抑える。手動修正はさらに読み解きコストが件数に比例しないため、 件数ではなく「性質が近い少数の Cop(目安2〜3個)」という基準でまとめる。
--auto: 起動時にこの引数が渡されたら、1 サイクルをユーザー確認なしで回しきるモードに入る。
スキップするのは「進めてよいか」の確認ゲートだけで、それ以外の原則は一切変わらない:
--auto でも不変。複数サイクルの自動連続実行はしない。--auto でも勝手に決めない(手順 5 参照)。触らず残して報告する。--auto でも省かない。 unsafe autocorrect を無確認で当てる分、
関連テストが挙動変更を検知する唯一の安全網になるため、むしろ飛ばしてはいけない。--auto は呼び出し側がその判断を事前に委譲した状態、と位置づける。委譲できるのは
「自動で潰してよい」判断までで、曖昧な Exclude 判断や壊れたテストの承認までは委譲されない。-a)と unsafe autocorrect(-A)を区別する。 -A はコードの挙動を
変えうるので、適用後は変更箇所に関連するテストで検証する(手順 6。全テストは流さず CI に任せる)。
safe バッチはこの性質を利用して最も広い単位でまとめて処理する(切り離しルールは手順 4 参照)。.rubocop_todo.yml があるか確認する。sgcop-setup スキル、または直接
bundle exec rubocop --auto-gen-config で .rubocop_todo.yml を作ってから戻ってくるよう促す。.rubocop.yml の先頭に inherit_from: .rubocop_todo.yml があることも確認する
(--auto-gen-config が自動追記する。これが無いと todo が読まれない)。.rubocop_todo.yml の各 Cop 見出しコメントにある # Offense count: N と autocorrect 対応状況を読み、
候補を提示する。経路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 参照)。
Metrics/MethodLength と Metrics/AbcSize のように同じ箇所に重なって出る Cop)でまとめる。
手動修正は1件ごとの読み解きコストが件数に比例しないため、件数上限より「レビュアーが
1つの意図として読める Cop の組み合わせか」を基準にする。.rubocop_todo.yml から削除するrubocop が再びその違反を報告する状態になる。経路A(safe バッチ)
--only を付けずに一括で rubocop -a を当てる: bundle exec rubocop -a。
--only を外すのは、ある Cop の修正が引き金で新規発生する別 Cop の違反(連鎖違反)まで
一括で自動修正するため(詳細は references/cop-fix-guide.md 参照)。
--only なしのこの1回の実行結果(残った offense の一覧)が、そのまま残違反判定と手順6
最終検証を兼ねる(連鎖違反まで含めて検証される)。bundle exec rubocop --auto-gen-config
で todo に戻しておく。 戻さずに放置すると、todo に載らない生の違反として残り、
手順 6 のプロジェクト全体検証が通らなくなる。経路B(unsafe/手動修正のバッチ、Tier 順)
references/cop-fix-guide.md に従い、上から順に試す。各 Tier で違反が
残ったら次の Tier へ進む。Tier 2・Tier 3 ともバッチ全体に一括で適用し、一部の Cop だけ残った・
テストで問題が出た場合はその Cop だけバッチから切り離す(経路Aの切り離しルールと同じ考え方。
切り離した Cop は --auto-gen-config で todo に戻し、別サイクルとして扱う)。
rubocop -a(safe autocorrect) — 挙動を変えない安全な自動修正。まずこれを試す。
autocorrect は絞らない: bundle exec rubocop -a(--only は付けない。連鎖違反を
取りこぼさないため)。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 を当ててどのテストが
落ちたかを報告する。修正がアプリ仕様上不適切な違反だけ、.rubocop.yml での Exclude / 無効化、またはコード側の
インライン # rubocop:disable で対応する。修正できるものは Tier 1〜3 で直し、ここに倒すのは
「直すと仕様が壊れる / その箇所には Cop の指摘が当てはまらない」ものに限る。
Exclude か、該当行だけの
インライン # rubocop:disable を第一候補にし、Cop 全体の Enabled: false はそのプロジェクトに
合わないと判断したときだけ。--auto 時は相談で止まる代わりに、その違反には手を付けず残し、最終報告に「要判断」として
列挙する(手順 7)。Tier 1〜3 で自明に直せるもの・明確に Exclude/インライン disable 相当の
ものは従来どおり自動で処理してよい。曖昧なものだけ人に残す。
--auto でも
ここだけは人に委ねる。--auto-gen-config を実行して todo に拾わせ、見出しコメントに「要判断: <理由>」を一言
添える。 これにより違反が todo 上で「許容」され CI を壊さず、かつ次に見た人(や別の AI)が
その Cop を素通りせず要判断状態だと気づける。
bundle exec rubocop --only <Cop1>,<Cop2>,...。bundle exec rubocop(--only 無し、対象ファイル
指定も無し)を実行し、違反ゼロを確認する。 これがこのサイクルの完了条件であり、経路A・経路B
共通の最終ゲート。まだ todo に残っている(今回のサイクル対象外の)他 Cop の違反は
inherit_from: .rubocop_todo.yml で抑制されるため出てこない想定で、ここで検出される違反は
todo に載っていない新規のものだけのはず。
--only <Cop> や変更ファイルだけの実行では見えない副作用がある(例:
autocorrect で不要な代入を消したらメソッド本体が空になり Lint/Void 等が新規発生する、
手順 5 の Exclude/無効化の書き方が構文として誤っている、など)。プロジェクト全体を通すことで
初めて「このサイクルで CI を壊していない」と言い切れる。--auto-gen-config で todo に
戻し「要判断」コメントを添えたあと、あらためて全体実行する)。--only を外したことで、safe に直せる
連鎖違反はこの時点(autocorrect 実行時)で既に解消されている。ここで残るのは、safe に
直せなかった連鎖違反や、Exclude/無効化の設定ミスなど autocorrect では対応できない
ものだけという役割分担になる。
--auto-gen-config で戻す。--auto 時も原因調査と解消は省略しない。 確認ゲートを省くのは「進めてよいか」の
合意だけで、全体成功というゴール自体は --auto の有無に関係なく変わらない。git diff --name-only で変更ファイルを出し、対応する spec/test、修正した
クラス/メソッドを使う箇所など、今回の差分が影響しうる範囲に限定して走らせる。全テストは
流さない(重いので CI に任せる)。Metrics/* 系をメソッド分割・クラス抽出して
呼び出し側が散る、1 Cop でも大量ファイルにまたがる修正)、変更したシンボルの利用箇所と対応する
spec の洗い出しを 探索エージェントに委ねてよい。差分から関連 spec がすぐ辿れる通常ケースでは
不要(手間の方が勝つので、デフォルトは上記の git diff 起点の手動絞り込み)。rubocop の pass はスタイルの整合しか見ない。unsafe autocorrect や手動修正は挙動を
変えうるので、関連テストを通して初めて「この変更で壊していない」と言える。全体の網羅は CI の
役割で、ここで毎回フルスイートを回すと 1 サイクルが重くなりレビュー単位の軽快さが失われる。.rubocop.yml に書くのであって、
--auto-gen-config の出力(.rubocop_todo.yml)に理由コメントを足して着地させるものではない。
--auto-gen-config は実行のたびに Exclude/無効化していない残存違反を全部拾い直して
.rubocop_todo.yml を丸ごと作り直すため、.rubocop.yml 側に書いた恒久設定と混同しないこと。.rubocop_todo.yml に残って紛らわしいので
bundle exec rubocop --auto-gen-config で作り直す。
bundle exec rubocop --auto-gen-config を実行してその Cop を todo に戻したあと、生成された
.rubocop_todo.yml を自分で開いて(--auto-gen-config はコメントを自動で足してくれないので
手動編集する)、見出しコメントの直後に「要判断: <理由を一言>」を追記する。
(この todo 反映自体は手順 6 の全体検証より前に行う必要がある。手順 6 の該当箇所を参照。)
--auto でもこの停止原則は
不変(--auto は「1サイクルを確認なしで回しきる」だけで「複数サイクル連続」ではない)。--auto 時の最終報告には次を含める(差分確認・コミット判断の材料になる):
-A(unsafe)を当てた場合はどの Cop に当てたか+手順 6 の関連テスト結果。--auto-gen-config で拾う todo 候補」報告に含める)。.rubocop_todo.yml 自体を削除する.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 を実行し、削除後も違反ゼロであることを確認する。.rubocop_todo.yml は「未対応の違反を一時的に許容する」ための仕組み。中身が空になった
まま放置すると、空ファイルと不要な inherit_from参照がプロジェクトに残り続け、次に見た人
(や別の AI)が「まだ何か許容されている違反があるのでは」と誤解する余地を残す。空になった
時点で撤去してしまえば、todo 運用が完了したことがファイル構成からも一目で分かる。--auto 時も削除の実行自体は他の safe な
自動処理と同様に確認なしで行ってよいが、削除した旨は最終報告に必ず含める。-a(safe)は基本そのまま信頼してよいが、-A(unsafe)は挙動が
変わりうる。-A を当てたら手順 6 の関連テストを飛ばさない。逆に、ここで全テストを流す必要はない
(重いので CI に任せ、手元では差分に関連するテストだけ確認する)。--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 の全体検証まで含めて初めてサイクル完了とみなす。Exclude で
ファイル/ディレクトリ単位に絞れないか考える。.rubocop_todo.yml の中身を全部潰しても、ファイル自体と
.rubocop.yml の inherit_from 参照は自動では消えない。手順 8 で明示的に削除・参照解除まで
行う。