
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回:コンテキスト管理の技術——トークンを無駄にしない →