ankuro.dev
← ブログ一覧に戻る
【Claude Code中級編 #8】CwdChanged——ディレクトリ移動で環境変数を自動切り替える
2026-03-26#Claude Code#AI#Hooks#環境管理#AWS

【Claude Code中級編 #8】CwdChanged——ディレクトリ移動で環境変数を自動切り替える

Claude Code v2.1.83で CwdChanged というHookイベントが追加された。ディレクトリを移動したときに自動でスクリプトを実行でき、CLAUDE_ENV_FILE と組み合わせるとAWSプロファイルなどの環境変数をプロジェクトごとに自動切り替えできる。


CwdChanged とは

BashツールでのcdやClaude Code内のディレクトリ移動を検知して、スクリプトを実行するHookイベント。

これまでのHooksとの違いを整理すると:

イベント 何に反応するか
PreToolUse ツールが実行される直前
PostToolUse ツールが実行された直後
Stop Claude Codeが応答を終了したとき
CwdChanged カレントディレクトリが変わったとき(v2.1.83新規

matcherは不要で、すべてのディレクトリ変更で発火する。


settings.json の設定

{
  "hooks": {
    "CwdChanged": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/hooks/on_cwd_changed.py"
          }
        ]
      }
    ]
  }
}

フックに渡されるデータ

{
  "hook_event_name": "CwdChanged",
  "old_cwd": "/Users/yourname/projects/old-project",
  "new_cwd": "/Users/yourname/projects/new-project",
  "cwd": "/Users/yourname/aws-update-summary",
  "session_id": "abc123...",
  "transcript_path": "/Users/yourname/.claude/projects/.../abc123.jsonl"
}
  • old_cwd — 移動前のパス
  • new_cwd — 移動後のパス
  • cwd — セッション起動時のパス(固定)

CLAUDE_ENV_FILE——hookから環境変数を渡す仕組み

hookスクリプト内では CLAUDE_ENV_FILE という環境変数が使える。これはClaude Codeが用意するシェルスクリプトファイルへのパスで、ここに export VAR=value を書き込むと後続のBashツール実行時に反映される

CwdChanged hook
  → CLAUDE_ENV_FILE に export AWS_PROFILE=prod を書き込む
  → 次のBashツール実行時に AWS_PROFILE=prod が使われる

通常、子プロセスから親プロセスの環境変数は変更できないが、CLAUDE_ENV_FILE はClaude Codeがhookの完了後に読み込む仕組みになっているため、実質的に環境変数の切り替えが実現できる。


実装例:AWSプロファイルをプロジェクトごとに切り替える

# ~/.claude/hooks/on_cwd_changed.py
import json, sys, os

input_data = json.loads(sys.stdin.read())
new_cwd = input_data.get("new_cwd", "")
env_file = os.environ.get("CLAUDE_ENV_FILE", "")

# プロジェクトパスとAWSプロファイルのマッピング
profile_map = {
    "/Users/yourname/projects/prod-app": "prod",
    "/Users/yourname/projects/dev-app": "dev",
    "/Users/yourname/projects/staging-app": "staging",
}

for path, profile in profile_map.items():
    if new_cwd.startswith(path) and env_file:
        with open(env_file, "a") as f:
            f.write(f"export AWS_PROFILE={profile}\n")
        print(f"AWS_PROFILEを {profile} に切り替えました")
        sys.exit(0)

cdするだけで自動的にAWSプロファイルが切り替わり、次のBashツールでの aws コマンドに反映される。


実装例:ディレクトリ移動をログに記録する

# ~/.claude/hooks/on_cwd_changed.py
import json, sys
from datetime import datetime

input_data = json.loads(sys.stdin.read())
old_cwd = input_data.get("old_cwd", "")
new_cwd = input_data.get("new_cwd", "")

with open("/tmp/cwd_history.txt", "a") as f:
    f.write(f"{datetime.now():%Y-%m-%d %H:%M:%S}  {old_cwd} -> {new_cwd}\n")

まとめ

  • CwdChanged はBashツールのcdを含むディレクトリ移動で発火する
  • matcherは不要で全変更に反応する
  • inputには old_cwd / new_cwd が含まれる
  • CLAUDE_ENV_FILE に書き込むことで後続のBashツールに環境変数を渡せる
  • プロジェクトごとにAWSプロファイルを自動切り替えする用途に実用的

第7回:HooksとSkillsで安全なスキルを作る——セキュリティ設計第9回:コンテキスト管理の技術——トークンを無駄にしない