hooks

Blaze CLI のライフサイクルの節目で、任意のシェルコマンドを自動的に呼び出せます。履歴の記録、デスクトップ通知、独自の自動化スクリプトなど、Blaze を自分の作業フローに合わせて拡張するための仕組みです。

どのタイミングで動くか

現在対応している event は次の 4 つです。

  • SessionStart — Blaze のセッションが始まった直後(初回入力を受け取る前)
  • SessionEnd — セッションが終わった直後(ターミナルが閉じる直前)
  • PreCompact/compact で会話履歴を圧縮する直前
  • Stop — Blaze の応答が完了した直後(成功・エラー両方)

設定ファイル

設定は ~/.blaze/settings.json に書きます(環境別: production = .blaze, staging = .blaze-stg, development = .blaze-dev)。ファイルがなければ自分で作成してください。

基本構造:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          { "type": "command", "command": "echo started >> ~/blaze.log" }
        ]
      }
    ]
  }
}

hooks.<Event> は配列で、複数のエントリを並べることができます。各エントリの hooks 配下にも複数のコマンドを並べられます。

コマンドに渡される情報

各コマンドは標準入力経由で次の JSON を受け取ります。

{
  "session_id": "01HXXXXXXXXXXXXXXXXX",
  "transcript_path": "",
  "cwd": "/Users/you/projects/my-org",
  "hook_event_name": "SessionStart"
}

スクリプトの中で jq や Python などを使って、必要なフィールドだけ抜き出して処理する想定です。

例: セッションごとにログを残す

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '\"[\\(.hook_event_name)] \\(.session_id) cwd=\\(.cwd)\"' >> ~/blaze.log"
          }
        ]
      }
    ],
    "SessionEnd": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '\"[\\(.hook_event_name)] \\(.session_id)\"' >> ~/blaze.log"
          }
        ]
      }
    ]
  }
}

例: 応答完了時にデスクトップ通知(macOS)

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Blaze finished\" with title \"Blaze CLI\"'"
          }
        ]
      }
    ]
  }
}

動作についての注意

  • 各コマンドはシェル(Unix では sh -c、Windows では cmd /C)で実行されます

  • タイムアウトは 10 秒です。超えたコマンドは強制終了されます

  • 終了コードが 0 以外でも Blaze の動作は止まりません(ログに warn が出るだけです)

  • fire-and-forget なので、Blaze 本体は hook の完了を待ちません

  • ファイルが存在しない・JSON が壊れている・該当 event の配列がない、いずれの場合も「hook なし」として扱われ、Blaze の起動・動作は妨げません

トラブルシューティング

hook が動かない時は、次の順で確認してください。

  1. ~/.blaze/settings.json が正しい JSON か(cat ~/.blaze/settings.json | jq . でパースできるか)

  2. hooks.<Event> の event 名が Stop / SessionStart / SessionEnd / PreCompact のいずれかと完全一致しているか(大文字小文字を区別します)

  3. 各エントリの type"command" になっているか

  4. コマンド単体をターミナルで実行できるか(PATH や権限の問題は hook 経由でも同様に発生します)