mcpField
D
dual-channel-watchexec-notifications

dual-channel-watchexec-notifications

github.com/terrylica云与 DevOps160 次安装1 天前更新
代码仓库

关于 dual-channel-watchexec-notifications

dual-channel-watchexec-notifications 是用于配置 watchexec 文件变更或进程崩溃通知的技能。它涵盖向 Telegram 和 Pushover 发送消息时的格式处理、排错与部署前验证。

主要功能

  1. 01watchexec 事件通知模式
  2. 02Telegram HTML 消息格式
  3. 03Pushover 纯文本格式
  4. 04动态内容转义指导
  5. 05通知投递排错清单

适用场景

  1. 01监控文件变更并发送提醒
  2. 02进程崩溃后通知两个渠道
  3. 03诊断通知缺失或格式错误
  4. 04部署前检查通知脚本

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/terrylica/cc-skills --skill dual-channel-watchexec-notifications

安装后在 Claude Code 中输入/dual-channel-watchexec-notifications确认已加载。

附带文件references/evolution-log.md

详细介绍

Watchexec 双通道通知

当 watchexec 检测到文件变更或进程崩溃时,同时向 Telegram 和 Pushover 发送可靠通知。

何时使用此技能

在以下情况下使用此技能:

  • 设置文件变更监控和通知
  • 通过 Telegram 和 Pushover 实现进程崩溃告警
  • 创建支持双通道通知的 watchexec 包装脚本
  • 分别为 HTML(Telegram)和纯文本(Pushover)格式化消息
  • 排查通知发送或格式问题

核心模式

watchexec 包装脚本 → 检测事件 → notify-script → Telegram + Pushover

# wrapper.sh - Monitors process and detects restart reasons
watchexec --restart -- python bot.py

# On event, call:
notify-script.sh <reason> <exit_code> <watchexec_info_file> <crash_context>

关键规则:格式差异

Telegram:仅使用 HTML 模式

MESSAGE="<b>Alert</b>: <code>file.py</code>"
# Escape 3 chars: & → &amp;, < → &lt;, > → &gt;

Pushover:仅使用纯文本

/usr/bin/env bash << 'SKILL_SCRIPT_EOF'
# Strip HTML tags before sending
MESSAGE_PLAIN=$(echo "$MESSAGE_HTML" | sed 's/<[^>]*>//g')
SKILL_SCRIPT_EOF

Telegram 使用 HTML 的原因:

  • Markdown 需要转义 40 多个字符(.、-、_ 等)
  • HTML 只需转义 3 个字符(&、<、>)
  • 符合行业最佳实践

快速参考

同时发送到两个通道
/usr/bin/env bash << 'SKILL_SCRIPT_EOF_2'
# 1. Build HTML message for Telegram
MESSAGE_HTML="<b>File</b>: <code>handler_classes.py</code>"

# 2. Strip HTML for Pushover
MESSAGE_PLAIN=$(echo "$MESSAGE_HTML" | sed 's/<[^>]*>//g')

# 3. Send to Telegram with HTML
curl -s -d "chat_id=$CHAT_ID" \
  -d "text=$MESSAGE_HTML" \
  -d "parse_mode=HTML" \
  https://api.telegram.org/bot$BOT_TOKEN/sendMessage

# 4. Send to Pushover with plain text
curl -s --form-string "message=$MESSAGE_PLAIN" \
  https://api.pushover.net/1/messages.json
SKILL_SCRIPT_EOF_2
执行模式
# Fire-and-forget background notifications (don't block restarts)
"$NOTIFY_SCRIPT" "crash" "$EXIT_CODE" "$INFO_FILE" "$CONTEXT_FILE" &

验证清单

部署前:

  • Telegram 使用 HTML 解析模式(而非 Markdown)
  • 为 Pushover 去除 HTML 标签(仅使用纯文本)
  • 对所有动态内容应用 HTML 转义(&、<、>)
  • 从环境变量/Doppler 加载凭据(不硬编码)
  • 启用消息归档以便调试
  • 使用 stat 检测文件(而非 find -newermt)
  • Heredoc 使用未加引号的分隔符,以便展开变量
  • 在后台运行通知(发送后不等待)
  • 使用包含特殊字符(_、.、-)的文件进行测试
  • Telegram 和 Pushover 均能成功接收通知

总结

要点:

  1. Telegram 始终使用 HTML 模式(转义更简单)
  2. Pushover 始终去除 HTML 标签(仅使用纯文本)
  3. HTML 中只需转义 3 个字符:& → &amp;、< → &lt;、> → &gt;
  4. 发送前归档消息以便调试
  5. 在 macOS 上使用 stat 检测文件(而非 find -newermt)
  6. 从环境变量/Doppler 加载凭据(绝不硬编码)
  7. 在后台发送通知,不等待发送完成(避免阻塞重启)

参考文档

详细信息请参阅:

随附示例:

  • examples/notify-restart.sh - 完整的双通道通知脚本
  • examples/bot-wrapper.sh - 带重启检测的 watchexec 包装脚本
  • examples/setup-example.sh - 设置指南和安装步骤

故障排查

问题原因解决方案
Telegram 转义错误使用了 Markdown 而非 HTML使用 parse_mode=HTML 切换到 HTML 模式
Pushover 显示 HTML 标签未剥除 HTML发送到 Pushover 前使用 sed 剥除标签
未收到通知缺少凭据检查 BOT_TOKEN、CHAT_ID 和 Pushover 密钥
特殊字符显示异常缺少 HTML 转义对动态内容中的 &、<、> 进行转义
find -newermt 在 macOS 上失败与 macOS 不兼容改用 stat 检测文件
通知阻塞未在后台运行添加 &,让通知脚本以即发即弃方式运行
通知重复重启循环添加防抖逻辑或冷却时间
缺少崩溃上下文未写入上下文文件检查 watchexec 信息文件路径是否存在

评论

支持 Markdown