handover/takeoverを実装してClaude Codeの作業を引き継がせる
Claude Codeを長時間使用していると、コンテキストがひっ迫してMCPサーバーの呼び出しが不安定になることがあります。
特にSerenaのmemory_write機能は、何がいつ記録されるかがClaude Codeの判断に委ねられており、ユーザー側で制御できません。
そこで、より確実に作業内容を引き継げる仕組みを実装することにしました。
コンテキスト管理の問題点
Claude Codeを長時間使っていると、以下のような問題があります。
- コンテキストウィンドウが埋まってくると、MCPサーバーへのアクセス頻度が下がる
- Serenaのメモリー機能は便利だが、記録タイミングがコントロールできない
- 重要な作業内容が失われて、新しいセッションで一から説明し直す必要がある
/handoverコマンドとsession_startフック
Claude CodeにはCLAUDE.mdという設定ファイルがありますが、これは恒久的なプロジェクト設定やユーザーの指示を記述するためのものです。一方で、作業の引き継ぎ情報のような一時的な共有メモリは、これとは別に管理したいと考えました。
そこで、以下の2つの機能を実装しました。
1. /handover
/.claude/commands/handover.mdに定義されたコマンドで、プロジェクトルートにHANDOVER.mdを作成・更新します。
このコマンドは以下の10セクションを含む詳細な引き継ぎ情報を記録します:
- Environment & Setup - 作業環境の情報
- Session Summary - セッションの概要
- Current Tasks - TodoWriteからのタスク状態
- Files Modified/Reviewed - 変更・確認したファイル
- Commands Executed - 実行したコマンド
- Technical Context - 技術的な決定事項
- Unresolved Issues - 未解決の問題
- Important Discoveries - 重要な発見
- Next Session Priorities - 次回の優先事項
- Additional Notes - その他のメモ
YAML frontmatterで管理される情報:
---
created: 2025-01-07T15:30:00Z
read: false # 未読フラグ
session_id: session_20250107_153000
---
2. session_startフック(takeover.sh)
/.claude/hooks/session_start/takeover.shは、新しいセッション開始時に自動実行されます。
このスクリプトでは以下を実行します。
- HANDOVER.mdから未読エントリー(
read: false)を検出 - カラー表示で優先度を可視化
- 🔴 赤:Critical/Blocking
- 🟡 黄:Important/Warning
- 🟢 緑:Info/Success
- 🔵 青:Note/Reference
- 読み込み後、
read: trueに更新
実際のワークフロー
セッション終了時
「/handover」
このコマンドを実行すると、Claude Codeが現在のセッション情報を収集し、HANDOVER.mdに記録します。
次回セッション開始時
自動的にtakeover.shが実行され、以下のような表示が出ます:
═══════════════════════════════════════════════════════════════════
📋 SESSION HANDOVER DETECTED
═══════════════════════════════════════════════════════════════════
📌 Previous Session: session_20250107_153000
🕐 Created: 2025-01-07T15:30:00Z
───────────────────────────────────────────────────────────────────
[引き継ぎ情報がカラー表示される]
✅ Handover information processed successfully
📝 All entries have been marked as read
═══════════════════════════════════════════════════════════════════
🚀 Ready to continue from the previous session state
═══════════════════════════════════════════════════════════════════
実装例:HANDOVER.mdの構造
---
created: 2025-01-07T15:30:00Z
read: false
session_id: session_20250107_153000
---
# Session Handover - session_20250107_153000
## Environment & Setup
- **Working Directory**: `/home/user/dev/project`
- **Git Branch**: `feature/new-feature`
- **Bun Version**: 1.2.21
- **Uncommitted Changes**: 3 files modified
## Session Summary
**Duration**: ~2 hours
**Main Goal**: Implement handover/takeover system
**Result**: 🟢 Successfully implemented
## Current Tasks
### In Progress
- 🟡 Testing new workflow (70% complete)
### Completed
- ✅ Created /handover command
- ✅ Implemented takeover.sh hook
[... 続く ...]
改善点
もちろん、完璧ではありません。
- /handoverコマンドの手動実行が必要
- HANDOVER.mdの容量が大きくなりすぎると、逆にコンテキストを圧迫する
- 機密情報の扱いには注意が必要(gitにコミットされる可能性)
- auto-compactギリギリで実行すると引き継ぎ中に圧縮される可能性がある
pre_compact hookで引き継ぎ書の作成を自動化したかったんですが、どうもcompact実行直前にClaude Codeへタスクを指示しても無視されてしまうようです。そのため今回はslach commandで妥協しています。
また、最後の懸念点は一応引き継ぎタスクをsub agentへ投げることで解消はしそうです。
まとめ
Serenaのmemory機能も便利ですが、シンプルにHANDOVER.mdとsession_startフックを組み合わせることで、より確実で管理しやすいhandover/takeoverの仕組みを構築できました。
開発環境間でセッションを引き継ぎたいな、という動機でやってみましたが、案外うまく機能していて良い感じです。詳しい実装はdotfilesで公開しているので、興味ある方はどうぞ。
Discussion