本文へ移動
cccskills
無料GitHub で公開

copy-tuner-to-locales-cleanup

copy_tuner(CopyTuner / copy_tuner_client)の全 i18n キーを config/locales へ prefix 単位で移行し終えた後、 gem・初期化子・CI・deploy・ドキュメント・MCP 設定を一括撤去して copy_tuner 依存を完全に取り除くスキル。

prefix 単位の移行は copy-tuner-to-locales-migrate-prefix スキルで先に完了させておくこと。

インストール方法を見る

含まれるファイル(3)

  • SKILL.md9.8 KB
  • references/example-touchpoints.md7.1 KB
  • references/verification-final.md2.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

copy_tuner 撤去スキル(クリーンアップ)

copy-tuner-to-locales-migrate-prefix スキルで全 prefix を config/locales へ移行し終えた後に、 1 回だけ実行する。local_first_key_regexp が全キーを覆っている(= もう CopyTuner から引かれるキーが無い) ことを確認してから、gem・初期化子・CI・deploy・ドキュメント・MCP 設定をまとめて撤去する。

このスキルは特定のリポジトリに依存しない。固有値を覚えず、毎回リポジトリを探索して touchpoint を発見する。 種別ごとの典型的な在処は references/example-touchpoints.md を参照。

なぜ完了判定を関門にするのか

local_first_key_regexp でカバーできていない prefix が 1 つでも残ったまま gem を抜くと、その prefix のキーが config/locales に無く、一斉に未訳化する。だから「全キーが regexp にマッチしている」ことを gem 撤去前の 関門にする。判定には gem 自身の local_first_key? を使い、export した全キーを 1 件ずつ通す。

ワークフロー

1. 完了判定(関門)

CopyTuner の全キーが local_first_key_regexp にマッチする(= 全 prefix 移行済み)ことを確認する。

# 全件 export(一時ファイルへ。読み取り専用検証だが export は書き込むので捨て場へ)
bundle exec rake copy_tuner:export[tmp/copy_tuner_check.yml]

export YAML から locale を除いた全キーを取り出し、gem の判定そのもので 100% マッチを確認する:

bin/rails runner '
  require "yaml"
  data = YAML.load_file("tmp/copy_tuner_check.yml")
  locale = data.keys.first                      # 例: "ja"
  keys = []
  walk = ->(h, prefix) do
    h.each do |k, v|
      key = prefix.empty? ? k.to_s : "#{prefix}.#{k}"
      v.is_a?(Hash) ? walk.call(v, key) : keys << key
    end
  end
  walk.call(data[locale], "")
  unmatched = keys.reject { |k| CopyTunerClient.configuration.local_first_key?(k) }
  if unmatched.empty?
    puts "OK: 全 #{keys.size} キーが local_first_key_regexp にマッチ。cleanup へ進める。"
  else
    puts "STOP: 未マッチ #{unmatched.size} 件(未移行 prefix が残存)。migrate-prefix へ戻る。"
    puts unmatched.first(30)
  end
'

STOP が出たら cleanup を中止し、copy-tuner-to-locales-migrate-prefix で残 prefix を移行してから出直す。 OK のときだけ次へ進む。

NOTE: ここで export を実行できるのは gem がまだ入っているから。完了判定は gem 撤去より前に行う。

補助目印: migrate は prefix を移すたびにオリジナル(0000_original_*.yml)から該当サブツリーを削除するので、 全移行を経た場合は 0000_original_*.yml がほぼ空になっているはず(非表現値も migrate_prefix.rb が 移行分側の --out へ再適用済みで、オリジナル側に隔離ファイルとして残ることはない)。local_first_key? のマッチ判定が主の関門で、ファイルが空かどうかは副次的な目視確認。食い違うとき(regexp は全マッチなのに オリジナルに blurb 化できるキーが残っている等)は削除漏れを疑う。

2. 最終不正キーチェック

gem を抜く前の最終ゲートとして、全キーに不正がないことを確認する。

bundle exec rake copy_tuner:detect_conflict_keys
bundle exec rake copy_tuner:detect_html_incompatible_keys

両方が All success を出すこと。列挙された場合はそのキーが config/locales で壊れている可能性があるので、 migrate-prefix 側で配置を直してから戻る。

3. tt ヘルパーをアプリ側へ退避

copy_tuner_client はかつて ActionView の translate をフックする際に tt という独自エイリアスを生やして いた(シグネチャは tt(key, **options))。PR #122 で存在理由を喪失したため gem からは削除済みだが、過去の copy_tuner_client を使っていたアプリのビューに tt(...) 呼び出しが残っていると NoMethodError(テンプレートで 未定義ヘルパー)になる。gem を抜く前にアプリ側へ移しておく(既に gem 側に tt が無い場合も手順は同じ)。

  1. 利用箇所を洗い出す(残っていれば移行対象):

    git grep -nw tt -- app lib | grep -v 'attr\|http\|setting'   # 単語境界で tt のみ。誤検出は目視で除外
    
  2. アプリのヘルパー(app/helpers/application_helper.rb 等。全ビューから見える場所)に、非推奨警告付きで t に委譲するだけの tt を定義する。中身は t を呼ぶだけでよい(gem 撤去後は translate に copyray コメントが付かないので、tt と t は実質同義になる):

    # NOTE: copy_tuner_client が生やしていた tt ヘルパーの後方互換。gem 撤去で未定義になるため退避した。
    #       copyray コメント注入は廃止済みなので t と同義。新規コードでは t を使い、既存呼び出しは順次 t へ置換する。
    def tt(key, **options)
      ActiveSupport::Deprecation.new.warn('tt は非推奨です。t を使ってください。')
      t(key, **options)
    end
    

    NOTE: tt はビューヘルパーなので、コントローラ等から呼んでいないか手順 1 で必ず確認する。ビュー専用なら ApplicationHelper でよいが、別 namespace のヘルパーでしか使われていない場合はそのスコープに合わせる。

  3. (任意・推奨)tt( を t( へ機械置換して呼び出し自体を消すと、非推奨ヘルパーを残さずに済む。置換する場合は 引数がそのまま通る(tt(key, **options) → t(key, **options))。置換後は手順 1 の grep が 0 件になること。 置換しない場合は手順 2 のヘルパーを残し、警告ログで段階的に潰す。

4. 初期化子と gem を撤去

  1. 初期化子(config/initializers/copy_tuner.rb 等)を削除(local_first_key_regexp ごと消える)。
  2. Gemfile から copy_tuner 系 gem(copy_tuner_client, copy_tuner_client-mcp 等)を削除。
  3. bundle install で Gemfile.lock を再生成。

これで I18n バックエンドが gem 製(CopyTunerClient::I18nBackend)から Rails 標準に戻り、t() への copyray コメント注入も消える。あわせて config/environments/*.rb の i18n.fallbacks 等が gem に依存して いないか確認する(標準バックエンドでも挙動が変わらないこと)。

5. CI を撤去

リポジトリ探索で見つけた CI の copy_tuner 痕跡を削除する。典型的には:

  • copy_tuner 専用の deploy ワークフローファイル(main push で翻訳をデプロイする専用ファイル)… 丸ごと削除。
  • AI エージェント用ワークフローの mcp__copy-tuner__* allowedTools 許可 … 削除。
  • CI の「翻訳を export するステップ」… ここで削除する(git grep copy_tuner .github/ で確認)。

6. deploy / 起動スクリプトを撤去

  • deploy フックの rake copy_tuner:deploy(production 起動時に実行されるブロック)… 削除。
  • コンテナ起動スクリプトの rake copy_tuner:export フォールバック … 必ず削除。 gem 撤去後はこのタスク自体が消えており、残すとコンテナ起動が Don't know how to build task で落ちる。取りこぼし注意。

7. ドキュメント / スキル / MCP を撤去・方針最終化

方針ドキュメントが「copy_tuner で管理」や「移行中」のまま残ると、将来の作業者や AI が矛盾した行動を取る。 コードと方針を必ず揃える。

  • i18n 方針ドキュメント(CLAUDE.md・doc/ 配下等)を config/locales 管理に 最終化する。migrate-prefix が残した「移行中」の中間記述を、「config/locales で管理。copy_tuner は廃止。 新規キーは config/locales へ追加。複数形化不要」に確定する。モデル名・カラム名の例外規定も撤廃する (全キーがローカル化されたので例外は不要)。
  • copy_tuner 系スキル(.claude/skills/ 配下の copy_tuner 操作スキル)を無効化または削除する。
  • README.md の copy_tuner リンク・補助ドキュメント(「copy_tuner サーバで i18n 管理」記述を持つコマンド定義等) を修正する。
  • copy-tuner MCP server の接続設定(.mcp.json 等)を除去する。

8. 最終検証

references/verification-final.md の手順で、痕跡が残っていないか・gem が外れているか・テストが外部 API 接続なしで通るか・未訳が出ないかを確認する。

完了の目安

  • git grep -i 'copy.tuner\|copytuner\|CopyTunerClient'(vendor/tmp 除外)でアプリ側のヒットが無い。
  • 全翻訳キーが config/locales で解決し、translation missing が出ない。
  • テスト・Linter が通り、外部 API 接続なしで CI が完結する。
  • 方針ドキュメントが config/locales 管理に最終化され、「移行中」やモデル名・カラム名の例外記述が残っていない。

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

copy-tuner

無料日本語概要

このプロジェクトの i18n キー(翻訳)の参照・追加・更新・削除を行うスキル。i18n / 翻訳 / ロケール / `t` / `tt` / 翻訳キーに関わる操作のとき、および `config/locales` ディレクトリや `.yml` 翻訳ファイルを読む・参照する・編集するときは必ず使用すること。翻訳は原則 copy_tuner サーバで管理されており(一部キーのみ config/locales 管理)、素朴に config/locales を読むだけでは大半の翻訳が見つからず誤った判断をするため、必ずこのスキルの手順に従う。

SonicGarden/copy-tuner-ruby-client112026年10月6日 更新

copy_tuner(CopyTuner / copy_tuner_client)で集中管理している i18n データを、prefix(正規表現)単位で Rails 標準の config/locales(YAML)管理へ移すスキル。gem の local_first_key_regexp を使うので、 gem を残したまま特定 prefix だけをローカル管理にできる(部分ローカル化)。1 回の実行で 1 prefix。 全 prefix を移して gem ごと撤去したい場合は繰り返し、完了後 copy-tuner-to-locales-cleanup スキルへ進む。 対象 prefix はスキル引数で指定でき、未指定なら export を俯瞰して選定する。

SonicGarden/copy-tuner-ruby-client112026年10月6日 更新

copy-tuner-to-t-migrate

無料日本語概要

copy_tuner_client v2.0.0 への移行で、削除された独自ヘルパー tt の呼び出しを Rails 標準の t(translate)へ 置換するスキル。tt は PR #122 で存在理由を失い gem から削除されたため、残った tt(...) は NoMethodError に なる。大半は機械的に tt( → t( で済むが、訳文を文字列加工している箇所(→ I18n.t へ)と label 系ヘルパーの 第一引数に渡している箇所(→ 引数構造を分離)だけは別扱いで、開発環境のマーカートークン残留バグを避けるため 1 件ずつ確認する。対象は app 配下の .rb / .haml / .erb。

SonicGarden/copy-tuner-ruby-client112026年10月6日 更新

SonicGarden のスキルをすべて見る

このスキルの問題を報告する