## 概要 [[Claude Code]]で実現した以下のようなことを[[VSCode]] x [[GitHub Copilot]]でも実現したい。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2025-07-02 Claude Codeで人間が確認待ちの状態になっている場合に通知させる </div> <div class="link-card-v2-content">以前、Claude Codeの作業完了時にGhosttyのOSC 9シーケンスやAppleScriptで通知を試みたが安定しなかったため、Hooks機能とAppleScriptによるmacOS通知を設定した。通知の挙動やトラブル時の対処法も記載した。環境はmacOS 15.5、Ghostty 1.1.4、Claude Code 1.0.40で確認した。</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/activity.webp" /> <a data-href="📜2025-07-02 Claude Codeで人間が確認待ちの状態になっている場合に通知させる" class="internal-link"></a> </div> %%[[📜2025-07-02 Claude Codeで人間が確認待ちの状態になっている場合に通知させる]]%% ### 環境 | 対象 | バージョン | | ---------- | ---------- | | [[macOS]] | 15.5 | | [[VSCode]] | 1.101.2 | ## [[VSCode]] x [[GitHub Copilot]] にその機能はなさそう #2025/07/06 時点では[[ChatGPT]]に聞いてみたところ対応してなさそう。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://cdn.oaistatic.com/assets/favicon-miwirzcw.ico" /> <span class="link-card-v2-site-name">ChatGPT</span> </div> <div class="link-card-v2-title"> ChatGPT - Copilot 通知 バナー 音 </div> <div class="link-card-v2-content"> Shared via ChatGPT </div> <img class="link-card-v2-image" src="https://cdn.oaistatic.com/assets/chatgpt-share-og-u7j5uyao.webp" /> <a href="https://chatgpt.com/share/6869e651-4518-800a-964e-62dff3688dd4"></a> </div> ## MeerkatIOを使ってみる [[MeerkatIO]]の[[VSCode Extension]]である[[MeerkatIO (VSCode)|MeerkatIO]]をインストールして試してみた。 `設定` ```json { "meerkat.meerkatNotification": "system", "meerkat.triggerMinDurationSeconds": 6 } ``` この設定だと6秒以上かかったターミナルコマンドは、完了したら常に通知してくれる。 しかし、**[[GitHub Copilot]]の処理と応答に関しては発動しない**ため、要件は達成できない。 ## [[VSCode Extension]]を自作してみる [[Claude Code]]に頼んでみたが、今回は見送ることにした。 > [!right-bubble] ![[minerva-face-right.webp]] > VSCodeでGitHub Copilotの作業が終わってユーザーの入力待ちになったら通知してくれるVSCode Extensionを作ってください。 > > - MacOSで動けばOK > - MacOSのNotification利用でOK (VSCodeではできない気がするので) > - VSCodeウィンドウが非アクティブの場合だけでOK > [!left-bubble] ![[claude-san-face.webp]] > VSCode拡張機能でGitHub Copilotの作業完了を通知する機能を実装します。まず、現在のプロジェクト構造を確認して、実装計画を立てます。 > [!left-bubble] ![[claude-san-face.webp]] > 空のディレクトリですね。VSCode拡張機能の基本構造を調べて、GitHub Copilotの状態監視とmacOS通知機能を実装する計画を立てます。 > [!left-bubble] ![[claude-san-face.webp]] > 調査が完了しました。VSCode拡張機能でGitHub Copilotの作業完了を検知してmacOS通知を送信する機能を実装する計画をお示しします。 > [!left-bubble] ![[claude-san-face.webp]] > # VSCode GitHub Copilot 通知拡張機能の実装計画 > > ## 実装概要 > GitHub Copilotの作業完了を検知し、VSCodeウィンドウが非アクティブな場合にmacOS通知を送信するVSCode拡張機能を作成します。 > > ## 実装手順 > > ### 1. プロジェクトの初期化 > - `yo code`でVSCode拡張機能プロジェクトを生成 > - TypeScriptテンプレートを使用 > > ### 2. 必要なライブラリのインストール > - `node-notifier`: macOSネイティブ通知送信用 > - 型定義ファイル: `@types/node-notifier` > > ### 3. 核心機能の実装 > - **GitHub Copilot状態監視**: `github.copilot.inline.finish` Context Keyを200msごとにポーリング > - **VSCodeウィンドウ状態監視**: `vscode.window.state.focused`でアクティブ状態を監視 > - **通知送信**: VSCodeが非アクティブかつCopilot作業完了時にmacOS通知を送信 > > ### 4. 主要なファイル > - `package.json`: 拡張機能の設定とメタデータ > - `src/extension.ts`: メイン実装コード > - `README.md`: 使用方法の説明 > > ### 5. 実装する機能 > - GitHub Copilotの作業完了検知 > - VSCodeウィンドウの非アクティブ状態検知 > - macOS通知の送信(タイトル、メッセージ、サウンド付き) > - 拡張機能の適切な有効化/無効化処理 > > ### 6. 設定項目 > - 通知の有効/無効切り替え > - 通知メッセージのカスタマイズ > - ポーリング間隔の調整 > > この計画でよろしいでしょうか?承認いただけましたら実装を開始します。 > [!right-bubble] ![[minerva-face-right.webp]] > **異議あり** (もしくは中断指令) > [!right-bubble] ![[minerva-face-right.webp]] > Gemini CLIの結果を利用していますが公式サイトとのクロスチェックはされていますか? またポーリング間隔は200msだと短いので1sで大丈夫です > [!left-bubble] ![[claude-san-face.webp]] > おっしゃる通りです。Gemini CLIの結果を公式ソースで検証する必要があります。特に`github.copilot.inline.finish`などのContext Keyが実際に存在するかを確認します。 > [!left-bubble] ![[claude-san-face.webp]] > 公式ドキュメントを確認した結果、Gemini CLIが提供した`github.copilot.inline.finish`などのContext Keyについての公式記載が見つかりませんでした。これは重要な発見です。 > > 代替アプローチとして、より確実な方法を検討する必要があります: > [!left-bubble] ![[claude-san-face.webp]] > 検証の結果、Gemini CLIが提供した情報は公式ドキュメントで確認できませんでした。より信頼性の高い代替アプローチで計画を修正します: > [!left-bubble] ![[claude-san-face.webp]] > # VSCode GitHub Copilot 通知拡張機能の実装計画(修正版) > > ## 重要な発見 > - Gemini CLIが提供した`github.copilot.inline.finish`などのContext Keyは公式ドキュメントで確認できませんでした > - 公式APIを使用した確実な実装が必要です > > ## 実装アプローチ(修正版) > > ### 1. プロジェクトの初期化 > - `yo code`でVSCode拡張機能プロジェクトを生成 > - TypeScriptテンプレートを使用 > > ### 2. 必要なライブラリのインストール > - `node-notifier`: macOSネイティブ通知送信用 > - 型定義ファイル: `@types/node-notifier` > > ### 3. 代替実装方法 > **GitHub Copilotの状態監視**は以下の確実な方法で実装: > - InlineCompletionProviderの登録状況を監視 > - テキストエディターの変更イベント(`onDidChangeTextDocument`)を監視 > - カーソル位置の変更イベント(`onDidChangeTextEditorSelection`)を監視 > - これらのイベントの組み合わせでCopilotの動作を推測 > > ### 4. 核心機能の実装 > - **VSCodeウィンドウ状態監視**: `vscode.window.state.focused`でアクティブ状態を監視 > - **通知送信**: VSCodeが非アクティブ時にmacOS通知を送信 > - **ポーリング間隔**: 1秒間隔に調整 > > ### 5. 実装する機能 > - エディター変更イベントを監視してCopilotの動作を推測 > - VSCodeウィンドウの非アクティブ状態検知 > - macOS通知の送信(タイトル、メッセージ、サウンド付き) > - 拡張機能の適切な有効化/無効化処理 > > ### 6. 設定項目 > - 通知の有効/無効切り替え > - 通知メッセージのカスタマイズ > - 監視間隔の調整 > > **注意**: 公式APIが限定的なため、Copilotの正確な状態検知は困難です。エディターイベントベースの推測的な実装になります。 > > この修正された計画でよろしいでしょうか? > [!right-bubble] ![[minerva-face-right.webp]] > **異議あり** (もしくは中断指令) > [!right-bubble] ![[minerva-face-right.webp]] > github.copilot.inline.finish以外の部分はクロスチェックの結果、問題なかったということですか? > [!left-bubble] ![[claude-san-face.webp]] > はい、クロスチェックの結果は以下の通りです: > > **✅ 公式ドキュメントで確認済み** > - VSCode拡張機能の基本構造(`package.json`、`src/extension.ts`) > - `vscode.window.state.focused`プロパティ > - `vscode.window.onDidChangeWindowState`イベント > - `vscode.window.showInformationMessage`による通知 > - `languages.registerInlineCompletionItemProvider`API > > **❌ 公式ドキュメントで確認できず** > - `github.copilot.inline.finish`などのContext Key > - `vscode.commands.executeCommand('getContext', ...)`での取得方法 > - GitHub Copilot特有の状態監視API > > **🔍 追加調査が必要** > - `node-notifier`ライブラリの詳細(npmパッケージとして存在するかは確認していません) > > つまり、VSCode API関連の情報は公式で確認できましたが、GitHub Copilot固有の監視方法については公式情報が見つかりませんでした。 > [!right-bubble] ![[minerva-face-right.webp]] > "GitHub Copilotの状態監視は以下の確実な方法で実装" について、この監視方法でユーザー操作が誤って検知されてしまうことはありませんか? ユーザーが少し操作して手を止めたときに通知されたりしないか? など > [!left-bubble] ![[claude-san-face.webp]] > 的確なご指摘です。提案した監視方法には重大な問題があります: > > **❌ 誤検知の問題** > - `onDidChangeTextDocument`: ユーザーの手動入力でも発火 > - `onDidChangeTextEditorSelection`: カーソル移動でも発火 > - これらのイベントだけではCopilotの動作とユーザー操作を区別できません > > **具体的な誤検知ケース** > 1. ユーザーが数文字入力して手を止める → 通知が発火 > 2. ユーザーがカーソルを移動して作業停止 → 通知が発火 > 3. ユーザーがコードを削除して一時停止 → 通知が発火 > > **根本的な問題** > - GitHub Copilotの動作を確実に検知する公式APIが存在しない > - イベントベースの推測では精度が低すぎる > - ユーザー体験を著しく損なう可能性 > > **より現実的なアプローチ** > 1. **キーボード/マウス操作の無活動時間監視** > - 最後の操作から一定時間(例:30秒)経過後に通知 > - Copilot固有ではないが、より実用的 > > 2. **手動トリガー方式** > - ユーザーがコマンドで明示的に「作業完了」を通知 > - 確実だが自動化されない > > 3. **拡張機能の再設計** > - Copilot監視ではなく、一般的な「作業完了」通知機能 > > この問題を踏まえて、実装方針を見直す必要があります。 > [!right-bubble] ![[minerva-face-right.webp]] > 報告を聞いていると実現は厳しそうに見えます。この機能を実装することでVSCodeのパフォーマンスや安定性が低下することは極力避けたい。忖度なしにこのVSCode Extensionを実装すべきだと思いますか? リスクがあるなら公式の対応を待つので。 > [!left-bubble] ![[claude-san-face.webp]] > **実装すべきではないと思います。** > > **主な理由** > > 1. **技術的実現性の低さ** > - GitHub Copilotの状態監視APIが公式に存在しない > - 推測ベースの実装では誤検知が頻発 > - ユーザー体験を著しく損なう可能性 > > 2. **パフォーマンス上のリスク** > - 常時イベント監視によるCPU負荷 > - 1秒間隔のポーリングでもリソース消費 > - メモリリークの可能性 > > 3. **保守性の問題** > - 非公式な実装は将来的に破綻する可能性 > - GitHub Copilotの仕様変更で動作不良 > - デバッグが困難 > > 4. **より良い代替手段の存在** > - GitHub Copilotの公式機能改善を待つ > - VSCodeの通知設定で部分的に対応可能 > - 他の生産性向上手段を検討 > > **推奨アクション** > - 公式GitHub Copilot開発チームへの機能要望提出 > - VSCodeの公式機能アップデートを待つ > - 現状の作業フローの改善を検討 > > **結論** > リスクとコストが機能の価値を上回るため、実装は推奨しません。公式対応を待つのが最善の判断です。