让Claude Code跑个长任务切去做别的事然后忘了回来看——这种事我干过不止一次。或者反过来一直盯着终端干等啥也干不了。Claude Code的Hooks机制可以在任务完成时主动通知你。但原生通知就一句任务已完成冷冰冰的没有温度。我从Hooks基础开始一步步做出了一个有性格的通知系统它知道现在几点、任务跑了多久、成功还是失败然后用一句有趣的话通知你。先看看效果装完之后终端完成消息通知长这样飞书消息通知效果图Mac电脑系统通知效果图有那味儿了吧接下来说怎么实现的。开源仓库学习地址https://github.com/leeandrew94/claude-notify一、Claude Code Hooks是什么Hooks是Claude Code提供的事件钩子系统。特定事件发生时工具执行、会话结束、通知触发等Claude Code会自动运行你预定义的Shell命令。前端的同学可以类比Vue的onMounted后端的类比PostConstruct——在关键节点插入自定义逻辑。1.1 配置位置Hooks写在~/.claude/settings.json的hooks字段里结构长这样{ hooks: { 事件名称: [ { matcher: 可选的匹配规则, hooks: [ { type: command, command: 你的 Shell 命令 } ] } ] } }1.2 事件类型Claude Code支持多种事件可以在终端用/hooks命令查看完整列表。这里截图前半部分按键盘下键可以继续下拉查看更多挑几个比较实用的列出来类别事件触发时机工具执行PreToolUse工具执行前工具执行PostToolUse工具执行后会话生命周期SessionStart会话启动会话生命周期SessionEnd会话结束会话生命周期StopClaude 处理完毕等待用户输入通知Notification系统通知事件任务完成、等待输入等子代理SubagentStart/SubagentStop子代理启动/停止压缩PreCompact/PostCompact压缩前后我们要实现的功能关注Notification和Stop两个事件就够了。1.3 数据传递方式Hook执行时Claude Code通过Stdin JSON传递上下文// Notification 事件的 stdin { session_id: abc123, message: Claude is waiting for your input } // Stop 事件的 stdin { session_id: abc123, stop_hook_reason: end_turn }同时通过环境变量提供元数据变量说明CLAUDE_HOOK_EVENT事件名称Notification / StopCLAUDE_SESSION_ID会话 IDCLAUDE_PROJECT_DIR项目目录二、最简单的通知Hook了解了基础先来一个最小实现。把下面这段复制到~/.claude/settings.json里就能用{ hooks: { Notification: [ { hooks: [ { type: command, command: osascript -e display notification \任务完成\ with title \Claude Code\ } ] } ] } }在Claude Code终端随便问个问题任务完成时macOS侧边栏会弹一条系统通知但这就是一行固定文案没有灵魂。三、设计思路我这人有点审美洁癖总觉得看这种干巴巴的通知缺点啥。于是在本子上写写画画就有了claude-notify的设计想法。3.1 我想要的通知长什么样不是一条通知而是一个通知系统有人格— 不是任务完成而是早安打工人刚好够去倒杯水搞定了 ☕有感知— 知道现在几点、任务跑了多久、成功还是失败跨平台— macOS、Windows、Linux都能用可扩展— 支持企业微信、飞书、ntfy.sh 等webhook推送易管理— CLI 命令行配置不用手动改 JSON3.2 架构设计人格引擎负责平台无关的文案生成通知发送走平台相关的逻辑各管各的。四、让通知有点灵魂文案不是随机挑选而是基于四个维度的感知来组合输入: Build completed successfully. Took 8m 22s. All 42 tests passed. 感知结果: 时段 → 下午 (afternoon) ☕ 耗时 → 502 秒8 分 22 秒 类型 → build构建 成败 → success耗时提取从message中用正则提取中英文都支持。# 中文: 耗时 3 分 22 秒 cn_min$(echo $msg | grep -oE 耗时[ ]*([0-9])[ ]*分) cn_sec$(echo $msg | grep -oE ([0-9])[ ]*秒) # 英文: took 3m 22s / 8 minutes / 42s en_min$(echo $msg | grep -oiE ([0-9])\s*(m|min|minutes?)) en_sec$(echo $msg | grep -oiE ([0-9])\s*(s|sec|seconds?))任务类型识别通过关键词匹配。test → test|测试|spec|jest|pytest|pass build → build|构建|compile|webpack|vite deploy → deploy|部署|release|publish refactor→ refactor|重构|migrate|迁移文案组合三元组拼接——[时段] [耗时/场景] [结果]。早安打工人 刚好够去倒杯水 搞定了 → 早安打工人刚好够去倒杯水搞定了 每个维度从对应文案池里随机选取组合结果几乎不会重复。时段文案池部分时段文案示例凌晨 (0-6点)凌晨还在卷 / 修仙成功 / 夜猫子辛苦了早上 (6-9点)早安打工人 / 晨间任务完成 / 新的一天从搞定开始午饭 (12-14点)饭点任务完成 / 先吃饭再说 / 午休都不放过深夜 (21-24点)夜深了 / 夜猫子模式 / 搞完就去睡吧耗时文案池部分耗时文案示例30s秒完 / 比你泡咖啡还快 / 手速惊人1-5min刚好够去倒杯水 / 完美泡面时间5min等了好久... 你是不是去摸鱼了 / 终于建议奖励自己一杯奶茶15min等了好久好久... 你确定不来看看 / 这时间够看一集短剧了结果文案池部分结果文案示例成功测试测试全绿 / 全部通过 / 今天可以安心下班了成功构建构建成功 / 编译通过 / 打包完成失败翻车了 / 出了点问题 / 代码它不听话了五、跨平台通知发送通过shell脚本检测当前系统detect_platform() { case $(uname -s) in Darwin*) PLATFORMmacos ;; Linux*) PLATFORMlinux ;; MINGW*|MSYS*|CYGWIN*) PLATFORMwindows ;; esac }各平台实现命令如下macOS—osascript侧边栏通知自动适配osascript -e display notification \$BODY\ with title \$TITLE\ sound name \$SOUND\Windows— PowerShell Toast 通知[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(claude-notify).Show($toast)Linux—notify-sendnotify-send -a claude-notify -i dialog-information $TITLE $BODY六、Webhook 推送可选之前写过Claude Code接入飞书CLI的文章那肯定要用起来。支持通过Webhook推送到手机飞书开源CLI了保姆级教程手把手教你接 Claude Code通道场景实现方式企业微信团队协作群机器人 WebhookPOST markdown飞书团队协作自定义机器人 WebhookPOST 卡片消息ntfy.sh个人推送开源免费手机装 app 订阅 topic自定义任意接口POST JSON{title, body, session_id}企微的话一个POST请求就搞定curl -X POST $WEBHOOK_URL \ -H Content-Type: application/json \ -d { msgtype: markdown, markdown: { content: **早安打工人搞定了 **\n\n所有测试通过。 } }手动改配置文件太原始了所以我把claude-notify做成了CLI通过命令直接配置对标Claude Code的 CLI玩法。看看怎么操作的安装执行./install.sh它会自动创建软连接不污染你的环境飞书 Webhook 配置流程群设置 → 群机器人 → 「添加机器人」→ 选择「自定义机器人」→ 复制「webhook」地址创建机器人 → 选择添加机器人复制webhook地址终端执行claude-notify channel feishu填写对应信息就完成了不想用了一键卸载./uninstall.sh # 尽量给 sudo 权限最后说两句这个通知功能一开始就是满足自己需求用着用着就迭代成现在这样了。写这篇文章主要是分享做工具的思路顺便学习Claude Code Hooks的用法。做一个工具不是上来就vibe coding得先构思、确认方案可行性、在本子上画画图和框架再跟Claude Code对话问它如果要实现这个功能我应该如何做、需要为你提供什么最后确认完整方案再动手接着就是反复调整验证。claude-notify这个东西最让我觉得有趣的地方不是技术多复杂代码多难写而是每次看到早安打工人刚好够去倒杯水搞定了这种消息的时候会觉得这不像一个工具更像一个搭档。毕竟工作生活都要开心的嘛好了就到这里啦大家也可以点点star还在持续迭代中我是赛博李同学大厂写代码的。觉得有用的话点个赞 转发给需要的 TA感谢支持我们下期再见
我给Claude Code加了个有趣的灵魂,同事看完急的不行,非让我分享给他
发布时间:2026/5/20 9:12:13
让Claude Code跑个长任务切去做别的事然后忘了回来看——这种事我干过不止一次。或者反过来一直盯着终端干等啥也干不了。Claude Code的Hooks机制可以在任务完成时主动通知你。但原生通知就一句任务已完成冷冰冰的没有温度。我从Hooks基础开始一步步做出了一个有性格的通知系统它知道现在几点、任务跑了多久、成功还是失败然后用一句有趣的话通知你。先看看效果装完之后终端完成消息通知长这样飞书消息通知效果图Mac电脑系统通知效果图有那味儿了吧接下来说怎么实现的。开源仓库学习地址https://github.com/leeandrew94/claude-notify一、Claude Code Hooks是什么Hooks是Claude Code提供的事件钩子系统。特定事件发生时工具执行、会话结束、通知触发等Claude Code会自动运行你预定义的Shell命令。前端的同学可以类比Vue的onMounted后端的类比PostConstruct——在关键节点插入自定义逻辑。1.1 配置位置Hooks写在~/.claude/settings.json的hooks字段里结构长这样{ hooks: { 事件名称: [ { matcher: 可选的匹配规则, hooks: [ { type: command, command: 你的 Shell 命令 } ] } ] } }1.2 事件类型Claude Code支持多种事件可以在终端用/hooks命令查看完整列表。这里截图前半部分按键盘下键可以继续下拉查看更多挑几个比较实用的列出来类别事件触发时机工具执行PreToolUse工具执行前工具执行PostToolUse工具执行后会话生命周期SessionStart会话启动会话生命周期SessionEnd会话结束会话生命周期StopClaude 处理完毕等待用户输入通知Notification系统通知事件任务完成、等待输入等子代理SubagentStart/SubagentStop子代理启动/停止压缩PreCompact/PostCompact压缩前后我们要实现的功能关注Notification和Stop两个事件就够了。1.3 数据传递方式Hook执行时Claude Code通过Stdin JSON传递上下文// Notification 事件的 stdin { session_id: abc123, message: Claude is waiting for your input } // Stop 事件的 stdin { session_id: abc123, stop_hook_reason: end_turn }同时通过环境变量提供元数据变量说明CLAUDE_HOOK_EVENT事件名称Notification / StopCLAUDE_SESSION_ID会话 IDCLAUDE_PROJECT_DIR项目目录二、最简单的通知Hook了解了基础先来一个最小实现。把下面这段复制到~/.claude/settings.json里就能用{ hooks: { Notification: [ { hooks: [ { type: command, command: osascript -e display notification \任务完成\ with title \Claude Code\ } ] } ] } }在Claude Code终端随便问个问题任务完成时macOS侧边栏会弹一条系统通知但这就是一行固定文案没有灵魂。三、设计思路我这人有点审美洁癖总觉得看这种干巴巴的通知缺点啥。于是在本子上写写画画就有了claude-notify的设计想法。3.1 我想要的通知长什么样不是一条通知而是一个通知系统有人格— 不是任务完成而是早安打工人刚好够去倒杯水搞定了 ☕有感知— 知道现在几点、任务跑了多久、成功还是失败跨平台— macOS、Windows、Linux都能用可扩展— 支持企业微信、飞书、ntfy.sh 等webhook推送易管理— CLI 命令行配置不用手动改 JSON3.2 架构设计人格引擎负责平台无关的文案生成通知发送走平台相关的逻辑各管各的。四、让通知有点灵魂文案不是随机挑选而是基于四个维度的感知来组合输入: Build completed successfully. Took 8m 22s. All 42 tests passed. 感知结果: 时段 → 下午 (afternoon) ☕ 耗时 → 502 秒8 分 22 秒 类型 → build构建 成败 → success耗时提取从message中用正则提取中英文都支持。# 中文: 耗时 3 分 22 秒 cn_min$(echo $msg | grep -oE 耗时[ ]*([0-9])[ ]*分) cn_sec$(echo $msg | grep -oE ([0-9])[ ]*秒) # 英文: took 3m 22s / 8 minutes / 42s en_min$(echo $msg | grep -oiE ([0-9])\s*(m|min|minutes?)) en_sec$(echo $msg | grep -oiE ([0-9])\s*(s|sec|seconds?))任务类型识别通过关键词匹配。test → test|测试|spec|jest|pytest|pass build → build|构建|compile|webpack|vite deploy → deploy|部署|release|publish refactor→ refactor|重构|migrate|迁移文案组合三元组拼接——[时段] [耗时/场景] [结果]。早安打工人 刚好够去倒杯水 搞定了 → 早安打工人刚好够去倒杯水搞定了 每个维度从对应文案池里随机选取组合结果几乎不会重复。时段文案池部分时段文案示例凌晨 (0-6点)凌晨还在卷 / 修仙成功 / 夜猫子辛苦了早上 (6-9点)早安打工人 / 晨间任务完成 / 新的一天从搞定开始午饭 (12-14点)饭点任务完成 / 先吃饭再说 / 午休都不放过深夜 (21-24点)夜深了 / 夜猫子模式 / 搞完就去睡吧耗时文案池部分耗时文案示例30s秒完 / 比你泡咖啡还快 / 手速惊人1-5min刚好够去倒杯水 / 完美泡面时间5min等了好久... 你是不是去摸鱼了 / 终于建议奖励自己一杯奶茶15min等了好久好久... 你确定不来看看 / 这时间够看一集短剧了结果文案池部分结果文案示例成功测试测试全绿 / 全部通过 / 今天可以安心下班了成功构建构建成功 / 编译通过 / 打包完成失败翻车了 / 出了点问题 / 代码它不听话了五、跨平台通知发送通过shell脚本检测当前系统detect_platform() { case $(uname -s) in Darwin*) PLATFORMmacos ;; Linux*) PLATFORMlinux ;; MINGW*|MSYS*|CYGWIN*) PLATFORMwindows ;; esac }各平台实现命令如下macOS—osascript侧边栏通知自动适配osascript -e display notification \$BODY\ with title \$TITLE\ sound name \$SOUND\Windows— PowerShell Toast 通知[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(claude-notify).Show($toast)Linux—notify-sendnotify-send -a claude-notify -i dialog-information $TITLE $BODY六、Webhook 推送可选之前写过Claude Code接入飞书CLI的文章那肯定要用起来。支持通过Webhook推送到手机飞书开源CLI了保姆级教程手把手教你接 Claude Code通道场景实现方式企业微信团队协作群机器人 WebhookPOST markdown飞书团队协作自定义机器人 WebhookPOST 卡片消息ntfy.sh个人推送开源免费手机装 app 订阅 topic自定义任意接口POST JSON{title, body, session_id}企微的话一个POST请求就搞定curl -X POST $WEBHOOK_URL \ -H Content-Type: application/json \ -d { msgtype: markdown, markdown: { content: **早安打工人搞定了 **\n\n所有测试通过。 } }手动改配置文件太原始了所以我把claude-notify做成了CLI通过命令直接配置对标Claude Code的 CLI玩法。看看怎么操作的安装执行./install.sh它会自动创建软连接不污染你的环境飞书 Webhook 配置流程群设置 → 群机器人 → 「添加机器人」→ 选择「自定义机器人」→ 复制「webhook」地址创建机器人 → 选择添加机器人复制webhook地址终端执行claude-notify channel feishu填写对应信息就完成了不想用了一键卸载./uninstall.sh # 尽量给 sudo 权限最后说两句这个通知功能一开始就是满足自己需求用着用着就迭代成现在这样了。写这篇文章主要是分享做工具的思路顺便学习Claude Code Hooks的用法。做一个工具不是上来就vibe coding得先构思、确认方案可行性、在本子上画画图和框架再跟Claude Code对话问它如果要实现这个功能我应该如何做、需要为你提供什么最后确认完整方案再动手接着就是反复调整验证。claude-notify这个东西最让我觉得有趣的地方不是技术多复杂代码多难写而是每次看到早安打工人刚好够去倒杯水搞定了这种消息的时候会觉得这不像一个工具更像一个搭档。毕竟工作生活都要开心的嘛好了就到这里啦大家也可以点点star还在持续迭代中我是赛博李同学大厂写代码的。觉得有用的话点个赞 转发给需要的 TA感谢支持我们下期再见