一键导入
herb-enable-rule
herb-lint (.herb.yml で enabled: false のルール) を1つ有効化する手順。「herb のルールを有効化して」「herb-lint の <ルール名> を on にして」などと言われたら必ず使う。herb-lint 以外の linter には使わない。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
herb-lint (.herb.yml で enabled: false のルール) を1つ有効化する手順。「herb のルールを有効化して」「herb-lint の <ルール名> を on にして」などと言われたら必ず使う。herb-lint 以外の linter には使わない。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
GitHub PRのレビューコメントのうち、Hide・解決済みでないものだけを抽出して対応する。
Commit, push, and create or update a PR
GitHub Actions の CI 失敗を、失敗ジョブの特定 → ログからの原因抽出 → 原因分類 → ローカル再現 → 修正 → 検証まで体系的に進めるスキル。特に、失敗ログのノイズに埋もれて原因が見えないとき、環境依存でフレーキーに落ちているときに役立つ。修正に人の判断が必要な場合は、対話モードでは確認して中断し、--non-interactive 指定時はPRにコメントを投稿して中断する。
`bundle exec erblint app` の既存違反をファイル単位で無効化する todo ファイル群 (`.erb_lint_todo.yml` / `.erb-lint-rubocop-todo.yml`)を生成・初期化する手順。手動起動専用 (`/erblint-todo-init`)。todo を作り直したいときなど、一回性のセットアップ作業でのみ使う。 rubocop 単体・haml-lint・herb-lint の運用には使わない。
プランモードで作成したプランファイル(Markdown)の内容に沿って実装を行う。実装フェーズを軽量なsonnetモデルで実行し、コスト・速度を最適化する。引数でプランファイルのパスを指定できる。省略時は直近のセッションログから対象プランを自動特定してユーザーに確認する。コミット・push・PR作成は、プランに明記されている場合のみ実施する。
APM パッケージ由来ルール(.claude/rules/*.md)と重複するプロジェクト固有ローカルルール (.apm/instructions/*.local.instructions.md)を検出し、ローカル側を削除・縮小する。未管理ルールの 新規移行は行わない(それは migrate-rules-to-apm の役割)。手動実行専用(自動トリガーしない)。
| name | herb-enable-rule |
| description | herb-lint (.herb.yml で enabled: false のルール) を1つ有効化する手順。「herb のルールを有効化して」「herb-lint の <ルール名> を on にして」などと言われたら必ず使う。herb-lint 以外の linter には使わない。 |
| license | MIT |
herb-lint 導入時、既存ERBで違反が出たルールを .herb.yml で一旦すべて
enabled: false にし、**「違反を解消したルールから順次再有効化する」**方針を取っているプロジェクトを対象とする。
.herb.yml に enabled: false のルールが残っており、ERBビューの修正を進めながら1つずつ有効化していく構成であることが前提。
このスキルは、無効化中のルールを1つ選んで有効化する繰り返し作業を、毎回同じ品質で正確に行うためのもの。 肝は 「自動修正で素直に直せるものは直し、機械的共通化が可読性・意味を損なうものは無理に直さず exclude する」 という振り分けの判断にある。ルールを有効化して違反を全部潰すのではなく、そのルールの趣旨に照らして 正しい状態にするのがゴール。
.erb のみ。Haml は haml-lint、埋め込みRubyの品質は erb_lint が担当(.herb.yml 冒頭参照)。error だが、「分岐の重複タグ」のように
中身が違うケースは hint レベルになることがある。CI(herb_lint ワークフロー)は
pnpm exec herb-lint app/views --github --no-color を --fail-level 指定なし(=error)で実行するため、
hint/warning は CI を素通りしてアノテーション表示されるだけ。だがプロジェクト方針は
「違反0で有効化」なので、検証は必ず --fail-level hint まで上げて0件を確認する。.herb.yml のある
ディレクトリ=リポジトリルートからの相対パス」に正規化して照合する。よって exclude パターンは
app/views/... 形式のリポジトリ相対で書く。検証時に -c で外部ディレクトリの config を渡すと
この基準がずれて exclude が効かないので、効き目の最終確認は必ずプロジェクトルートの実 .herb.yml で行う。--fix は安全に直せるものだけ自動修正する。分岐の外にタグを出せる単純なケースは直すが、
分岐内に複数要素・追加要素があるケースは触らない(壊さないための保守的な挙動)。この性質が
そのまま「自動修正で潰す/exclude する」の振り分け材料になる。exclude: を書くと、そのルールが enabled: true のまま特定ファイルだけ無効化できる。
enabled: false を消すだけで有効化され、ルールキー自体は exclude を持たせるため残す。ユーザーがルール名を指定していなければ、.herb.yml の enabled: false 一覧から
リスクの低いルールを優先して提案し、ユーザーに確認する。
リスクの低いルールの判断基準(優先順):
erb-strict-locals-comment-syntax、html-no-self-closinghtml-img-require-alt、erb-no-interpolated-class-nameserb-no-unused-expressions、erb-no-output-in-attribute-position、
actionview-strict-locals-partial-onlyそのルールだけを有効化した検証用 config をスクラッチパッドに作る。実 .herb.yml をコピーし、
対象ルールの enabled: false 行を削除(=有効化)した版を用意するのが手軽で安全。
これで違反を一覧する:
# 検証用 config(対象ルールだけ有効)で違反を抽出。--simple が読みやすい
pnpm exec herb-lint app/views -c <scratchpad>/.herb.test.yml --no-color --no-timing --simple 2>&1 \
| grep '<rule-name>'
違反がどのファイル・何件かを把握する。ファイルごとの件数は次で出せる:
pnpm exec herb-lint app/views -c <scratchpad>/.herb.test.yml --no-color --no-timing --simple 2>&1 \
| awk '/^app\/views/{f=$0} /<rule-name>/{print f}' | sort | uniq -c
注意: ディレクトリ走査時と単一ファイル指定時で件数表示が変わることがある。件数の絶対値より 「どのファイルにどんな違反があるか」を正として進める。
--fix の挙動でファイルを振り分ける実ファイルを汚さずに自動修正の結果を確認するため、対象ファイルをスクラッチパッドにコピーしてから
--fix を試す:
mkdir -p <scratchpad>/fixtest && cp <違反ファイル群> <scratchpad>/fixtest/
cp <scratchpad>/.herb.test.yml <scratchpad>/fixtest/.herb.yml
pnpm exec herb-lint "<scratchpad>/fixtest/**/*.erb" -c <scratchpad>/fixtest/.herb.yml --fix --no-color --no-timing
# 元ファイルと diff して、何がどう直ったかを見る
diff <元ファイル> <scratchpad>/fixtest/<同名>
結果を読んで各ファイルを次の3つに振り分ける:
--fix の結果がそのまま意図通り(例: 共通タグが分岐外に出て中身だけ分岐に残る)。
これは実ファイルに --fix を適用して潰す。--fix が触らない / 中途半端に残る → 分岐ごとに要素数・追加要素・出力先が違うなど、
機械的共通化が意味的に壊す or 可読性を下げるケース。これは exclude 候補。判断基準は「機械的共通化がそのビューの可読性・意味を損なうか」。損なうなら exclude が正しい。
自動修正で潰すファイルに --fix を適用し、lint-staged と同じ整形を続けて当てる
(コミットフックでの再整形による差分を防ぐ)。
まず lint-staged の設定(package.json の "lint-staged" キー、または .lintstagedrc 等)を確認し、
ERB ファイルに対して実行されるツールを把握する。一般的には以下のようなコマンドが含まれる:
pnpm exec herb-lint <該当ファイル> --fix
# lint-staged に含まれる場合のみ実行する(プロジェクトによって異なる):
bundle exec erb_lint -a <該当ファイル>
bundle exec htmlbeautifier --keep-blank-lines 1 <該当ファイル>
修正後は必ず差分を目視し、意味(翻訳キーの出し分け・条件分岐など)が壊れていないか確認する。
.herb.yml を編集してルールを有効化する対象ルールの enabled: false を削除する。exclude 対象がある場合はルールキーを残して exclude: を持たせ、
各除外パスの行末に理由を一言書く(理由をパスと同じ行に置くと情報が一箇所に集約され、別ブロックでの
ファイル名重複も避けられる)。
# 機械的共通化が不適切なビューのみ除外(各行に理由を記載)
<rule-name>:
exclude:
- 'app/views/path/to/foo.html.erb' # 除外理由を一言
- 'app/views/path/to/bar.html.erb' # 除外理由を一言
exclude が不要(全違反を修正で潰せた)なら、enabled: false を消すだけ。既存の違反0ルールに倣い、
ルールキーごと削除してもよい。
プロジェクトルートの実 .herb.yml(編集後)で、CI と同条件+hint まで含めた厳しめ判定の両方を通す:
# CI と同条件(fail-level=error)。exit 0 を確認
pnpm exec herb-lint app/views
# hint/warning も拾う厳しめ判定。ここで 0 offenses を確認するのが本番
pnpm exec herb-lint app/views --fail-level hint
確認ポイント:
--fail-level hint で 0 offenses / all files clean / exit 0。Rules: N enabled | M not enabled | ... で not enabled が1減っている
(対象ルールが有効側に移った証拠)。--fail-level hint を回すと当該ファイルの違反が再出現する → 戻す。git diff .herb.yml <修正したビュー> で意図した変更のみであることを確認。変更内容をユーザーに報告し、コミットはユーザー自身が行う。自動でコミットしない。
履歴のスタイルに倣ったコミットメッセージ例を提示するにとどめる:
fix: <何をどう修正したか> し herb-lint <rule-name> を有効化
自動修正と exclude の設計判断が混じる場合は、本文に「なぜ exclude したか/何を共通化したか」を書く。
例: fix: 分岐の重複タグを共通化し herb-lint erb-no-duplicate-branch-elements を有効化
**/ の広いグロブでまとめない。同名ファイルへ誤って効いたり、意図しないファイルまで
ルールから外れる。対象を一意に絞れるリポジトリ相対の完全パスで書く。--fail-level hint で0を確認するまで完了としない。<%# herb:disable %> を第一選択にしない。ネストしたタグ(tr>th>td 等)では各行に必要で
ビューが汚れる。ファイル単位で外したいなら .herb.yml の rule 単位 exclude の方がクリーンで、
除外理由も一箇所に集約できる。
<%= tag.name %> を HTML タグ <name> と誤認識)で、誤検知が1行に閉じていて
他に違反のないファイルなら、ファイル全体を exclude するより行単位 disable の方が影響範囲が狭い。
inline disable は公式仕様どおり
対象行の末尾に <%= ... %><%# herb:disable <rule-name> %> で置く(前行に置くと効かず
herb-disable-comment-unnecessary 違反になる)。.herb.yml でルールを有効化した後に行う。有効化前に検証すると、
対象ルールが無効なので「違反が無いのに disable がある」と判定され herb-disable-comment-unnecessary
が逆に発火し、検証が破綻する。手順4(.herb.yml 編集)を済ませてから手順5の検証に進むこと。