Files
gh-baton8-takushinotifier/hooks/notify.sh
2025-11-29 18:00:39 +08:00

90 lines
3.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 音声通知スクリプト
# 最後のメッセージを取得し、要約してメッセージを読み上げ
# 標準入力からJSONを読み取る
INPUT=$(cat)
# プラグインのディレクトリを取得
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PLUGIN_DIR="$(dirname "$SCRIPT_DIR")"
HOOKS_DIR="$SCRIPT_DIR"
NOTIFY_LOG_PATH="$HOOKS_DIR/notify.log"
# ログディレクトリの作成
mkdir -p "$HOOKS_DIR"
# トランスクリプトを処理(.jsonl形式に対応
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path')
if [ -f "$TRANSCRIPT_PATH" ]; then
# 最後のアシスタントメッセージのみを取得(全文)
TEMP_FILE=$(mktemp)
if command -v tail >/dev/null 2>&1; then
tail -r "$TRANSCRIPT_PATH" > "$TEMP_FILE"
LAST_MESSAGE=""
while IFS= read -r line; do
# JSON形式の妥当性をチェック
if echo "$line" | jq -e . >/dev/null 2>&1; then
if echo "$line" | jq -e '.type == "assistant"' >/dev/null 2>&1; then
LAST_MESSAGE=$(echo "$line" | jq -r '.message.content[]? | select(.type == "text") | .text' 2>/dev/null)
break
fi
fi
done < "$TEMP_FILE"
rm -f "$TEMP_FILE"
fi
# メッセージが取得できた場合の処理
if [ -n "$LAST_MESSAGE" ]; then
# 最後のメッセージの1行目を取得最大100文字
MESSAGE=$(echo "$LAST_MESSAGE" | head -n 1 | head -c 100 | sed 's/[[:space:]]*$//')
# メッセージが空の場合はデフォルト文例
if [ -z "$MESSAGE" ]; then
MESSAGE="処理が完了しました。"
fi
# プロジェクト名を取得して追加
PROJECT_PATH=$(echo "$INPUT" | jq -r '.cwd // empty')
if [ -n "$PROJECT_PATH" ]; then
PROJECT_MANAGER="$HOOKS_DIR/project_manager.sh"
if [ -f "$PROJECT_MANAGER" ]; then
PROJECT_NAME=$(bash "$PROJECT_MANAGER" get "$PROJECT_PATH" 2>/dev/null || echo "")
if [ -n "$PROJECT_NAME" ]; then
MESSAGE="${PROJECT_NAME}のたくしです。${MESSAGE}"
fi
fi
fi
# 通知実行
# terminal-notifier使用Macネイティブ通知
if command -v terminal-notifier >/dev/null 2>&1; then
terminal-notifier -message "$MESSAGE" -title "Assistant" >/dev/null 2>&1 &
fi
# 音声出力Style-Bert-VITS2
TTS_SCRIPT="$HOOKS_DIR/tts_bert_vits.sh"
if [ -f "$TTS_SCRIPT" ]; then
nohup bash "$TTS_SCRIPT" "$MESSAGE" >/dev/null 2>&1 &
fi
# ログ保存(タイムスタンプ|発言のみ、改行除去)
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
CLEAN_MESSAGE=$(echo "$MESSAGE" | tr -d '\n\r' | sed 's/[[:space:]]\+/ /g' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo "$TIMESTAMP|$CLEAN_MESSAGE" >> "$NOTIFY_LOG_PATH"
# ログを10件までに制限
if [ -f "$NOTIFY_LOG_PATH" ]; then
TEMP_LOG=$(mktemp)
tail -n 10 "$NOTIFY_LOG_PATH" > "$TEMP_LOG"
mv "$TEMP_LOG" "$NOTIFY_LOG_PATH"
fi
fi
fi
echo '{"decision": "approve"}'
exit 0