Files
tech/.claude/tools/user-prompt-submit.sh
T
arno df787f42ae 功能(ClaudeCode): prompt-submit 识别并跳过技能命令
当用户输入匹配 .claude/skills/ 下的技能时直接退出,避免对技能命令执行额外处理
2026-06-29 17:45:38 +08:00

74 lines
2.3 KiB
Bash
Executable File

#!/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
# 排除 .claude/skills/ 中的技能(/arno-prj-commit 等)
SKILLS_DIR="${PROJECT_ROOT}/.claude/skills"
if [ -d "${SKILLS_DIR}" ]; then
# 提取技能名(去掉参数部分),如 "/arno-prj-commit xxx" -> "arno-prj-commit"
SKILL_NAME=$(echo "${USER_PROMPT}" | sed 's|^/\([^ ]*\).*$|\1|')
if [ -n "${SKILL_NAME}" ] && [ -f "${SKILLS_DIR}/${SKILL_NAME}/SKILL.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