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 が動かない時は、次の順で確認してください。
-
~/.blaze/settings.jsonが正しい JSON か(cat ~/.blaze/settings.json | jq .でパースできるか) -
hooks.<Event>の event 名がStop/SessionStart/SessionEnd/PreCompactのいずれかと完全一致しているか(大文字小文字を区別します) -
各エントリの
typeが"command"になっているか -
コマンド単体をターミナルで実行できるか(PATH や権限の問題は hook 経由でも同様に発生します)