agent-doc-discipline
Writing-time discipline for documents agents consume (the five surfaces, specs, tickets, .omc/skills/) — every rule checkable and carrying a why, steps before…
Configure notification integrations (Telegram, Discord, Slack) via natural language
$ npx -y skills add Yeachan-Heo/oh-my-claudecode --skill configure-notifications --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/configure-notificationsContext preview
The summary Claude sees to decide when to auto-load this skill.
Configure notification integrations (Telegram, Discord, Slack) via natural language
name: configure-notifications description: Configure notification integrations (Telegram, Discord, Slack) via natural language triggers: - "configure notifications" - "setup notifications" - "configure telegram" - "setup telegram" - "telegram bot" - "configure discord" - "setup discord" - "discord webhook" - "configure slack" - "setup slack" - "slack webhook" level: 2
Set up OMC notification integrations so you're alerted when sessions end, need input, or complete background tasks.
Detect which provider the user wants based on their request or argument:
**Question:** "Which notification service would you like to configure?"
**Options:** 1. **Telegram** - Bot token + chat ID. Works on mobile and desktop. 2. **Discord** - Webhook or bot token + channel ID. 3. **Slack** - Incoming webhook URL.
---
Set up Telegram notifications so OMC can message you when sessions end, need input, or complete background tasks.
This is an interactive, natural-language configuration skill. Walk the user through setup by asking questions with AskUserQuestion. Write the result to `${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json`.
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"
fiIf existing config is found, show the user what's currently configured and ask if they want to update or reconfigure.
Guide the user through creating a bot if they don't have one:
To set up Telegram notifications, you need a Telegram bot token and your chat ID.
CREATE A BOT (if you don't have one):
1. Open Telegram and search for @BotFather
2. Send /newbot
3. Choose a name (e.g., "My OMC Notifier")
4. Choose a username (e.g., "my_omc_bot")
5. BotFather will give you a token like: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz
GET YOUR CHAT ID:
1. Start a chat with your new bot (send /start)
2. Visit: https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
3. Look for "chat":{"id":YOUR_CHAT_ID}
- Personal chat IDs are positive numbers (e.g., 123456789)
- Group chat IDs are negative numbers (e.g., -1001234567890)Use AskUserQuestion:
**Question:** "Paste your Telegram bot token (from @BotFather)"
The user will type their token in the "Other" field.
**Validate** the token:
Use AskUserQuestion:
**Question:** "Paste your Telegram chat ID (the number from getUpdates API)"
The user will type their chat ID in the "Other" field.
**Validate** the chat ID:
# Help user find their chat ID
BOT_TOKEN="USER_PROVIDED_TOKEN"
echo "Fetching recent messages to find your chat ID..."
curl -s "https://api.telegram.org/bot${BOT_TOKEN}/getUpdates" | jq '.result[-1].message.chat.id // .result[-1].message.from.id // "No messages found - send /start to your bot first"'Use AskUserQuestion:
**Question:** "Which message format do you prefer?"
**Options:** 1. **Markdown (Recommended)** - Bold, italic, code blocks with Markdown syntax 2. **HTML** - Bold, italic, code with HTML tags
Use AskUserQuestion with multiSelect:
**Question:** "Which events should trigger Telegram notifications?"
**Options (multiSelect: true):** 1. **Session end (Recommended)** - When a Claude session finishes 2. **Input needed** - When Claude is waiting for your response (great for long-running tasks) 3. **Session start** - When a new session begins 4. **Session continuing** - When a persistent mode keeps the session alive
Default selection: session-end + ask-user-question.
Read the existing config, merge the new Telegram settings, and write back:
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 are collected from user
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"For each event NOT selected, disable it:
# Example: disable session-start if not selected
echo "$(cat "$CONFIG_FILE")" | jq \
'.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: false}' > "$CONFIG_FILE"After writing config, offer to send a test notification:
Use AskUserQuestion:
**Question:** "Send a test notification to verify the
For Codex users: Check out oh-my-codex — the same orchestration experience for OpenAI Codex CLI. Liked OmC but found it a bit overkill? Try gajae-code.
Repo: Yeachan-Heo/oh-my-claudecode
Writing-time discipline for documents agents consume (the five surfaces, specs, tickets, .omc/skills/) — every rule checkable and carrying a why, steps before…
Clean AI-generated code slop with a regression-safe, deletion-first workflow and optional reviewer-only mode
Shipyard's navigator — chart a foggy effort (destination unclear, questions not yet stateable) into a map of decision tickets on the repo's issue tracker, then…
Process-first advisor routing for Claude, Codex, Gemini, Antigravity, Grok, or Cursor via `omc ask`, with artifact capture and no raw CLI assembly
Stateful single-mission improvement loop with strict evaluator contract, markdown decision logs, and max-runtime stop behavior