实现 Claude Code 任务完成自动通知
摘要:本文介绍如何通过编写 Shell 脚本并接入 Claude Code 的 Hook 机制,实现任务完成或等待输入时的飞书自动通知。用户需创建脚本解析 JSON 数据,在设置文件中配置 Notification 和 Stop 事件触发该脚本,从而在远程 Vibe Coding 时无需守候电脑即可接收实时反馈。
前言
书接上回《随时随地 Vibe Coding 及验证》,在远程 Vibe Coding 时,输入命令后,等 Agent 完成的时候,总不能一直守着电脑或手机,那与我们随时编码的初衷相违背。
在上回最后,留了一个悬念,就是让 Claude Code 在任务完成或等待人为输入时,手动通知下我们。
编写 WebHook 脚本
首先,创建一个用于发送 Webhook 的 Shell 脚本(例如命名为 webhook-notify.sh)。该脚本会读取 Claude Code 传入的上下文信息(如项目路径、会话 ID 等),并根据触发的事件类型发送不同的通知内容。在此一样使用飞书的自定义机器人 WebHook。
以下是脚本内容:
bash
#!/bin/bash
# webhook-notify.sh
# 读取 Claude Code 通过标准输入传递的 JSON 数据
INPUT=$(cat)
# 解析 JSON 数据(需确保系统已安装 jq)
if command -v jq >/dev/null 2>&1; then
session_id=$(echo "$INPUT" | jq -r '.session_id // "unknown"')
project_dir=$(echo "$INPUT" | jq -r '.cwd // "unknown"')
hook_event=$(echo "$INPUT" | jq -r '.hook_event_name // "unknown"')
else
session_id="unknown"
project_dir=$(pwd)
hook_event="unknown"
fi
# 提取项目名称
project_name=$(basename "$project_dir")
# 根据事件类型构造不同的消息内容
case "$hook_event" in
"Notification")
message="🔔 等待输入:Claude Code 正在等待您的确认或输入。"
;;
"Stop")
message="✅ 任务完成:Claude Code 已完成当前任务。"
;;
*)
message="📢 未知事件:$hook_event"
;;
esac
# 替换为你的实际 Webhook URL
WEBHOOK_URL="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxx"
# 请求数据
full_message=$(cat <<EOF
{
"msg_type": "interactive",
"card": {
"header": {
"title": {
"tag": "plain_text",
"content": "${message}"
},
"template": "blue"
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "📁 项目:${project_name} \n🔗 会话:${session_id:0:8}"
}
}
]
}
}
EOF
)
echo $full_message
# 发送 POST 请求(异步执行,不阻塞 Claude)
curl -s -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "$full_message" &
exit 0把脚本写入到用户目录下的claude目录下,如~/.claude/shell/webhook-notify.sh,然后赋予执行权限。
bash
chmod +x webhook-notify.sh可以在终端测试发送是否成功:
bash
echo '{"hook_event_name":"Stop","session_id":"test-session-12345","cwd":"/Users/yourname/projects/my-app"}' | /绝对路径/webhook-notify.sh接入 Claude Code Hook
要实现自动通知,可以利用 Claude Code 的 Notification(需要用户输入/通知时)和 Stop(任务完成时)这两个生命周期事件。
打开用户目录下的 claude 设置文件 ~/.claude/setting.json,补充到hook字段中
json
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "/绝对路径/webhook-notify.sh",
"timeout": 10
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "/绝对路径/webhook-notify.sh",
"timeout": 10
}
]
}
]
}
}测试执行结果
执行 Claude Code 随便输入 hello,然后等飞书结果