.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
中文简介正在准备中。当前显示原文说明。
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 を作り直す。
中文简介正在准备中。当前显示原文说明。
查看安装方法安装前可以查看交给 AI 代理的指令内容。
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 件と分かったら、ファイルの有無を気にせずそのままサマリに進む。还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
.rubocop_todo.yml に残った違反を段階的に潰すスキル。safe autocorrect だけで完結する Cop はまとめてバッチで、unsafe autocorrect や手動修正が必要な Cop もリスクに応じた単位でバッチにまとめて潰す。
中文简介正在准备中。当前显示原文说明。