Files
team/.claude/hooks/save-title-on-clear.sh
T
2026-04-19 21:47:08 +08:00

45 lines
1.4 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# SessionEnd Hook: /clear 时保存会话标题并启动后台 tmux 恢复
#
# 流程:
# 1. 从 transcript JSONL 提取 customTitle
# 2. 保存到临时文件
# 3. 启动后台脚本通过 tmux send-keys 发送 /rename
# ============================================================================
# 从 stdin 读取 JSON(3 秒超时防止阻塞)
INPUT=$(timeout 3 cat 2>/dev/null) || exit 0
[ -z "${INPUT}" ] && exit 0
# 只在 /clear 时执行
REASON=$(echo "${INPUT}" | jq -r '.reason // empty')
[ "${REASON}" != "clear" ] && exit 0
SESSION_ID=$(echo "${INPUT}" | jq -r '.session_id // empty')
TRANSCRIPT=$(echo "${INPUT}" | jq -r '.transcript_path // empty')
# 从 transcript JSONL 提取最后的 customTitle
TITLE=""
if [ -n "${TRANSCRIPT}" ] && [ -f "${TRANSCRIPT}" ]; then
TITLE=$(grep '"custom-title"' "${TRANSCRIPT}" | tail -1 | jq -r '.customTitle // empty' 2>/dev/null)
fi
# 没有标题需要保留
[ -z "${TITLE}" ] && exit 0
# 保存标题到临时文件
TMP_FILE="/tmp/claude-saved-title-${SESSION_ID}"
printf '%s' "${TITLE}" > "${TMP_FILE}"
# 获取当前 tmux pane ID
TMUX_PANE_ID="${TMUX_PANE:-}"
[ -z "${TMUX_PANE_ID}" ] && exit 0
# 启动后台恢复脚本
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
nohup "${SCRIPT_DIR}/restore-title-via-tmux.sh" "${TMUX_PANE_ID}" "${TMP_FILE}" > /dev/null 2>&1 &
disown
exit 0