Table of Contents

概要

この記事では、カスタム通知スクリプトとBurntToast PowerShellモジュールを使用して、WSLで動作するGithub Copilot CLIのWindows Toast通知を設定する方法を紹介します。

  • Windows PowershellにBurntToastをインストールする
  • WSLにPowerShell経由で通知を送信する通知スクリプトを作成する
  • 特定のイベント(セッション終了時やプロンプト送信時など)で通知スクリプトをトリガーするようにGithub Copilot CLIのhooksを設定する
  • Github Copilot CLIコマンドを実行し、Windows Toast通知が届くことを確認してテストする

img

PowershellにBurntToastをインストールする

WSLからWindows Toast通知を送信するために、PowershellにBurntToastモジュールをインストールします。

Install-Module -Name BurntToast -Force -Scope CurrentUser

実行ポリシーがスクリプトの実行を許可しているか確認します:

Get-ExecutionPolicy -Scope CurrentUser

実行ポリシーが制限的すぎる場合(例: Restricted)、RemoteSignedに設定します:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Powershellからテスト通知を送信して、BurntToastが動作していることを確認できます:

Import-Module BurntToast
New-BurntToastNotification -Text "Test Notification", "BurntToast is working!"

(任意)通知用のカスタムロゴを配置する

Windowsディレクトリに画像ファイル(例: logo.png)を配置することで、通知にカスタムロゴを使用できます。この記事では、ロゴをD:\your\logo\path\logo.pngに配置します。以下のスクリプトのICON変数をロゴのパスに更新してください。

カスタムロゴ付きの通知をテストできます:

Import-Module BurntToast
New-BurntToastNotification -Text "Test Notification", "BurntToast is working!" -AppLogo "D:\your\logo\path\logo.png"

WSLに通知スクリプトを作成する

例えばvim ~/.bin/copilot-notify.shでスクリプトファイルを作成し、以下の内容を追加します:

#!/bin/bash
# copilot-notify.sh
# Copilot CLIのhooksがトリガーされた時にWindows Toast通知を送信します。
# Copilot CLIはhookデータをJSON形式でstdin経由で渡します。
# hookイベント名はCOPILOT_HOOK_EVENT環境変数経由で渡されます。

# 一般的なバイナリが利用可能であることを保証する
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"

# stdinからJSONペイロードを読み取る
STDIN=$(cat)

# デバッグログ — トラブルシューティング時にコメントを外してください
#{
#  echo "=== $(date) ==="
#  echo "COPILOT_HOOK_EVENT: $COPILOT_HOOK_EVENT"
#  echo "STDIN: $STDIN"
#} >> /tmp/copilot-hook-debug.log 2>&1

# hookイベントに基づいて通知のタイトルとメッセージを設定する
case "$COPILOT_HOOK_EVENT" in
  "sessionEnd")
    TITLE="Copilot - Done"
    MESSAGE="Session completed!"
    ;;
  "preToolUse")
    TITLE="Copilot - Action Needed"
    MESSAGE="Waiting for your input!"
    ;;
  "errorOccurred")
    TITLE="Copilot - Error"
    MESSAGE="An error occurred!"
    ;;
  *)
    TITLE="Copilot"
    MESSAGE="Notification"
    ;;
esac

# WSLアイコンパスをPowerShell用のWindowsパスに変換する
ICON="/mnt/d/your/logo/path/logo.png"
WIN_ICON=$(wslpath -w "$ICON" 2>/dev/null)

# BurntToast PowerShellモジュール経由でWindows Toast通知を送信する
/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command "
Import-Module BurntToast
New-BurntToastNotification -Text '$TITLE', '$MESSAGE' -AppLogo '$WIN_ICON'
" 2>/dev/null

# フォールバック: PowerShell通知が失敗した場合のターミナルベル
echo -e "\a"

スクリプトを実行可能にします:

chmod +x ~/.bin/copilot-notify.sh

Copilot CLIのhooksを設定する

hooks.jsonを作成する

hooks設定ファイルを作成します。~/.copilot/hooks.jsonに一元管理し、各プロジェクトにシンボリックリンクを作成します:

{
  "version": 1,
  "hooks": {
    "sessionEnd": [
      {
        "type": "command",
        "bash": "/home/your-username/.bin/copilot-notify.sh",
        "timeoutSec": 10,
        "env": { "COPILOT_HOOK_EVENT": "sessionEnd" }
      }
    ],
    "preToolUse": [
      {
        "type": "command",
        "bash": "/home/kktsuji/.bin/copilot-notify.sh",
        "timeoutSec": 10,
        "env": { "COPILOT_HOOK_EVENT": "preToolUse" }
      }
    ],
    "errorOccurred": [
      {
        "type": "command",
        "bash": "/home/your-username/.bin/copilot-notify.sh",
        "timeoutSec": 10,
        "env": { "COPILOT_HOOK_EVENT": "errorOccurred" }
      }
    ]
  }
}

/home/your-username/.bin/copilot-notify.shを実際の通知スクリプトのパスに置き換えてください。

利用可能なhookイベントは以下の通りです:

イベント 説明
sessionStart セッション開始
sessionEnd セッション完了
userPromptSubmitted ユーザーがプロンプトを送信
preToolUse ツール使用前
postToolUse ツール使用後
errorOccurred エラー発生

hooksの詳細については、Using hooks with GitHub Copilot CLIのドキュメントを参照してください。

プロジェクトにhooks.jsonをシンボリックリンクする

Copilot CLIはカレントディレクトリの.github/hooks/hooks.jsonからhooksを読み込みます。通知を有効にしたい各プロジェクトにシンボリックリンクを作成します:

mkdir -p your-project/.github/hooks
ln -s ~/.copilot/hooks.json your-project/.github/hooks/hooks.json

これにより、単一のhooks.jsonを管理し、複数のプロジェクトで共有できます。

Copilot CLIでテストする

プロジェクトディレクトリに移動してCopilot CLIを実行します:

cd your-project
copilot

次に、hooksをトリガーするために小さなリクエストを送信します。例えば:

> hi

すべてが正しく設定されていれば、以下のタイミングでWindows Toast通知が表示されるはずです:

  • セッション終了時(sessionEnd
  • エラー発生時(errorOccurred

img

デバッグ

通知が表示されない場合は、~/.bin/copilot-notify.shのデバッグブロックのコメントを外してデバッグログを有効にします:

# デバッグログ — トラブルシューティング時にコメントを外してください
{
  echo "=== $(date) ==="
  echo "COPILOT_HOOK_EVENT: $COPILOT_HOOK_EVENT"
  echo "STDIN: $STDIN"
} >> /tmp/copilot-hook-debug.log 2>&1

その後、/tmp/copilot-hook-debug.logのログを確認します:

cat /tmp/copilot-hook-debug.log

Copilot CLIの実行後にログファイルが存在しない場合、hooksが読み込まれていません。以下を確認してください:

  1. シンボリックリンクが有効であること: ls -la your-project/.github/hooks/hooks.json
  2. hooks.jsonのパスが.github/hooks/hooks.jsonであること(プロジェクトルートではない)
  3. 通知スクリプトが実行可能であること: ls -la ~/.bin/copilot-notify.sh

スクリプトを直接テストすることもできます:

echo '{"timestamp":1704614400000}' | COPILOT_HOOK_EVENT=sessionEnd ~/.bin/copilot-notify.sh

セットアップの動作が確認できたら、不要なログを避けるためにデバッグログの行をコメントアウトしてください。