Skip to content

原文(日本語に翻訳)

Stop および SubagentStop フック入力に last_assistant_message フィールドを追加しました。フックがトランスクリプトファイルを解析することなく最後のアシスタント応答テキストにアクセスできるようになります。

原文(英語)

Added last_assistant_message field to Stop and SubagentStop hook inputs, providing the final assistant response text so hooks can access it without parsing transcript files.

概要

Claude Code のフック機能(hooks)において、StopSubagentStop イベントの入力データに last_assistant_message フィールドが新たに追加されました。これにより、フックスクリプトが Claude の最後の応答テキストを直接取得できるようになります。これまではトランスクリプトファイルを解析する必要があり、実装が複雑でしたが、このフィールドにより大幅に簡素化されます。

基本的な使い方

フックは ~/.claude/settings.json または .claude/settings.json で設定します。

json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "your-script.sh"
          }
        ]
      }
    ]
  }
}

フックスクリプトはJSONを標準入力で受け取ります。last_assistant_message フィールドにはこのようにアクセスできます:

bash
#!/bin/bash
# stop-hook.sh

# 標準入力からJSONを読み取る
INPUT=$(cat)

# last_assistant_message フィールドを取得
LAST_MESSAGE=$(echo "$INPUT" | jq -r '.last_assistant_message')

echo "最後のClaudeの応答: $LAST_MESSAGE"

実践例

完了通知に Claude の応答を含める

bash
#!/bin/bash
# notify-on-stop.sh
INPUT=$(cat)
LAST_MESSAGE=$(echo "$INPUT" | jq -r '.last_assistant_message')
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id')

# macOS の通知センターに完了通知を送る
osascript -e "display notification \"$LAST_MESSAGE\" with title \"Claude Code 完了\""

# または Slack に通知
curl -X POST "$SLACK_WEBHOOK_URL" \
  -H 'Content-type: application/json' \
  -d "{\"text\": \"Claude Code タスク完了\\n$LAST_MESSAGE\"}"

結果のログ記録

bash
#!/bin/bash
# log-results.sh
INPUT=$(cat)
LAST_MESSAGE=$(echo "$INPUT" | jq -r '.last_assistant_message')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# ログファイルに記録
echo "[$TIMESTAMP] $LAST_MESSAGE" >> ~/claude-results.log
echo "ログ記録完了: ~/claude-results.log"

SubagentStop フックでのサブエージェント結果収集

python
#!/usr/bin/env python3
# collect-agent-results.py
import sys
import json
from pathlib import Path

data = json.load(sys.stdin)
last_message = data.get('last_assistant_message', '')
session_id = data.get('session_id', 'unknown')

# 結果を集約ファイルに保存
results_file = Path('agent-results.json')
results = []
if results_file.exists():
    results = json.loads(results_file.read_text())

results.append({
    'session_id': session_id,
    'message': last_message,
})
results_file.write_text(json.dumps(results, ensure_ascii=False, indent=2))
print(f"エージェント結果を保存しました: {session_id}")

応答内容に基づいた条件分岐

bash
#!/bin/bash
# conditional-action.sh
INPUT=$(cat)
LAST_MESSAGE=$(echo "$INPUT" | jq -r '.last_assistant_message')

# エラーが含まれているか確認
if echo "$LAST_MESSAGE" | grep -qi "error\|エラー\|失敗"; then
  echo "エラーが検出されました"
  # エラー通知を送る処理
else
  echo "タスクが正常に完了しました"
  # 成功後の処理
fi

注意点

  • フィールドの存在確認last_assistant_message が空文字列や null になるケースもあります。フックスクリプトで適切にデフォルト値を設定してください。
  • 文字エンコーディング:日本語などのマルチバイト文字を含む応答を扱う場合、スクリプトの文字コード設定に注意が必要です。
  • 以前の実装との互換性:トランスクリプトファイルを解析していた既存のフックは引き続き動作します。last_assistant_message フィールドは新しい便利な手段として追加されました。
  • SubagentStop との違いStop はメインセッション終了時、SubagentStop はサブエージェント終了時に発火します。どちらも同じフィールドを持ちます。

関連情報