Skip to content

Comments

feat: SessionEnd JSON出力対応#63

Merged
syou6162 merged 7 commits intomainfrom
session_end_json
Feb 9, 2026
Merged

feat: SessionEnd JSON出力対応#63
syou6162 merged 7 commits intomainfrom
session_end_json

Conversation

@syou6162
Copy link
Owner

@syou6162 syou6162 commented Feb 9, 2026

概要

SessionEndフックの出力形式を旧Exit Codeベースの方式からJSON出力形式に移行する。SessionEndはセッション終了時のクリーンアップ専用フックであり、Common JSON Fieldsのみのシンプルなスキーマで実装。

背景

cchookの各イベントタイプは段階的にJSON出力形式への移行を進めてきた。SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PermissionRequest, Stop, SubagentStopは既にJSON出力対応が完了しており、SessionEndは残りの未対応イベントの1つ。

SessionEndはセッション終了をブロックできないため、decision/reasonフィールドやhookSpecificOutputは存在せず、Common JSON Fields(continue, stopReason, suppressOutput, systemMessage)のみの最もシンプルなスキーマとなる。

変更内容

  • types.go: SessionEndOutput構造体を定義(Common JSON Fieldsのみ)
  • utils.go: validateSessionEndOutput関数を実装(JSON Schema検証のみ、セマンティック検証は不要)
  • executor.go: ExecuteSessionEndActionの戻り値を(*ActionOutput, error)に変更、checkUnsupportedFieldsSessionEnd追加
  • hooks.go: RunSessionEndHooks / executeSessionEndHooksJSON関数を実装、旧executeSessionEndHooksを削除、runHooksからSessionEndケースを削除
  • main.go: SessionEnd専用のJSON出力ハンドリングブロックを追加
  • CLAUDE.md: SessionEnd JSON Outputセクションを追加
  • README.md: SessionEndをJSON Output Eventsに移動、Legacy Exit Code Eventsから削除
  • テスト: 旧Exit Codeベースのテストを削除し、JSON版に置き換え

設計のポイント

  • fail-safe設計: continueは常にtrue(セッション終了をブロックできないため)
  • エラーハンドリング: 常にexit 0、エラー時はsystemMessageにエラー情報を格納
  • フィールドマージ: systemMessageは改行連結、stopReason/suppressOutputは後勝ち
  • outputアクションのmessageマッピング: hookSpecificOutput/additionalContextがないため、systemMessageにマッピング

関連情報

SessionEndフックのJSON出力構造体とテストを追加。
Common JSON Fieldsのみで、hookSpecificOutput/decision/reasonは存在しない。
continueは常にtrueとする(fail-safe設計、セッション終了はブロック不可)。
SessionEndフックのJSON出力バリデーション関数とテストを追加。
JSON Schema検証のみで、セマンティック検証は不要(全フィールドOptional)。
schema.Required=nil、schema.AdditionalProperties=nilで追加フィールドを許容。
ExecuteSessionEndActionの戻り値を(*ActionOutput, error)に変更。
SessionEndOutput構造体をパースし、fail-safe設計(continue常にtrue)を実装。
checkUnsupportedFieldsSessionEnd関数を追加(decision/reason/hookSpecificOutputは非対応)。
旧方式のテストを削除し、新しいJSON対応テストを追加。
RunSessionEndHooks、executeSessionEndHooksJSON関数を追加。
SessionEndOutput返却、fail-safe設計(continue常にtrue)。
フィールドマージ: systemMessage改行連結、stopReason/suppressOutput後勝ち。
旧executeSessionEndHooks関数とrunHooksのSessionEndケースを削除。
旧テストを削除し、新しいJSON対応テスト(TestExecuteSessionEndHooksJSON)を追加。
SessionEnd専用のJSON出力ハンドリングブロックをmain.goに追加。
RunSessionEndHooks呼び出し、fail-safe設計(continue常にtrue)。
エラー時もsystemMessageにエラー情報を格納してJSON出力。
validateSessionEndOutputによる検証、常にexit 0で終了。
CLAUDE.mdにSessionEnd JSON Outputセクションを追加。
README.mdでSessionEndをJSON Output Eventsに移動、Legacy Exit Code Eventsから削除。
Common JSON Fieldsのみ使用、decision/reason/hookSpecificOutputなし。
cleanup専用フック、セッション終了をブロック不可、常にexit 0。
@syou6162 syou6162 self-assigned this Feb 9, 2026
@syou6162 syou6162 marked this pull request as ready for review February 9, 2026 21:57
@syou6162 syou6162 merged commit 6602aae into main Feb 9, 2026
2 checks passed
@syou6162 syou6162 deleted the session_end_json branch February 9, 2026 21:58
syou6162 added a commit that referenced this pull request Feb 10, 2026
notification_jsonブランチとmainブランチ間のコンフリクトを解決し、
SessionEnd JSON出力対応(PR #63)を統合。

変更内容:
- CLAUDE.md: SessionEnd JSON Outputセクションを追加
- types.go: SessionEndOutput構造体を追加
- executor.go: ExecuteSessionEndActionをJSON対応に変更
  - 戻り値を(*ActionOutput, error)に変更
  - checkUnsupportedFieldsSessionEnd関数を追加
- hooks.go: executeSessionEndHooksJSONとRunSessionEndHooks関数を追加
  - runHooksでの呼び出しを更新
- hooks_test.go: 関数呼び出しをJSON対応版に更新
- actions_test.go: 古いSessionEndテストを削除(JSON対応版はexecutor_test.goにある)
- main.go: SessionEnd JSON出力ハンドリングブロックを追加
- utils.go: validateSessionEndOutput関数を追加

これにより、Notification JSON出力とSessionEnd JSON出力の両方が
コンフリクトなく共存できるようになった。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant