A
AIエージェントの仕組み
ch6-s2 · ReAct Pattern

ReAct パターン

約 15 分

09-02. ケース 2: 反復的なリファクタリングの自動化

シチュエーション

コードベース内の 同じパターン(古い API 呼び出し → 新しいもの、命名規約変更、型注釈追加など)を 50 ファイル超 に渡って適用したい。 例: - from old_module import Xfrom new_module import X に - すべてのテスト関数に @pytest.mark.unit デコレータを追加 - print(...)logger.info(...) に置換(ただし context 依存で残すべき箇所もある)

Before (Claude Code を使わない場合)

After (Claude Code を使う場合)

Claude に「3 段階」で頼む:
  1. 該当箇所を全部リスト化させる
  2. 1 ファイルだけ変更してテストを通す(パイロット)
  3. 残りを順次変更、各 commit で必ずテスト
30 分〜数時間で完了、テスト保証付き

必要な道具立て

機能 何のために
CLAUDE.md テスト・ビルドコマンド明記 (make test, pytest)
Hook: PostToolUse (Edit/Write 後) 自動で pytest -x を走らせ、失敗したら次の編集をブロック
Skill: refactor-pattern リファクタの手順を Claude に守らせる

CLAUDE.md 必須セクション例

## テストとリンタ
- すべての変更後: `pytest -x` (失敗したら止まる)
- 型チェック: `mypy src/`
- フォーマッタ: `ruff format`

## このリポジトリのリファクタ規約
- 1 commit = 1 リファクタタイプ。混ぜない
- import の順序は isort 規約
- print → logger 置換時、テストコード内の print は対象外

Hook 設定 (.claude/settings.json)

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "pytest -x --quiet 2>&1 | tail -20; if [ $? -ne 0 ]; then echo 'TESTS FAILED — stop and review' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}
→ Edit のたびにテスト、失敗したら Claude に「次の編集をブロック、見直せ」と返す。

Skill .claude/skills/refactor-pattern/SKILL.md

---
name: refactor-pattern
description: コードベース全体に同じパターンの変更を適用するリファクタタスク
---

# リファクタの手順

## 必ず 3 段階で進める

1. **発見フェーズ**: 該当箇所を Glob/Grep で全部リスト化、`.notes/refactor-list.md` に保存
2. **パイロットフェーズ**: リストから 1 ファイル選び、変更してテスト通す。動かなければ元に戻す
3. **展開フェーズ**: 残りを順次。10 ファイルごとに git commit、コミットメッセージは Conventional Commits

## 注意

- パイロットで 30 分以上詰まったら、ユーザーに戻して相談
- テストがないファイルは飛ばし、`.notes/refactor-skipped.md` にリスト
- 影響が大きい変更(API シグネチャ変更など)は、まず影響範囲を提示してユーザー確認

ワークフロー (例: print → logger 置換)

ユーザー: 「コードベース内のすべての print(...) を logger.info(...) に置換して。
           ただしテストコード内の print は除外。」

Claude:
  Step 1 (refactor-pattern Skill 発火): 該当箇所をリスト化
    > Grep で `print(` を全検索 → 87 件
    > .notes/refactor-list.md に保存
    > うちテストファイル (tests/ 配下) は 23 件 → 除外、.notes/refactor-skipped.md
    > 残り 64 件が対象

  Step 2: パイロット 1 ファイル
    > src/utils/helper.py の 3 箇所を変更
    > Hook が pytest を走らせる → 通る
    > git commit -m "refactor: print → logger.info in src/utils/helper.py"

  Step 3: 残り 22 ファイル × 平均 3 箇所
    > 10 ファイルごとに commit
    > Hook で各 commit 前にテスト
    > 1 ファイル(src/legacy/old_module.py)で test 失敗 → 該当変更をリバート、ユーザーに報告

注意点・限界

応用

このケース後にできるようになること

関連

📝 理解度クイズ (3 問) 💡 ログインすると進捗が保存されます

💬 このサブステップの Q&A

まだ質問はありません。最初の質問を投稿してみましょう。

質問の投稿にはログインが必要です。