Skip to content

Comments

feat: PreCompact JSON出力対応#67

Merged
syou6162 merged 9 commits intomainfrom
pre_compact
Feb 14, 2026
Merged

feat: PreCompact JSON出力対応#67
syou6162 merged 9 commits intomainfrom
pre_compact

Conversation

@syou6162
Copy link
Owner

@syou6162 syou6162 commented Feb 14, 2026

概要

PreCompactフックをJSON出力形式に移行し、Claude Code公式仕様に準拠させる。SessionEndパターン(Common JSON Fieldsのみ、hookSpecificOutputなし、ブロック不可)を踏襲。

背景

cchookは当初exit codeベースでフック出力を制御していたが、Claude Code公式仕様でJSON出力形式が導入された。Phase 1(SessionStart)からPhase 9(Notification)まで段階的にJSON出力対応を完了しており、PreCompactは残りのLegacy Exit Code Eventsの一つだった。

公式ドキュメントにPreCompact用のhookSpecificOutputが記載されていないため、SessionEndパターン(Common JSON Fieldsのみ)を採用。

変更内容

  • types.go: PreCompactOutput構造体を追加(continue, stopReason, suppressOutput, systemMessage)
  • types.go: PreCompactHookにMatcherフィールドを追加(manual/auto対応、SessionStartパターン)
  • executor.go: ExecutePreCompactActionをJSON出力形式に書き換え(*ActionOutput, error返却)
  • hooks.go: executePreCompactHooksJSON実装(matcherチェック、fail-safe設計)
  • hooks.go: RunPreCompactHooks公開ラッパー追加、旧executePreCompactHooks削除
  • hooks.go: dryRunPreCompactHooksにmatcherチェックと検証警告を追加
  • utils.go: validatePreCompactOutput, checkUnsupportedFieldsPreCompact追加
  • main.go: PreCompact JSON出力ハンドリング追加(常にexit 0)
  • CLAUDE.md: PreCompact JSON Outputセクション追加
  • README.md: PreCompactをJSON Output Eventsに移動、Migration Note追加
  • matcher検証ロジックの到達不能バグ修正(検証警告をスキップ条件の前に移動)

設計方針

  • 常にexit 0(エラー時もJSON出力)
  • continue常にtrue(PreCompactはブロック不可)
  • fail-safe設計: エラー時はsystemMessageにエラー情報を設定
  • 後方互換性: exit_status設定時にstderr非推奨警告

関連情報

PreCompact JSON出力対応(Step 1)として以下を実装:
- PreCompactOutput構造体を追加(Common JSON Fieldsのみ、SessionEndパターン)
- PreCompactHookにMatcherフィールドを追加(manual/auto対応)
- TestPreCompactOutput_JSONSerializationを追加(round-trip、omitempty検証)
PreCompact JSON出力対応(Step 2)として以下を実装:
- validatePreCompactOutput関数を追加(JSON Schema検証、SessionEndパターン)
- checkUnsupportedFieldsPreCompact関数を追加(未サポートフィールド警告)
- TestValidatePreCompactOutput追加(型チェック、有効/無効ケース)
Step 3の実装完了:
- シグネチャ変更: error → (*ActionOutput, error)
- SessionEndパターン踏襲(Common JSON Fields、fail-safe設計)
- commandアクション: JSON解析、checkUnsupportedFieldsPreCompact呼び出し
- outputアクション: メッセージ→SystemMessageマッピング、exit_status警告
- テスト追加: TestExecutePreCompactAction_TypeOutput(3ケース)
- テスト追加: TestExecutePreCompactAction_TypeCommand(6ケース)
- hooks.go: 一時的な修正(Step 4でexecutePreCompactHooksJSONに置き換え予定)
Step 4の実装完了:
- executePreCompactHooksJSON実装(SessionEndパターン踏襲)
- matcherチェック追加(manual/auto、SessionStartパターン)
- matcher無効値警告(設定ミスの早期検出)
- finalOutput初期化(Continue: true、fail-safe設計)
- systemMessage改行連結、stopReason/suppressOutput最後勝ち
- エラー処理(fail-safe: systemMessageに追加)
- RunPreCompactHooks公開ラッパー追加
- runHooksのPreCompactケースをexecutePreCompactHooksJSONに委譲
- dryRunPreCompactHooksにmatcherチェック追加
- TestExecutePreCompactHooksJSON追加(7ケース、matcherフィルタリング含む)
- TestExecutePreCompactHooksのnil pointer修正(t.Fatal使用)
Step 5の実装完了:
- PreCompactブロック追加(SessionEndパターン踏襲)
- RunPreCompactHooks呼び出し
- エラー時fallback(continue: true, systemMessage)
- fail-safe設計: エラー発生時もJSON出力
- JSON MarshalIndent(2-space indent)
- validatePreCompactOutput呼び出し
- 常にexit 0(compaction cannot be blocked)
Step 7の実装完了:
- CLAUDE.md: PreCompact JSON Outputセクション追加
  - SessionEndパターンと同じ構造(Common JSON Fields only)
  - matcher対応の説明(manual/auto)
  - Field Merging、Exit Code Behavior、例を記載
- README.md: PreCompactをJSON Output Eventsに移動
  - JSON Output Eventsリストに追加(Notification含む)
  - Legacy Exit Code EventsからPreCompactを削除
  - default exit_statusの説明を更新
  - PreCompact Migration Note追加(exit_status無視、matcher対応)
matcher値が不正(typo等)の場合、スキップ条件でcontinueされるため
検証警告が実行されないバグを修正。検証警告をスキップ条件の前に移動。

- executePreCompactHooksJSON: 検証警告とマッチャーチェックの順序を入れ替え
- dryRunPreCompactHooks: 検証警告を追加(dryrun時も同じ警告を表示)
@syou6162 syou6162 marked this pull request as ready for review February 14, 2026 09:56
@syou6162 syou6162 merged commit 9c51f6d into main Feb 14, 2026
2 checks passed
@syou6162 syou6162 deleted the pre_compact branch February 14, 2026 09:56
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