配置通知 是做什么的?
设置 OMC 通知集成,以便在会话结束、需要输入或完成后台任务时收到提醒。
路由
根据用户请求或参数检测所需提供商:
- 如果触发词或参数包含 "telegram" → 遵循 Telegram 部分
- 如果触发词或参数包含 "discord" → 遵循 Discord 部分
- 如果触发词或参数包含 "slack" → 遵循 Slack 部分
- 如果未指定提供商,使用 AskUserQuestion:
问题: "您想配置哪个通知服务?"
选项:
- Telegram - Bot 令牌 + 聊天 ID。支持移动端和桌面端。
- Discord - Webhook 或 Bot 令牌 + 频道 ID。
- Slack - 传入 Webhook URL。
Telegram 设置
设置 Telegram 通知,以便 OMC 在会话结束、需要输入或完成后台任务时向您发送消息。
此技能的工作原理
这是一个交互式的、自然语言配置技能。通过 AskUserQuestion 向用户提问来引导设置。结果写入 ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json。
步骤 1:检测现有配置
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
HAS_TELEGRAM=$(jq -r '.notifications.telegram.enabled // false' "$CONFIG_FILE" 2>/dev/null)
CHAT_ID=$(jq -r '.notifications.telegram.chatId // empty' "$CONFIG_FILE" 2>/dev/null)
PARSE_MODE=$(jq -r '.notifications.telegram.parseMode // "Markdown"' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_TELEGRAM" = "true" ]; then
echo "EXISTING_CONFIG=true"
echo "CHAT_ID=$CHAT_ID"
echo "PARSE_MODE=$PARSE_MODE"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fi
如果找到现有配置,向用户显示当前配置内容,并询问是否要更新或重新配置。
步骤 2:创建 Telegram Bot
如果用户没有 Bot,引导其创建:
要设置 Telegram 通知,您需要一个 Telegram Bot 令牌和您的聊天 ID。
创建 Bot(如果没有):
1. 打开 Telegram 并搜索 @BotFather
2. 发送 /newbot
3. 选择一个名称(例如 "My OMC Notifier")
4. 选择一个用户名(例如 "my_omc_bot")
5. BotFather 会给您一个令牌,格式如:123456789:ABCdefGHIjklMNOpqrsTUVwxyz
获取您的聊天 ID:
1. 与您的新 Bot 开始聊天(发送 /start)
2. 访问:https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
3. 查找 "chat":{"id":YOUR_CHAT_ID}
- 个人聊天 ID 为正数(例如 123456789)
- 群组聊天 ID 为负数(例如 -1001234567890)
步骤 3:收集 Bot 令牌
使用 AskUserQuestion:
问题: "粘贴您的 Telegram Bot 令牌(来自 @BotFather)"
用户将在“其他”字段中输入其令牌。
验证 令牌:
- 必须匹配模式:
数字:字母数字(例如123456789:ABCdefGHI...) - 如果无效,解释格式并再次询问
步骤 4:收集聊天 ID
使用 AskUserQuestion:
问题: "粘贴您的 Telegram 聊天 ID(来自 getUpdates API 的数字)"
用户将在“其他”字段中输入其聊天 ID。
验证 聊天 ID:
- 必须是一个数字(个人为正数,群组为负数)
- 如果无效,提供帮助以找到它:
# 帮助用户找到他们的聊天 ID
BOT_TOKEN="USER_PROVIDED_TOKEN"
echo "正在获取最近消息以找到您的聊天 ID..."
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates" | jq '.result[-1].message.chat.id // .result[-1].message.from.id // "未找到消息 - 请先向您的 Bot 发送 /start"'
步骤 5:选择解析模式
使用 AskUserQuestion:
问题: "您更喜欢哪种消息格式?"
选项:
- Markdown(推荐) - 使用 Markdown 语法的粗体、斜体、代码块
- HTML - 使用 HTML 标签的粗体、斜体、代码
步骤 6:配置事件
使用带 multiSelect 的 AskUserQuestion:
问题: "哪些事件应触发 Telegram 通知?"
选项(multiSelect: true):
- 会话结束(推荐) - 当 Claude 会话完成时
- 需要输入 - 当 Claude 等待您的回复时(适合长时间运行的任务)
- 会话开始 - 当新会话开始时
- 会话继续 - 当持久模式保持会话存活时
默认选择:session-end + ask-user-question。
步骤 7:写入配置
读取现有配置,合并新的 Telegram 设置,然后写回:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fi
# BOT_TOKEN, CHAT_ID, PARSE_MODE 从用户收集
# 示例值:
echo "$EXISTING" | jq \
--arg token "$BOT_TOKEN" \
--arg chatId "$CHAT_ID" \
--arg parseMode "$PARSE_MODE" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.telegram = {
enabled: true,
botToken: $token,
chatId: $chatId,
parseMode: $parseMode
}' > "$CONFIG_FILE"
如果用户未选择所有事件,添加事件特定配置:
对于每个未选择的事件,禁用它:
# 示例:如果未选择 session-start,则禁用它
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"
步骤 8:测试配置
写入配置后,提供发送测试通知的选项:
使用 AskUserQuestion:
问题: "发送测试通知以验证设置?"
选项:
- 是的,立即测试(推荐) - 向您的 Telegram 聊天发送测试消息
- 不,稍后测试 - 跳过测试
如果测试:
BOT_TOKEN="USER_PROVIDED_TOKEN"
CHAT_ID="USER_PROVIDED_CHAT_ID"
PARSE_MODE="Markdown"
RESPONSE=$(curl -s -w "\n%{http_code}" \
"https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "parse_mode=${PARSE_MODE}" \
-d "text=OMC 测试通知 - Telegram 已配置!")
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
BODY=$(echo "$RESPONSE" | head -1)
if [ "$HTTP_CODE" = "200" ]; then
echo "测试通知发送成功!"
else
echo "失败(HTTP $HTTP_CODE):"
echo "$BODY" | jq -r '.description // "未知错误"' 2>/dev/null || echo "$BODY"
fi
报告成功或失败。常见问题:
- 401 Unauthorized:Bot 令牌无效
- 400 Bad Request: chat not found:聊天 ID 错误,或用户尚未向 Bot 发送 /start
- 网络错误:检查到 api.telegram.org 的连接
步骤 9:确认
显示最终配置摘要:
Telegram 通知已配置!
Bot: @你的_bot_用户名
聊天 ID: 123456789
格式: Markdown
事件: session-end, ask-user-question
配置保存至:~/.claude/.omc-config.json
您也可以通过环境变量设置:
OMC_TELEGRAM_BOT_TOKEN=123456789:ABCdefGHI...
OMC_TELEGRAM_CHAT_ID=123456789
要重新配置:/oh-my-claudecode:configure-notifications telegram
要配置 Discord:/oh-my-claudecode:configure-notifications discord
要配置 Slack:/oh-my-claudecode:configure-notifications slack
环境变量替代方案
用户可以通过在 shell 配置文件中设置环境变量来完全跳过此向导:
export OMC_TELEGRAM_BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
export OMC_TELEGRAM_CHAT_ID="123456789"
通知系统会自动检测环境变量,无需 .omc-config.json。
Discord 设置
设置 Discord 通知,以便 OMC 在会话结束、需要输入或完成后台任务时向您发送消息。
此技能的工作原理
这是一个交互式的、自然语言配置技能。通过 AskUserQuestion 向用户提问来引导设置。结果写入 ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json。
步骤 1:检测现有配置
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
# 检查现有的 discord 配置
HAS_DISCORD=$(jq -r '.notifications.discord.enabled // false' "$CONFIG_FILE" 2>/dev/null)
HAS_DISCORD_BOT=$(jq -r '.notifications["discord-bot"].enabled // false' "$CONFIG_FILE" 2>/dev/null)
WEBHOOK_URL=$(jq -r '.notifications.discord.webhookUrl // empty' "$CONFIG_FILE" 2>/dev/null)
MENTION=$(jq -r '.notifications.discord.mention // empty' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_DISCORD" = "true" ] || [ "$HAS_DISCORD_BOT" = "true" ]; then
echo "EXISTING_CONFIG=true"
echo "WEBHOOK_CONFIGURED=$HAS_DISCORD"
echo "BOT_CONFIGURED=$HAS_DISCORD_BOT"
[ -n "$WEBHOOK_URL" ] && echo "WEBHOOK_URL=$WEBHOOK_URL"
[ -n "$MENTION" ] && echo "MENTION=$MENTION"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fi
如果找到现有配置,向用户显示当前配置内容,并询问是否要更新或重新配置。
步骤 2:选择 Discord 方法
使用 AskUserQuestion:
问题: "您希望如何发送 Discord 通知?"
选项:
- Webhook(推荐) - 在您的 Discord 频道中创建一个 Webhook。简单,无需 Bot。只需粘贴 URL。
- Bot API - 使用 Discord Bot 令牌 + 频道 ID。更灵活,但需要一个 Bot 应用程序。
步骤 3A:Webhook 设置
如果用户选择 Webhook:
使用 AskUserQuestion:
问题: "粘贴您的 Discord Webhook URL。要创建一个:服务器设置 > 集成 > Webhooks > 新建 Webhook > 复制 URL"
用户将在“其他”字段中输入其 Webhook URL。
验证 URL:
- 必须以
https://discord.com/api/webhooks/或https://discordapp.com/api/webhooks/开头 - 如果无效,解释格式并再次询问
步骤 3B:Bot API 设置
如果用户选择 Bot API:
提出两个问题:
- "粘贴您的 Discord Bot 令牌" - 来自 discord.com/developers > 您的应用 > Bot > 令牌
- "粘贴频道 ID" - 右键点击频道 > 复制频道 ID(需要开发者模式)
步骤 4:配置提及(用户 @ 通知)
使用 AskUserQuestion:
问题: "您希望通知中提到(@通知)某人吗?"
选项:
- 是的,提及一个用户 - 通过 Discord 用户 ID 标记特定用户
- 是的,提及一个角色 - 通过角色 ID 标记一个角色
- 不提及 - 仅发布消息,不 @通知任何人
如果用户希望提及一个用户:
询问:"要提及的 Discord 用户 ID 是什么?(右键点击用户 > 复制用户 ID,需要开发者模式)"
提及格式为:<@USER_ID>(例如 <@1465264645320474637>)
如果用户希望提及一个角色:
询问:"要提及的 Discord 角色 ID 是什么?(服务器设置 > 角色 > 右键点击角色 > 复制角色 ID)"
提及格式为:<@&ROLE_ID>(例如 <@&123456789>)
步骤 5:配置事件
使用带 multiSelect 的 AskUserQuestion:
问题: "哪些事件应触发 Discord 通知?"
选项(multiSelect: true):
- 会话结束(推荐) - 当 Claude 会话完成时
- 需要输入 - 当 Claude 等待您的回复时(适合长时间运行的任务)
- 会话开始 - 当新会话开始时
- 会话继续 - 当持久模式保持会话存活时
默认选择:session-end + ask-user-question。
步骤 6:可选用户名覆盖
使用 AskUserQuestion:
问题: "自定义 Bot 显示名称?(在 Discord 中显示为 Webhook 发送者名称)"
选项:
- OMC(默认) - 显示为 "OMC"
- Claude Code - 显示为 "Claude Code"
- 自定义 - 输入自定义名称
步骤 7:写入配置
读取现有配置,合并新的 Discord 设置,然后写回:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fi
对于 Webhook 方法:
使用收集的值构建通知对象,并使用 jq 合并到 .omc-config.json:
# WEBHOOK_URL, MENTION, USERNAME 从用户收集
# EVENTS 是启用的事件列表
echo "$EXISTING" | jq \
--arg url "$WEBHOOK_URL" \
--arg mention "$MENTION" \
--arg username "$USERNAME" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.discord = {
enabled: true,
webhookUrl: $url,
mention: (if $mention == "" then null else $mention end),
username: (if $username == "" then null else $username end)
}' > "$CONFIG_FILE"
对于 Bot API 方法:
echo "$EXISTING" | jq \
--arg token "$BOT_TOKEN" \
--arg channel "$CHANNEL_ID" \
--arg mention "$MENTION" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications["discord-bot"] = {
enabled: true,
botToken: $token,
channelId: $channel,
mention: (if $mention == "" then null else $mention end)
}' > "$CONFIG_FILE"
如果用户未选择所有事件,添加事件特定配置:
对于每个未选择的事件,禁用它:
# 示例:如果未选择 session-start,则禁用它
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"
步骤 8:测试配置
写入配置后,提供发送测试通知的选项:
使用 AskUserQuestion:
问题: "发送测试通知以验证设置?"
选项:
- 是的,立即测试(推荐) - 向您的 Discord 频道发送测试消息
- 不,稍后测试 - 跳过测试
如果测试:
# 对于 webhook:
curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "{\"content\": \"${MENTION:+$MENTION\n}OMC 测试通知 - Discord 已配置!\"}" \
"$WEBHOOK_URL"
报告成功或失败。如果失败,可能的原因包括:URL 无效、权限不足或频道不存在。
步骤 9:确认
显示最终配置摘要(方法决定的示例布局)。
Slack 设置
设置 Slack 通知,以便 OMC 在会话结束、需要输入或完成后台任务时向您发送消息。
此技能的工作原理
这是一个交互式的、自然语言配置技能。通过 AskUserQuestion 向用户提问来引导设置。结果写入 ${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json。
步骤 1:检测现有配置
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
if [ -f "$CONFIG_FILE" ]; then
HAS_SLACK=$(jq -r '.notifications.slack.enabled // false' "$CONFIG_FILE" 2>/dev/null)
WEBHOOK_URL=$(jq -r '.notifications.slack.webhookUrl // empty' "$CONFIG_FILE" 2>/dev/null)
CHANNEL=$(jq -r '.notifications.slack.channel // empty' "$CONFIG_FILE" 2>/dev/null)
if [ "$HAS_SLACK" = "true" ]; then
echo "EXISTING_CONFIG=true"
echo "WEBHOOK_URL=$WEBHOOK_URL"
[ -n "$CHANNEL" ] && echo "CHANNEL=$CHANNEL"
else
echo "EXISTING_CONFIG=false"
fi
else
echo "NO_CONFIG_FILE"
fi
如果找到现有配置,向用户显示当前配置内容,并询问是否要更新或重新配置。
步骤 2:收集 Webhook URL
使用 AskUserQuestion:
问题: "粘贴您的 Slack 传入 Webhook URL。要创建一个:访问 https://api.slack.com/apps > 创建新应用 > 启用传入 Webhooks > 添加新的 Webhook 到工作区"
用户将在“其他”字段中输入其 Webhook URL。
验证 URL:
- 必须以
https://hooks.slack.com/services/开头 - 如果无效,解释格式并再次询问
步骤 3:配置频道(可选)
使用 AskUserQuestion:
问题: "要发布通知的 Slack 频道?(覆盖 Webhook 的默认频道)"
选项:
- 使用 Webhook 默认频道 - 发布到 Webhook 配置时指定的频道
- 指定频道 - 手动输入频道名称(例如 #general)
如果用户选择指定频道:
确保频道名称以 # 开头。如果不是,自动添加。
步骤 4:配置事件
使用带 multiSelect 的 AskUserQuestion:
问题: "哪些事件应触发 Slack 通知?"
选项(multiSelect: true):
- 会话结束(推荐) - 当 Claude 会话完成时
- 需要输入 - 当 Claude 等待您的回复时(适合长时间运行的任务)
- 会话开始 - 当新会话开始时
- 会话继续 - 当持久模式保持会话存活时
默认选择:session-end + ask-user-question。
步骤 5:配置消息格式(可选)
使用 AskUserQuestion:
问题: "通知的文本格式偏好?"
选项:
- 简洁(默认) - 短消息:事件 + 简要上下文
- 详细 - 完整信息,包括会话 ID 和详细状态
步骤 6:写入配置
读取现有配置,合并新的 Slack 设置,然后写回:
CONFIG_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-config.json"
mkdir -p "$(dirname "$CONFIG_FILE")"
if [ -f "$CONFIG_FILE" ]; then
EXISTING=$(cat "$CONFIG_FILE")
else
EXISTING='{}'
fi
# WEBHOOK_URL, CHANNEL, FORMAT 从用户收集
echo "$EXISTING" | jq \
--arg url "$WEBHOOK_URL" \
--arg channel "$CHANNEL" \
--arg format "$FORMAT" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.slack = {
enabled: true,
webhookUrl: $url,
channel: (if $channel == "" then null else $channel end),
format: $format
}' > "$CONFIG_FILE"
如果用户未选择所有事件,添加事件特定配置:
对于每个未选择的事件,禁用它:
# 示例:如果未选择 session-start,则禁用它
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"
步骤 7:测试配置
写入配置后,提供发送测试通知的选项:
使用 AskUserQuestion:
问题: "发送测试通知以验证设置?"
选项:
- 是的,立即测试(推荐) - 向您的 Slack 频道发送测试消息
- 不,稍后测试 - 跳过测试
如果测试:
curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "{\"text\": \"OMC 测试通知 - Slack 已配置!\"}" \
"$WEBHOOK_URL"
报告成功或失败。常见问题:
- invalid_webhook_url:URL 无效
- channel_not_found:指定的频道不存在
- 权限不足:Webhook 未正确配置
步骤 8:确认
显示最终配置摘要:
Slack 通知已配置!
Webhook: https://hooks.slack.com/services/T00/B00/xxxxx
频道: #general(或 Webhook 默认)
格式: 简洁
事件: session-end, ask-user-question
配置保存至:~/.claude/.omc-config.json
您也可以通过环境变量设置:
OMC_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T00/B00/xxxxx
环境变量替代方案
用户可以通过在 shell 配置文件中设置环境变量来完全跳过此向导:
export OMC_SLACK_WEBHOOK_URL="https://hooks.slack.com/services/T00/B00/xxxxx"
通知系统会自动检测环境变量,无需 .omc-config.json。
支持
- 对于任何提供商的配置问题,请尝试重新运行
/oh-my-claudecode:configure-notifications <provider>。 - 手动将配置写入
~/.claude/.omc-config.json,或使用环境变量进行无文件设置。 - 要禁用所有通知,将
.omc-config.json中的.notifications.enabled设置为false。