#!/bin/bash # ============================================================================ # UserPromptSubmit Hook # 记录用户在 Claude Code 中的输入到 member/{username}.md 文件 # ============================================================================ # 获取当前用户名 USER_NAME=$(whoami) # 项目根目录(使用当前工作目录,适用于全局 hook 多项目复用) PROJECT_ROOT="${PWD}" MEMBER_DIR="${PROJECT_ROOT}/.claude/member" # 确保 member 目录存在 mkdir -p "${MEMBER_DIR}" # 用户日志文件 USER_LOG="${MEMBER_DIR}/${USER_NAME}.chat.md" # 从 stdin 读取 JSON 输入(3 秒超时防止阻塞) INPUT_JSON=$(timeout 3 cat 2>/dev/null) || exit 0 # 如果输入为空,退出 if [ -z "${INPUT_JSON}" ]; then exit 0 fi # 提取用户输入内容 # Claude Code UserPromptSubmit hook 传递的 JSON 格式: {"prompt": "用户输入"} USER_PROMPT=$(echo "${INPUT_JSON}" | jq -r '.prompt // empty' 2>/dev/null) # 如果无法提取内容,尝试直接使用输入 if [ -z "${USER_PROMPT}" ]; then USER_PROMPT="${INPUT_JSON}" fi # 如果输入为空,退出 if [ -z "${USER_PROMPT}" ]; then exit 0 fi # 排除 .claude/commands/ 中的命令(/isos-pr 等) COMMANDS_DIR="${PROJECT_ROOT}/.claude/commands" if [ -d "${COMMANDS_DIR}" ]; then # 提取命令名(去掉参数部分),如 "/isos-pr xxx" -> "isos-pr" CMD_NAME=$(echo "${USER_PROMPT}" | sed 's|^/\([^ ]*\).*$|\1|') if [ -n "${CMD_NAME}" ] && [ -f "${COMMANDS_DIR}/${CMD_NAME}.md" ]; then exit 0 fi fi # 获取当前时间戳 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 如果文件不存在,创建并添加文件头 if [ ! -f "${USER_LOG}" ]; then printf '# %s 的对话记录\n\n' "${USER_NAME}" > "${USER_LOG}" fi # 追加用户输入到文件(使用 printf 避免内容中的特殊字符导致 heredoc 展开问题) printf '\n## %s\n\n%s\n\n' "${TIMESTAMP}" "${USER_PROMPT}" >> "${USER_LOG}" exit 0