> [!left-bubble] ![[claudine-mini.webp]]
> [[Claude Code]]がまとめたレポートです。
## 概要
[[GitHub Copilot CLI]]のデバッグログを解析し、エージェントのhookライフサイクル(userPromptSubmitted → [[sessionStart (GitHub Copilot)|sessionStart]] → preToolUse/postToolUse → [[agentStop (GitHub Copilot)|agentStop]] → [[sessionEnd (GitHub Copilot)|sessionEnd]])を[[Mermaid|mermaid]]図として可視化する。また、公式ドキュメントを調査し「セッション」の定義を明確にする。
## 計画
- [x] デバッグログからhookイベントの発火順序を解析
- [x] [[Mermaid|mermaid]]のシーケンス図を作成
- [x] [[Markdown|markdown]]貼り付け用のコードブロック形式で出力
- [x] 「セッション」の定義を公式ドキュメント(CLI/SDK)から調査
- [x] sessionStart/sessionEndの挙動がper-promptである事実と、バグ報告(copilot-cli#991)の存在を確認
- [x] 調査結果を総括にまとめる
## 総括
### 対応内容
- デバッグログ (`process-1774566141399-51111.log`) を解析し、[[GitHub Copilot CLI]]のhookライフサイクルの発火順序を特定
- [[Mermaid|mermaid]]シーケンス図を作成し、[[Markdown|markdown]]貼り付け可能な形式で提供
- 公式ドキュメント(CLI/SDK両方)を調査し「セッション」の定義と`sessionStart`の`source`フィールドを確認
- `sessionStart`/`sessionEnd`のper-prompt発火がバグとして報告されている事実を発見
### 対応による恩恵
- [[GitHub Copilot CLI]]のhookイベントの発火タイミングが視覚的に把握できるようになった
- 「セッション」の定義が曖昧であること、および現在の挙動(per-prompt)がドキュメントの記述と異なる可能性があることが明確になった
### 詳細
#### hookイベント発火順序(1ターンあたり)
| 順序 | イベント | タイミング |
| --- | --------------------- | ------------------- |
| 1 | `userPromptSubmitted` | ユーザーがプロンプトを送信した直後 |
| 2 | `sessionStart` | エージェントセッション開始時 |
| 3 | `preToolUse` | 各ツール実行の直前(ツールごとに発火) |
| 4 | `postToolUse` | 各ツール実行の直後(ツールごとに発火) |
| 5 | `agentStop` | エージェントの応答完了時 |
| 6 | `sessionEnd` | セッション終了時 |
#### mermaid図
```mermaid
sequenceDiagram
participant User as ユーザー
participant CLI as Copilot CLI
participant Hook as Hook
participant Agent as エージェント(LLM)
participant Tool as ツール
Note over CLI: CLI起動・初期化
CLI->>CLI: プラグインからHook読み込み
CLI->>CLI: セッション登録 (session.foreground)
CLI->>CLI: MCP/ツール初期化
rect rgb(230, 245, 255)
Note over User,Tool: ターン (ユーザーの入力ごとに繰り返し)
User->>CLI: プロンプト入力
CLI->>Hook: 👇 userPromptSubmitted
CLI->>Hook: ✨ sessionStart
CLI->>Agent: プロンプト送信
loop エージェントがツールを使う間
Agent->>CLI: ツール呼び出し要求
CLI->>Hook: 🫷 preToolUse
CLI->>Tool: ツール実行
Tool-->>CLI: 実行結果
CLI->>Hook: 🫸 postToolUse
CLI-->>Agent: ツール結果返却
end
Agent-->>CLI: 最終応答
CLI->>Hook: ⛔ agentStop
CLI->>Hook: ✋ sessionEnd
CLI-->>User: 応答表示
end
```
#### セッションの定義について
CLIレベルとhookレベルで2つの「セッション」概念が存在する:
| 概念 | スコープ | ログ上の表現 |
|------|---------|-------------|
| CLIセッション | `copilot`コマンド起動〜終了 | `session.foreground` (ID付き、1回だけ登録) |
| エージェントセッション (hook対象) | 1プロンプト→エージェント応答完了 | `sessionStart`〜`sessionEnd` (ターンごとに繰り返し) |
公式ドキュメント上の `sessionStart` hook inputには `source` フィールド (`"new"` / `"resume"` / `"startup"`) があるが、「セッション」自体の明確な定義は記載されていない。
### 備考・注意事項
- `sessionStart`/`sessionEnd`がインタラクティブモードでプロンプトごとに発火する挙動は、github/copilot-cli#991 でバグとして報告されている(未解決)。ドキュメント上はセッション開始/終了時に1回発火する想定だが、実装はper-promptになっている
- 今後の仕様変更で挙動が変わる可能性がある
### 参考リンク
- [Hooks configuration - GitHub Copilot](https://docs.github.com/en/copilot/reference/hooks-configuration)
- [Using hooks with GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/use-hooks)
- [github/copilot-cli#991 - sessionStart/sessionEnd per-prompt issue](https://github.com/github/copilot-cli/issues/991)
- [Copilot SDK - Session Hooks](https://github.com/github/copilot-sdk/blob/main/nodejs/README.md)
## 作業メモ
- ログファイル: `/tmp/copilot-log/process-1774566141399-51111.log` (約67000トークン)
- hookイベントは `Executing hook:` / `[hook stdout]` で検索可能
- ユーザーフックとプラグインフック(notify.sh)が同一イベントで並行実行されている