Files
tech/.claude/hooks/user-prompt-submit.sh
T
arno d82e2a21b6 文档: 添加 Claude Code 学习资源与项目配置
- 添加 .claude 配置目录(CLAUDE.md、commands、hooks、memory)
- 添加项目根目录 CLAUDE.md
- 更新工程 README.md,新增 Claw Code 链接
- 更新知识/金鹏.md,添加 2026-04-10 文章分享内容
- 添加知识图片和参考资料 PDF
2026-04-09 14:18:25 +08:00

64 lines
1.9 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# UserPromptSubmit Hook
# 记录用户在 Claude Code 中的输入到 .member/{username}.md 文件
# ============================================================================
# 获取当前用户名
USER_NAME=$(whoami)
# 项目根目录(脚本所在位置的上级目录)
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MEMBER_DIR="${PROJECT_ROOT}/.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/ 中的命令(/arno-pr 等)
COMMANDS_DIR="${PROJECT_ROOT}/.claude/commands"
if [ -d "${COMMANDS_DIR}" ]; then
# 提取命令名(去掉参数部分),如 "/arno-pr xxx" -> "arno-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