rubocop-todo-fix
Free.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
The English summary is being prepared. Showing the original description.
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 を作り直す。
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
sgcop(SonicGarden 標準の RuboCop 設定・カスタム Cop を提供する Gem)を、導入先の Rails/Ruby プロジェクトにセットアップするためのスキル。このスキルは sgcop gem 本体ではなく、 sgcop を使う側のプロジェクトで実行される。
inherit_gem を整える。strict を選べば、汎用 Cop と
カスタム Cop(Sgcop/*)がまとめて有効化される。.rubocop.yml から sgcop と重複・冗長な設定を削除する(承認のうえ)。Sgcop/Enumerize* など、strict でもコメントアウトのまま)は、
対象 gem を使っているときだけ確認して有効化する。rubocop --auto-gen-config で .rubocop_todo.yml を生成し、実際の違反(ノイズ)量を見る。Exclude / 段階対応 / -a 自動修正)。
無効化・Exclude したら todo を作り直す。.rubocop.yml に意図的に明示設定されている Cop
(sgcop と異なる値の上書き)は尊重してスルーする。なぜこの形か: sgcop の基本導入は inherit_gem 1 行で済み、判断が分かれる便利 Cop(カスタム +
実績ある推奨汎用)は strict 設定が 1 ファイルにまとめている。だから「1 つずつ確認」より
「方針を決めて strict を一括適用 → --auto-gen-config で実際のノイズを見て、多い Cop だけ調整」の
方が速く、判断も机上でなく実データに基づく。推奨 Cop のリストはスキルに持たず、sgcop 本体の
strict 設定を唯一の出典にする(保守の一元化)。
config/default.yml 内の Cop 名(YAML キー)をそのまま使う。特に RSpec 系は
Sgcop/Rspec/...(Rspec 表記、README の RSpec とは違う)なので、必ず実ファイルの
キーをコピーすること。.rubocop.yml のキーが gem 側と食い違うと設定が効かない。Rails か純 Ruby かを判定し、inherit_gem の参照先(標準 / strict)の候補を決める。実際にどちらを
書き込むかは手順 3 の方針確認で決まる。純 Ruby の場合はさらに RSpec を使っているかも判定する
(Gemfile の rspec/rspec-core、spec/spec_helper.rb の有無などで判定できる)。
config/application.rb の有無、Gemfile / gemfile.lock の rails 行、bin/rails など。rails/rubocop.yml / strict rails/rubocop_strict.yml
(RSpec 関連設定は内部で ruby/rubocop_rspec.yml を継承しているので追加指定は不要)ruby/rubocop.yml / strict ruby/rubocop_strict.yml[ruby/rubocop.yml, ruby/rubocop_rspec.yml] /
strict [ruby/rubocop_strict.yml, ruby/rubocop_rspec_strict.yml](配列で複数ファイルを指定)Gemfile に sgcop があるか確認する。なければ次を案内し、ユーザーに bundle install を促す:
gem 'sgcop', github: 'SonicGarden/sgcop', branch: 'main'
(sgcop が入っていないと後段の動的取得ができないので、ここは先に解決する).rubocop.yml の有無と中身を確認する。ここでは書き込まない。
inherit_gem を実際に書くのは手順 3(方針確認後)。新規プロジェクト判定(.rubocop.yml が無い、
または中身がほぼ空)かどうかを覚えておき、手順 3 の推奨に使う。sgcop には 2 段階の設定がある。これを最初に選んでもらう(これが最初の分岐点):
rubocop.yml): SonicGarden 標準スタイル。デフォルト無効のカスタム Cop や推奨汎用 Cop は
入らない。rubocop_strict.yml): 標準に加え、推奨汎用 Cop(Layout/*, Style/*, Rails/* の一部)と
デフォルト無効カスタム Cop(Sgcop/*)をまとめて有効化する。inherit_gem 1 行で全部入る。推奨の出し方を新規 / 既存で変える:
.rubocop.yml が無い/ほぼ空と判定)→ strict を推奨。最初から
統一感を効かせられ、後から個別有効化する手間がない。--auto-gen-config で段階導入
できる)」を一言添える。AskUserQuestion で「strict 一括 / 標準」を選ばせる。選んだ参照先:
rails/rubocop_strict.yml / 標準 rails/rubocop.ymlruby/rubocop_strict.yml / 標準 ruby/rubocop.yml[ruby/rubocop_strict.yml, ruby/rubocop_rspec_strict.yml] /
標準 [ruby/rubocop.yml, ruby/rubocop_rspec.yml]選んだ参照先で .rubocop.yml の inherit_gem を整える。何を書いたかを一言報告する:
inherit_gem を追加。inherit_gem ブロックはあるが sgcop 参照が無ければ追記。inherit_gem:
sgcop: rails/rubocop_strict.yml # 標準なら rails/rubocop.yml
純 Ruby + RSpec の場合は配列で複数ファイルを指定する:
inherit_gem:
sgcop:
- ruby/rubocop_strict.yml
- ruby/rubocop_rspec_strict.yml # 標準なら ruby/rubocop.yml, ruby/rubocop_rspec.yml
inherit_gem と同時に inherit_mode: merge: [Exclude] も設定する。.rubocop.yml 編集時に
inherit_gem ブロックの直前にこのブロックを追加すればよい(無ければ追加、既にあれば merge
に Exclude が入っているか確認し、他のキー(Include 等)があれば残したまま Exclude を
追記する):
inherit_mode:
merge:
- Exclude
理由: RuboCop はデフォルトで、利用側 .rubocop.yml(および手順 6 で生成する
.rubocop_todo.yml)が個別 Cop に Exclude を書くと、継承元(sgcop gem・RuboCop 本体)が
同じ Cop に持つ Exclude を配列ごと丸ごと上書きする(rubocop#9983、
not planned)。特に .rubocop_todo.yml は --auto-gen-config(手順 6)が違反のあった Cop に
機械的に Exclude を書き込むため、この上書きを高確率で踏む。ここで inherit_mode: merge を
先に設定しておけば、手順 6 以降で .rubocop_todo.yml や手順 7 の Exclude 追記があっても、
継承元の Exclude(config/initializers/* など)が消えずに残る。
既存プロジェクトで後から気づいて追加した場合は、bundle exec rubocop --show-cops <Cop名> を
実行し、継承元由来の Exclude(例: config/application.rb, config/initializers/* など)と
.rubocop_todo.yml 由来の Exclude(例: db/migrate/*)の両方が含まれているか確認する。
既存プロジェクトでは、sgcop 導入前に書いた設定が .rubocop.yml に残り、sgcop 側と重複している
ことが多い。これを掃除する。
bundle show sgcop # または: bundle info sgcop --path
rails/rubocop_strict.yml(→ rubocop.yml → ../ruby/rubocop.yml、
さらに ../ruby/rubocop_strict.yml, ../ruby/rubocop_rspec_strict.yml)や、純 Ruby なら
ruby/rubocop_strict.yml(+ RSpec 使用時は ruby/rubocop_rspec_strict.yml)の継承チェーンを辿る。rails/rubocop.yml(→ ../ruby/rubocop.yml, ../ruby/rubocop_rspec.yml)等。.rubocop.yml(および自前で inherit_from している設定があればそれも)と突き合わせ、
次を重複・冗長候補として洗い出す:
Enabled: true で再宣言しているだけのもの。strict を選んだ場合、カスタム Cop(Sgcop/*)の大半は一括で有効化済み。ここで残るのは
gem 依存で strict でもコメントアウトのままにしてある Cop の判断だけ。
Sgcop/EnumerizeDefaultOption / Sgcop/EnumerizePredicatesOption → Gemfile に enumerize が
あるか軽くチェック。
Sgcop/EnumerizePredicatesOption は AllowWithPrefix(デフォルト false、
predicates: { prefix: true } を許可したいなら true)も提示する。有効化する場合、.rubocop.yml に追記するキーは gem 側 config/default.yml と完全一致させる
(特に Sgcop/Rspec/... 表記に注意):
Sgcop/EnumerizePredicatesOption:
Enabled: true
AllowWithPrefix: false
ここからがこのスキルの主役。机上で Cop の是非を聞くのではなく、実際にどれだけ違反が出るかを見る。
bundle exec rubocop --auto-gen-config を案内/実行する。これで .rubocop_todo.yml が生成され、
.rubocop.yml の先頭に inherit_from: .rubocop_todo.yml が自動追記される(inherit_gem と共存する)。
実行できない場合(ネットワーク遮断・gem 未解決などで bundle install/rubocop 自体が動かせない
環境)は、無理に実行せず「未実行・未検証」と明示したうえで、想定される結果を参考情報として述べる
にとどめる。実行不能を隠して確定的な件数を報告しない。.rubocop_todo.yml の各 Cop の見出しコメントに
# Offense count: N が入っている)。これが次の手順の調整対象。.rubocop_todo.yml で違反件数が突出して多い Cop を抽出し、Cop ごとに AskUserQuestion で扱いを聞く。
判断材料(その Cop が何をチェックするか・なぜ違反が多いか)を 1 行添える。選択肢:
.rubocop_todo.yml で許容し、新規コードだけ
縛る。README「しつけ方」の標準的なやり方。rubocop -a / -A で一括自動修正: 自動修正に対応した Cop(Layout/*, Style/HashSyntax など多く)
なら、無効化する前にまずこれを提示する。修正後は todo から消える。Exclude で限定: 特定ディレクトリ(db/, spec/, 生成コード等)だけ除外。
前提: 手順 3 で inherit_mode: merge: [Exclude] が設定済みであること(未設定なら先に
手順 3 に戻って設定する)。設定されていない状態で Exclude を追記すると、継承元(sgcop・
RuboCop 本体)が同じ Cop に持つ Exclude を上書き消去してしまう。.rubocop.yml で Enabled: false): プロジェクト方針に合わない Cop のみ。無効化・Exclude を選んだら、その設定を .rubocop.yml に追記する。
手順 7 で Cop を無効化 / Exclude した場合、その Cop の項目が .rubocop_todo.yml に残り続けて
紛らわしいので、bundle exec rubocop --auto-gen-config を再度案内し .rubocop_todo.yml を作り直す。
(自動修正や「todo に残す」だけを選んだ場合は再生成は不要。)
最後に次を一覧で報告する:
inherit_gem の参照先inherit_mode: merge: [Exclude] の設定状況(既存だったか今回追加したか).rubocop_todo.yml に段階対応として残した違反の規模(件数や主な Cop)そして、todo を段階的に潰していく運用(README「しつけ方」の方針)を案内する。
inherit_mode を先に設定する: inherit_gem(手順 3)を整えたら、inherit_mode: merge: [Exclude] も同時に設定する。これが無いと、.rubocop_todo.yml(手順 6)や手順 7 の Exclude
追記が継承元の Exclude を配列ごと上書き消去してしまう(rubocop#9983)。既存プロジェクトへの
導入では特に見落としやすいので、手順 3 の時点で確認する。bundle show sgcop が失敗する。手順 2 で導入を
確実にしてから手順 4 以降に進む。動的取得できないときは references/disabled-cops.md をフォールバックに
使い、その旨をユーザーに伝える。.rubocop.yml に書くキーは gem 側 config/default.yml のキーと 1 文字単位で
一致させる。食い違うと RuboCop が「未知の Cop」として無視する/警告を出す。.rubocop_todo.yml の Offense count に基づく。机上で
「たぶん違反が多い」と推測せず、生成された todo の実数で話す。.rubocop_todo.yml は生成されない: これは RuboCop 自体の挙動であり、空ファイルを
手動で作る必要はない。手順 6 で 0 件と分かったら、ファイルの有無を気にせずそのままサマリに進む。No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
The English summary is being prepared. Showing the original description.