当前位置: 首页 > news >正文

我给Claude Code加了个有趣的灵魂,同事看完急的不行,非让我分享给他

让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压缩前后

我们要实现的功能,关注NotificationStop两个事件就够了。

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 / Stop)
CLAUDE_SESSION_ID会话 ID
CLAUDE_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 我想要的通知长什么样

不是一条通知,而是一个通知系统

  1. 有人格— 不是"任务完成",而是"早安打工人,刚好够去倒杯水,搞定了 ☕"

  2. 有感知— 知道现在几点、任务跑了多久、成功还是失败

  3. 跨平台— macOS、Windows、Linux都能用

  4. 可扩展— 支持企业微信、飞书、ntfy.sh 等webhook推送

  5. 易管理— CLI 命令行配置,不用手动改 JSON

3.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*) PLATFORM="macos" ;; Linux*) PLATFORM="linux" ;; MINGW*|MSYS*|CYGWIN*) PLATFORM="windows" ;; esac }

各平台实现命令如下

macOSosascript(侧边栏通知自动适配)

osascript -e "display notification \"$BODY\" with title \"$TITLE\" sound name \"$SOUND\""

Windows— PowerShell Toast 通知

[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier("claude-notify").Show($toast)

Linuxnotify-send

notify-send -a "claude-notify" -i dialog-information "$TITLE" "$BODY"

六、Webhook 推送(可选)

之前写过Claude Code接入飞书CLI的文章,那肯定要用起来。支持通过Webhook推送到手机

飞书开源CLI了!保姆级教程,手把手教你接 Claude Code

通道场景实现方式
企业微信团队协作群机器人 Webhook,POST markdown
飞书团队协作自定义机器人 Webhook,POST 卡片消息
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,感谢支持!我们下期再见!

http://www.gsyq.cn/news/1327523.html

相关文章:

  • PHP代码审计实战:手把手带你审计BUUCTF那道‘滑稽’的WarmUp题目
  • 不只是编译:在RK3588上为Qt 5.15.0配置OpenGL环境后,如何验证与开发你的第一个GUI应用?
  • 基于555定时器的电荷泵倍压电路设计与实践
  • 2026年企业AI降本实战:分层调用策略让API成本直降70%
  • RimSort:拯救你的《边缘世界》模组管理噩梦的终极方案
  • AI安全实战:AI系统安全漏洞修复的实战案例
  • RGB与YUV像素格式详解
  • 抖音无水印高清视频下载器:三种方式获取纯净素材,让创作更自由
  • ESP32-CAM不止能监控:巧用RTSP推流,打造智能家居的‘眼睛’(VLC/Home Assistant实战)
  • 量子对角化方法在强关联系统中的应用与优化
  • AMD Ryzen处理器深度调试与配置优化指南
  • 2026降AI率工具怎么选?高性价比实用工具推荐
  • AI论文速读工具对比测评:5款主流工具谁才是研究生的论文神器?
  • DSP28335的SCI串口通信避坑指南:如何稳定驱动淘晶驰3.5寸屏显示实时数据
  • BLHeli固件调参进阶:用好盈乐天电调解锁多轴飞行器更顺滑的响应
  • 在华为欧拉openEuler 22.03 SP2上搞定Oracle 11g R2:一个踩坑无数的可视化安装实录
  • 不只是定位:教你用开源GNSS/INS平台玩转多传感器融合与抗干扰
  • 告别Windows激活烦恼:KMS_VL_ALL_AIO智能激活工具全攻略
  • 海南创业必看:税务咨询公司TOP5选哪家?(附走访对比) - 速递信息
  • SAP PO与ECC系统连接配置保姆级教程:从SM59到SXMB_ADM的完整避坑指南
  • 如何快速掌握AMD Ryzen处理器深度调试:免费开源工具终极配置指南
  • Zotero PDF Translate终极教程:5步实现学术文献跨语言翻译
  • 3步掌握Ryzen处理器调试:从性能瓶颈到精准控制的完整路径
  • Hitboxer终极指南:3分钟掌握专业级SOCD按键重映射技术
  • Taotoken用量看板如何清晰展示各模型消耗详情
  • 告别AWCC臃肿:500KB轻量级Alienware灯光风扇控制终极方案
  • ESP32 OTA升级进阶:手把手教你修改源码,实现固件下载进度条显示(基于IDF 4.4/5.3)
  • 空地一体智能调度:2026应急资源调度低空平台方案商推荐 - 品牌2025
  • 降AI率工具怎么选?2026年高性价比工具实测推荐
  • 飞来爱健商之道公益巡讲靠谱吗 - 中媒介