原文(日本語に翻訳)
インタラクティブな /resume でセッションを切り替えた際に SessionEnd フックが発火しない問題を修正しました
原文(英語)
Fixed SessionEnd hooks not firing when using interactive /resume to switch sessions
概要
Claude Codeのライフサイクルフックの一つである SessionEnd は、セッションが終了するときに実行されるフックです。しかし、/resume コマンドで別のセッションにインタラクティブに切り替えた場合、現在のセッションが終了しているにもかかわらず SessionEnd フックが実行されない問題がありました。この修正により、セッション切り替え時も SessionEnd フックが確実に発火するようになります。
基本的な使い方
SessionEnd フックが正しく発火するようになったため、セッション終了時の後処理(ログ記録、クリーンアップ処理など)が /resume での切り替え時にも確実に実行されます。
json
// ~/.claude/settings.json
{
"hooks": {
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "echo 'セッション終了' >> ~/claude-sessions.log"
}
]
}
]
}
}実践例
セッション終了ログの記録
json
// settings.json でSessionEndフックを設定
{
"hooks": {
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "echo \"$(date): セッション終了\" >> ~/claude-session-log.txt"
}
]
}
]
}
}bash
# /resume でセッションを切り替える場合
/resume
# セッション選択画面で別のセッションを選択
# 修正後: 前のセッションの SessionEnd フックが確実に実行される
# ~/claude-session-log.txt にログが記録されるセッション切り替え時のクリーンアップ
json
{
"hooks": {
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "/path/to/cleanup-script.sh"
}
]
}
]
}
}bash
#!/bin/bash
# cleanup-script.sh
# セッション終了時に一時ファイルを削除
rm -rf /tmp/claude-work-*
echo "クリーンアップ完了: $(date)"セッション統計の収集
json
{
"hooks": {
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "python3 ~/scripts/record-session-stats.py"
}
]
}
]
}
}注意点
- 影響を受ける操作: インタラクティブな
/resumeコマンドでのセッション切り替え時のみ問題が発生していました。通常のセッション終了(Ctrl+Dやexitなど)では正しく動作していました - フックの実行順序:
SessionEndフックはセッションが終了した直後に実行されます。次のセッションが開始する前に実行されることが保証されます - エラーハンドリング: フック内でエラーが発生した場合、セッション切り替えには影響しません
- 他のライフサイクルフック:
PreToolUse、PostToolUse、Stopなどの他のフックは影響を受けていませんでした