N&S Logo

Claude Code hooks 完全ガイド:自動化レシピ7選

更新: 6/29
読了: 約36
字数: 14,120文字
Claude Code hooks 完全ガイド:自動化レシピ7選

エディタやツールの前で待ち構えて作業していませんか?Claude Code の hooks を使えば、日常的なコード操作や通知・リファクタを自動化して手を空けられます。本記事では hooks の基本概念と設定の流れを手短に整理し、すぐ試せる自動化レシピ7選を具体例つきで紹介します。CIログの要約や定型リファクタ、PRコメントの自動生成、依存関係の通知など、繰り返し作業を減らして「考える時間」を取り戻す実践的な組み合わせを提示。導入時の注意点、トラブルシュート、セキュリティ上の留意点も押さえてあるので、初めての人でも既存ワークフロー改善を狙う人でも、すぐに試せる手がかりが得られます。

そもそもどう動くのか

家のPCの前にいないと作業が進まない──その原因は「イベントをキーに動く仕組みがない」ことかもしれない。

仕組みは単純だ。保存や起動といったイベントをトリガーに、ローカルスクリプトを実行するか、HTTPエンドポイントへ通知を送るだけだ。動作の本質を押さえれば応用は容易である。補足として、検証済み事実として Claude Code v2.1.195 で CLAUDE_CODE_DISABLE_MOUSE_CLICKS 環境変数が追加され、フルスクリーン時のマウス操作制御が可能になった点と、ハイフン入り識別子(例: pre-commit-check)のマッチャー修正が入ったことを踏まえ、まずはフック名と実行環境を整えるのが第一歩である。

  1. フック名を決める(ハイフン可)
  • 例: pre-commit-check を使うとマッチング問題を回避できる(v2.1.195で修正済み)。
  • 設定例(JSON):
{
  "hooks": [
    { "name": "pre-commit-check", "event": "onSave", "action": { "exec": "/usr/local/bin/run-lint.sh" } }
  ]
}
  1. 実行スクリプトを用意する
  • 実際に動くシェルを書いてパーミッション付与。
cat > /usr/local/bin/run-lint.sh <<'EOS'
#!/bin/sh
cd /path/to/project || exit 1
./scripts/lint.sh
EOS
chmod +x /usr/local/bin/run-lint.sh
  1. HTTP通知の例(Webhook)
  • 保存時にCIへ通知する場合の設定:
{ "name":"notify-ci", "event":"onSave", "action": { "http": { "method":"POST","url":"http://ci.local/hooks/pre-commit" } } }
  1. 環境変数で動作を制御する(v2.1.195の新機能)
  • フルスクリーンでマウス操作を無効にする例:
export CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1
# または systemd のサービスファイルに Environment=CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1 を追加
  1. サービス経由で永続化する
  • systemd ユニットの一部例:
[Service]
Environment=CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1
ExecStart=/usr/bin/claude-code --config /etc/claude/hooks.json
  1. トリガー検証(手を動かして確認)
  • ファイル保存でフックが走るかを確認:
echo "//test" >> /path/to/project/file.js
# その後ログやCI受信ログを確認する
  1. デバッグとログ
  • 失敗時はスクリプト単体で動くかを確認し、HTTPは curl で直接叩く。シンプルなログ出力をスクリプトに追加して原因を追う。
echo "$(date) - run-lint start" >> /var/log/claude-hooks.log

まとめ:フックは「名前(ハイフン可)を決める」→「実行スクリプト/HTTPを用意」→「環境変数で挙動を制御(v2.1.195の CLAUDE_CODE_DISABLE_MOUSE_CLICKS を利用可)」の順で整備すればすぐ使える。まずは1つ、onSave→run-lint.sh を作って保存してみてください。

① 環境の基本設定:マウス/フルスクリーン挙動と環境変数

フルスクリーンでマウスに触れただけで意図しないクリックやドラッグが走って作業が止まる、そんなイライラを抱えていませんか?

そもそもどう動くのか:Claude Code は起動時にプロセス環境変数を読み込み、フルスクリーン時の入力ハンドリング挙動を切り替えられます。つまり「起動前に環境変数を設定」すれば挙動は固定でき、以降は同じ設定で再現可能になる。検証済み事実として、Claude Code 2.1.195 で CLAUDE_CODE_DISABLE_MOUSE_CLICKS が追加され、フルスクリーン時のクリック/ドラッグ/ホバーを無効化し、ホイールスクロールは保持する挙動が実装されています。

  1. 一時的に端末から有効化して起動(まずは確認)
export CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1
# 続けて端末から起動(実行コマンドは環境に合わせる)
$ /path/to/ClaudeCodeExecutable

GUI起動よりも端末起動で挙動確認するのが最速。

  1. シェルプロファイルに永続化(bash/zsh)
echo 'export CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1' >> ~/.bashrc
# zsh の場合は ~/.zshenv 等に追記
source ~/.bashrc

以後、端末から起動した場合は自動で無効化が反映される。

  1. デスクトップランチャー(Linux .desktop)から起動する場合 ~/.local/share/applications/ にある .desktop を編集し、Exec 行を次のようにする:
Exec=env CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1 /usr/bin/claude-code %U

(/usr/bin/claude-code は実際の実行パスに置換)

  1. systemd ユーザーサービスで常時適用 ~/.config/systemd/user/claude-code.service(例)に Environment を追加:
[Service]
Environment=CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1
ExecStart=/usr/bin/claude-code

編集後はsystemctl --user daemon-reload && systemctl --user restart claude-code

  1. macOS の GUI アプリから永続化(セッション環境変数) ターミナルで:
launchctl setenv CLAUDE_CODE_DISABLE_MOUSE_CLICKS 1

その後アプリを再起動すると、Launch Services 経由の起動でも環境変数が引き継がれる(ログアウト/ログインで確実)。

  1. Docker コンテナ内での利用 コンテナ起動時に環境変数を渡す:
docker run -e CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1 my-claude-image

イメージ内でアプリを起動するプロセスがこの変数を読み取る。

  1. 設定が効いているかの確認(Linux 例) プロセス PID を取得して環境を確認:
pid=$(pgrep -f "Claude Code")
tr '\0' '\n' < /proc/$pid/environ | grep CLAUDE_CODE_DISABLE_MOUSE_CLICKS

出力が "CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1" であれば有効。GUI起動の場合は再起動が必要な点に注意。

まとめ:起動前に環境変数を設定するだけでフルスクリーン時のマウス挙動を固定できる。まずは端末で export して起動、反映を確認するのが最短の一歩です。試してみて、反映状況が分からなければプロセス確認コマンドを教えてください。

② フック命名とマッチングのルール:ハイフン識別子を活かす

家のPCの前にいないとフックが動かずデプロイが止まる、というストレスを減らしたい。

そもそもどう動くか:Claude Code のフックは「識別子」に対してマッチャーが動き、識別子が一致したらそのハンドラを呼び出す。2.1.195でハイフン入り識別子のマッチング不具合が修正されたため、ハイフン命名を規則化すればマッチングミスが減る。仕組みが分かれば、命名→正規化→テストの3ステップで安定運用できる。

7選(実務で使える手順)

  1. ハイフン命名の基本形を決める

    • 例: pre-commit, save-hook, file-open
    • ルール例(推奨): 小文字英数字+ハイフン区切り
    • 正規表現(検査用):
    ^[a-z0-9]+(-[a-z0-9]+)*$
    
  2. 既存識別子を正規化する(簡易 sed)

    • ファイルに識別子一覧がある場合:
    sed 's/_/-/g' hooks.txt > hooks-normalized.txt
    
    • アンダースコアをハイフンに変換して一貫性を出す。
  3. 設定ファイルの例(YAML)

    • 実際にフックを登録する際はハイフンで統一する:
    hooks:
      - id: pre-commit
        command: ./scripts/pre-commit.sh
      - id: save-hook
        command: ./scripts/on-save.sh
  4. マッチングが効くかを確認する(jq+grep)

    • hooks.json から id を抽出して検査:
    jq -r '.hooks[].id' hooks.json | grep -E '^[a-z0-9]+(-[a-z0-9]+)*$' || (echo "Naming error" && exit 1)
    
  5. 自動マイグレーションスクリプト(Python)

    • JSON のキー名を変換して上書きする例:
    import json, re
    data = json.load(open('hooks.json'))
    for h in data.get('hooks', []):
        h['id'] = re.sub(r'_', '-', h['id'])
    json.dump(data, open('hooks.json','w'), indent=2)
  6. 名前空間(プレフィックス)をハイフンで表現する

    • 例: build-step, build-step-post, test-run
    • マッチングでグルーピングしたい場合は接頭辞でフィルタ:
    jq -r '.hooks[].id' hooks.json | grep '^build-step'
    
  7. CI に命名チェックを入れる(シェル例)

    • PRで命名規約違反を防ぐ簡易チェック:
    ids=$(jq -r '.hooks[].id' hooks.json)
    echo "$ids" | grep -E -v '^[a-z0-9]+(-[a-z0-9]+)*$' && { echo "Invalid hook id"; exit 1; }

まとめ:ハイフン命名をルール化し、正規化→検査→CIに組み込めばマッチングミスはほぼ解消する。補足:ハイフンマッチの修正は Claude Code 2.1.195 に含まれるので、その版以降で動作確認するのが安心。まずは手元のhooks.jsonに対して上の jq+grep チェックを実行してみてください。

③ 保存時に自動でAIリファクタ:on-save → スクリプト呼び出し

コードを保存するたびに「手作業でリファクタ」している時間、もったいないですよね。

そもそもどう動くのか:保存イベント(エディタの保存フック or OSのファイル監視)がトリガーになり、ローカルのスクリプトを呼び出す。スクリプトはファイルを読み込み、AIリファクタAPIに投げて(あるいはローカルエージェントに渡して)差分/置換を受け取り、原子的にファイルを書き換える。仕組みが分かれば応用は簡単だ。

7ステップ

  1. トリガー方式を決める
  • エディタ内で完結させたいなら「保存フック(Run on Save 等)」、OSレベルで幅広く動かしたければ「inotify/fswatch」で監視。
  1. リファクタ用スクリプトを作る(必須)
  • 例:ai-refactor.sh(ファイルを POST して差分を受け取り、上書きする)
#!/bin/bash
file="$1"
tmp="$(mktemp)"
cat "$file" > "$tmp"
# ローカルのリファクタAPIへ送る例
curl -sS -X POST "http://localhost:3000/refactor" -F "file=@${tmp}" -o "${tmp}.out"
# 出力を原子置換
[ -s "${tmp}.out" ] && mv "${tmp}.out" "$file"
rm -f "$tmp"
  1. VSCodeで保存時に実行(拡張を使う例)
  • settings.jsonに(Run on Save系拡張を想定):
"emeraldwalk.runonsave": {
  "commands": [
    {
      "match": "\\.js$",
      "cmd": "bash ./scripts/ai-refactor.sh ${file}"
    }
  ]
}
  1. Linuxでinotifywaitを使う例
inotifywait -m -e close_write --format '%w%f' src | while read file; do
  ./scripts/ai-refactor.sh "$file"
done
  1. macOSでfswatchを使う例
fswatch -0 src | xargs -0 -n1 -I{} ./scripts/ai-refactor.sh {}
  1. ループ防止・安全対策
  • スクリプトは一時ファイルに書いてから mv で置換(上の例参照)。
  • 自分が書き換えたファイルで再トリガーしないよう、タイムスタンプ差や一時拡張(.ai-refactoring)を使ってスキップ判定を入れる。
  1. 検証とログ
  • まずは DRY RUN フラグを用意して標準出力で差分を出す。
DRY_RUN=1 ./scripts/ai-refactor.sh src/foo.js
  • ログはファイルに残して失敗時に手動復旧できるようにする。

まとめ:保存で自動リファクタは、監視→スクリプト→原子置換の3要素を揃えれば作れる。まずはリポジトリ内の1ファイルをinotifywaitで監視して、ai-refactor.shを動かしてみてください。これだけで工数がかなり削れます。

④ 変更検知でWebhook通知:外部サービスやCI連携

家のエディタでファイルを保存しても、関係者に通知が飛ばないと作業が止まる――そんな無駄を減らすのが今回の目的だ。

仕組みはシンプル。イベント(保存/コミット/ビルド完了)を検知してフックを実行し、curlで外部のWebhookエンドポイントにHTTP POSTするだけ。仕組みが分かれば、あとは環境に合わせて「どのタイミングで実行するか」を決めてスクリプトを置くだけである。

  1. ローカルGitのpost-commitで通知(手早くローカル確認)
  • .git/hooks/post-commit を作成して実行権限を付ける。
  • 例(.git/hooks/post-commit):
    #!/bin/sh
    COMMIT=$(git rev-parse --short HEAD)
    curl -s -X POST -H "Content-Type: application/json" \
      --data "{\"text\":\"Commit: $COMMIT\"}" https://your-webhook.example.com/recv
    
  • chmod +x .git/hooks/post-commit
  1. サーバー側のpost-receiveでプッシュ通知(リモート反映時に確実)
  • bare repo の hooks/post-receive にブランチ情報をパースして投げる。
    #!/bin/sh
    while read old new ref; do
      branch=$(echo $ref | cut -d/ -f3)
      curl -X POST -H "Content-Type: application/json" \
        --data "{\"branch\":\"$branch\",\"new\":\"$new\"}" https://ci.example.com/hook
    done
    
  1. CI(例:GitHub Actions)の最後に通知ステップを追加
  • ワークフロー内のbuildジョブの最後に:
    - name: Notify on success
      if: success()
      run: |
        curl -X POST -H "Content-Type: application/json" \
          --data "{\"text\":\"Build succeeded: $GITHUB_SHA\"}" ${{ secrets.WEBHOOK_URL }}
    
  1. npmのpostbuildスクリプトでビルド完了を通知(JSプロジェクト向け)
  • package.json:
    "scripts": {
      "build": "your-build-command",
      "postbuild": "curl -X POST -H 'Content-Type: application/json' --data '{\"text\":\"Build finished\"}' $WEBHOOK_URL"
    }
    
  • 環境変数に WEBHOOK_URL を設定しておく。
  1. ファイル監視ツール(watchexec等)で保存時に通知
  • シェルスクリプト notify.sh を作り、watchexec で起動:
    # notify.sh
    curl -X POST -H "Content-Type: application/json" --data "{\"text\":\"File changed: $1\"}" https://your-hook
    
    実行:
    watchexec -w src -r -- ./notify.sh {{path}}
    
  1. Linuxでinotifywaitを使うリアルタイム監視
  • シンプルなワンライナー:
    inotifywait -m -e close_write --format '%w%f' src | while read file; do
      curl -X POST -H "Content-Type: application/json" --data "{\"text\":\"Saved: $file\"}" https://your-hook
    done
    
  1. 宛先別のペイロード例(Slack/Teams)
  • Slack(Incoming Webhook)はシンプルに text フィールド:
    curl -X POST -H 'Content-type: application/json' \
      --data '{"text":"デプロイ完了しました"}' https://hooks.slack.com/services/XXX/YYY/ZZZ
    
  • Teams はカード形式を使う場合がある(受け先の仕様に合わせてJSONを調整する)。

まとめ:まずはローカルリポジトリの post-commit に上のcurlスニペットを置いて動作確認するのが手っ取り早い。一度動かせば、CI・サーバー・エディタ監視などに同じcurlパターンを適用するだけで通知基盤が整備できる。試してみて、どのイベントで通知したいかだけ決めてください。

⑤ ベクトルDB連携:変更をベクトル化して検索に反映する

コードやコメントを直しても、その変更が検索に反映されずに古い情報を参照してしまうことはありませんか。

そもそもどう動くのか:フックが差分を検知→変更箇所をテキスト化→埋め込みを生成→ベクトルDBにメタ付きでアップサート、という流れである。仕組みが分かれば各パーツを入れ替えて応用可能だ。

  1. トリガーを置く(git hook / file watcher)
  • Gitのpost-commit例(リポジトリ/.git/hooks/post-commit を実行可能にして置く):
    #!/bin/sh
    /usr/local/bin/cc_hook_sync.sh "$PWD" "$(git rev-parse HEAD)"
  1. 変更箇所を抽出する
  • 最新コミットの差分テキストを取得:
    git show --pretty=format:%b --no-color HEAD > /tmp/last_change.txt
  • ファイル単位で取りたいなら:
    git diff --name-only HEAD^ HEAD | xargs -I{} sh -c 'git show HEAD:{} > /tmp/changed_{}'
  1. 正規化・チャンク化(手で動かせる粒度)
  • 2000文字ごとに分割する簡易Python:
    text = open('/tmp/last_change.txt','r').read()
    for i in range(0, len(text), 2000):
        print(text[i:i+2000])
  1. 埋め込みを生成する(任意の埋め込みAPIを呼ぶ)
  • 汎用curl例(環境変数を埋め替える):
    curl -s -X POST "$EMBEDDING_API_URL" \
      -H "Authorization: Bearer $EMBEDDING_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"input": "'"$(cat /tmp/last_change.txt | jq -Rs .)"'"}' > /tmp/embedding.json
  • 出力からvectorを取り出す(jq例):
    jq '.data[0].embedding' /tmp/embedding.json > /tmp/vector.json
  1. メタを作る(UUID・コミットID・パス)
  • IDとメタを用意:
    ID=$(uuidgen)
    COMMIT=$(git rev-parse HEAD)
    PATH="src/foo.py"
  1. Weaviateへアップサート(curl例)
  • Weaviate RESTにオブジェクトを作成/上書きする例(ホストとクラス名を置き換える):
    VECTOR=$(cat /tmp/vector.json)
    curl -X POST "http://WEAVIATE_HOST/v1/objects" \
      -H "Content-Type: application/json" \
      -d '{
        "class": "CodeSnippet",
        "id": "'"$ID"'",
        "properties": {
          "path": "'"$PATH"'",
          "commit": "'"$COMMIT"'",
          "text": "'"$(jq -Rs . /tmp/last_change.txt)"'"
        },
        "vector": '"$VECTOR"'
      }'
    • バッチ化するなら複数オブジェクトを配列で投げるか、Weaviateのバッチエンドポイントを使用する。
  1. 検索と更新運用(差分検知→再埋め込み)
  • 検索はGraphQL経由で近似検索が便利:
    curl -X POST "http://WEAVIATE_HOST/v1/graphql" \
      -H "Content-Type: application/json" \
      -d '{"query":"{Get{CodeSnippet(nearVector:{vector:[0.1,0.2,0.3],certainty:0.7}){path commit text}}}"}'
  • 実運用ではcommitハッシュやpathで既存レコードを特定して差分があれば再埋め込み→同IDで上書きするワークフローにする。

まとめ:差分検知→正規化→埋め込み→Weaviateアップサートの流れをスクリプト化すれば、コード変更が即座に検索に反映される。まずはリポジトリにpost-commitフックを置いて、上のスクリプトを一つ動かしてみてください。

⑥ デバッグとログ設計:フックの出力を残して追跡可能にする

フックが止まって初めて「あれ、誰も気づいてない…」と気づくのは一番つらい。

そもそもどう動くのか:フックは標準出力(stdout)と標準エラー(stderr)にログを出す小さなプロセスである。これらをファイルやジャーナルに確実に集めて、タイムスタンプと呼び出しIDを付け、終了コードで失敗を検知すれば原因追跡が可能になる。

  1. まずは標準出力/標準エラーをファイルへ落とす
    例)バックグラウンドで動かす最小形:
/usr/local/bin/claude-hook.sh >> /var/log/claude-hooks.log 2>&1 &
tail -f /var/log/claude-hooks.log
  1. コンソールでも見たいときは tee を使う
/usr/local/bin/claude-hook.sh 2>&1 | tee -a /var/log/claude-hooks.log
  1. 各行にタイムスタンプを付ける(ts があれば簡単、なければ perl)
# ts required:
command 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> /var/log/claude-hooks.log

# perl フォールバック(ほぼどこでも動く)
command 2>&1 | perl -pe '$_ = scalar(localtime()) . " " . $_' >> /var/log/claude-hooks.log
  1. パイプでログを取りつつ終了コードを拾う(bash の pipefail)
set -o pipefail
/usr/local/bin/claude-hook.sh 2>&1 | tee -a /var/log/claude-hooks.log
rc=${PIPESTATUS[0]}
if [ $rc -ne 0 ]; then
  echo "$(date '+%F %T') [ERROR] exit=$rc" >> /var/log/claude-hooks.err
  exit $rc
fi
  1. ログローテーションを設定する(logrotate例)
/var/log/claude-hooks.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  copytruncate
}

copytruncate はプロセスを止めずにログを切る簡単な方法。

  1. systemd を使うならジャーナルで一元管理&自動再起動
    unit の抜粋例:
[Unit]
Description=Claude Hook

[Service]
ExecStart=/usr/local/bin/claude-hook.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

ログは journalctl -u claude-hook -f で追跡。Restart により exit code に応じて自動復旧する。

  1. トレース用の呼び出しIDを付与して相関させる
TRACE_ID=$(date +%s%N)
TRACE_ID=$TRACE_ID /usr/local/bin/claude-hook.sh 2>&1 | sed "s/^/[$TRACE_ID] /" >> /var/log/claude-hooks.log

各ログ行に TRACE_ID を付ければ、複数フックや外部API呼び出しとの紐付けが容易。

まとめ:まずは stdout/stderr をファイルへ集め、タイムスタンプと呼び出しIDを付け、exit code を明示的にチェックする運用パターンを作れば「動かない」問題の検知率は劇的に上がる。まずは1本のフックで上の 1→3→4 を試して、tail と exit-code 検出を動くことを確認してみてください。

⑦ CI / Git フローに組み込む実例:プッシュでフック→テスト→デプロイ

PC の前にいなくても、プッシュのたびに人手でリファクタ→テスト→デプロイしているとミスが必ず出る——それをCIに押し付けるのが今回の狙いである。

そもそもどう動くのか プッシュで CI が走る → まず通常のユニット/統合テストを実行 → テスト通過ならリポジトリ全体をスナップショットして Claude Code 用のフック(ローカル実行コマンド)に渡す → AI が差分パッチ(refactor.patch)を返す → そのパッチを自動適用して再テスト → すべて合格ならデプロイ。ポイントは「パッチをファイルで扱い、CI 内で再テストしてからコミット/デプロイすること」。

7ステップ実務例(実際にコピペできる手順)

  1. フック用スクリプトを用意する
  • ファイル: .github/hooks/claude-refactor.sh
  • 実行権限を付与 chmod +x .github/hooks/claude-refactor.sh
  1. GitHub Actions ワークフロー(最小例)
  • .github/workflows/ai-refactor.yml の例(主要ステップのみ)
on: [push]
jobs:
  ai-refactor:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: npm ci && npm test
      - name: Run Claude Code hook
        run: ./.github/hooks/claude-refactor.sh
      - name: Deploy (if all green)
        if: ${{ success() }}
        run: ./scripts/deploy/prod_deploy.sh
  1. フックスクリプトの雛形(具体コマンド)
  • .github/hooks/claude-refactor.sh
#!/bin/bash
set -e
# パッケージング(.gitを除く)
tar -czf /tmp/code.tar.gz --exclude=.git .
# CLAUDE_CODE_CMD 環境変数に実行コマンドをセットしておく(実環境に合わせて置換)
# 例: export CLAUDE_CODE_CMD="claude-code-agent analyze"
$CLAUDE_CODE_CMD --input /tmp/code.tar.gz --recipe ai-refactor > /tmp/refactor.patch || true
if [ -s /tmp/refactor.patch ]; then
  git apply /tmp/refactor.patch
  npm ci && npm test
  # CI 再トリガを避けるために [skip ci] を付けてコミット
  git add -A
  git commit -m "chore: apply AI refactor [skip ci]" || true
  git push
fi

(CLAUDE_CODE_CMD は自分の Claude Code エージェント呼び出しコマンドに置き換えてください)

  1. テストの二段階運用
  • 事前: npm test
  • 事後: パッチ適用後に npm test を再実行
  • 失敗したらパッチはコミットせず、CI は失敗で止める(set -e により自動的に落ちる)
  1. 自動コミットとループ回避
  • コミットに [skip ci] を含めることで同じワークフローの再トリガを防止する(多くのCIが対応)
  • あるいは専用ボットユーザーで push してワークフロー条件に github.actor != 'your-bot' を入れる運用も可能
  1. 権限とシークレット
  • GITHUB_TOKEN は actions/checkout がデフォルトで使えるが、外部エージェント呼び出しが必要な場合はシークレットに鍵を入れる
  • ワークフロー内で環境変数をセット: CLAUDE_CODE_CMD を secrets や runner にあらかじめ設定する
  1. デプロイは最後に一発で
  • テストがすべて成功したら ./scripts/deploy/prod_deploy.sh や kubectl/terraform コマンドを実行する
  • ここは既存の手順をそのままCIに移すだけでOK

まとめ これで「プッシュ→テスト→AIリファクタ→再テスト→デプロイ」が自動化できる。まずはブランチで上記ワークフローと .github/hooks/claude-refactor.sh を置いて動かしてみてください。次の一歩:自分の Claude Code 実行コマンドを CLAUDE_CODE_CMD に紐付けて試運転すること。

まとめ

環境整備から始め、まずは環境変数と命名ルールを整えましょう。保存時フック→Webhook→ベクトルDBと機能を一つずつ追加して動作を確認すると、安全に拡張できます。問題が出たらログで原因を確認し、フック単位でロールバックできるようにしておくと安心です。小さな変更を積み重ねて安定した自動化を目指してください。まずの一歩として、export CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1を設定して挙動を検証してみてください。

📱 関連ショート動画

この記事の内容をショート動画で解説

横にスクロールできます

著者について

原田賢治

原田賢治

代表取締役・AI技術責任者

Mike King理論に基づくレリバンスエンジニアリング専門家。生成AI検索最適化、ChatGPT・Perplexity対応のGEO実装、企業向けAI研修を手がける。 15年以上のAI・システム開発経験を持ち、全国で企業のDX・AI活用、退職代行サービスを支援。