skills/configure-notifications/SKILL.md
Configure OMX notifications - unified entry point for all platforms
npx skillsauth add Goblin1024/oh-my-kimi configure-notificationsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Unified and only entry point for notification setup.
custom_webhook_command, custom_cli_commandStandalone configure skills (
configure-discord,configure-telegram,configure-slack,configure-openclaw) are removed.
CONFIG_FILE="$HOME/.kimi/.omx-config.json"
if [ -f "$CONFIG_FILE" ]; then
jq -r '
{
notifications_enabled: (.notifications.enabled // false),
discord: (.notifications.discord.enabled // false),
discord_bot: (.notifications["discord-bot"].enabled // false),
telegram: (.notifications.telegram.enabled // false),
slack: (.notifications.slack.enabled // false),
openclaw: (.notifications.openclaw.enabled // false),
custom_webhook_command: (.notifications.custom_webhook_command.enabled // false),
custom_cli_command: (.notifications.custom_cli_command.enabled // false),
verbosity: (.notifications.verbosity // "session"),
idleCooldownSeconds: (.notifications.idleCooldownSeconds // 60),
reply_enabled: (.notifications.reply.enabled // false)
}
' "$CONFIG_FILE"
else
echo "NO_CONFIG_FILE"
fi
Use AskUserQuestion:
Question: "What would you like to configure?"
Options:
custom_webhook_commandcustom_cli_commandnotifications.enabled = falseCollect and validate platform-specific values, then write directly under native keys:
notifications.discordnotifications["discord-bot"]notifications.telegramnotifications.slackDo not write these as generic command/webhook aliases.
custom_webhook_commandUse AskUserQuestion to collect:
POST default, or PUT)session-end, ask-user-question, session-start, session-idle, stop)Write:
jq \
--arg url "$URL" \
--arg method "${METHOD:-POST}" \
--arg instruction "${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.custom_webhook_command = {
enabled: true,
url: $url,
method: $method,
instruction: $instruction,
events: ["session-end", "ask-user-question"]
}' "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
custom_cli_commandUse AskUserQuestion to collect:
{{event}}, {{instruction}}, {{sessionId}}, {{projectPath}})Write:
jq \
--arg command "$COMMAND_TEMPLATE" \
--arg instruction "${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.custom_cli_command = {
enabled: true,
command: $command,
instruction: $instruction,
events: ["session-end", "ask-user-question"]
}' "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
Activation gate: OpenClaw-backed dispatch is active only when
OMX_OPENCLAW=1. For command gateways, also requireOMX_OPENCLAW_COMMAND=1. Optional timeout env override:OMX_OPENCLAW_COMMAND_TIMEOUT_MS(ms).
If the user explicitly asks to route hook notifications through clawdbot agent turns
(not direct message/webhook forwarding), use a command gateway that invokes
clawdbot agent and delivers back to Discord.
Notes:
session-stop -> OpenClaw hook stop.{{instruction}}).instruction templates concise and avoid untrusted shell metacharacters.gateways.<name>.timeout > OMX_OPENCLAW_COMMAND_TIMEOUT_MS > 5000.gateways.<name>.timeout to 120000 (recommended).session={{sessionId}} and tmux={{tmuxSession}} in hook text for traceability.SOUL.md and continue in #omc-dev.|| true to prevent OMX hook failures from blocking the session..jsonl extension and append (>>) for structured log aggregation.--reply-to 'channel:CHANNEL_ID' for reliability (preferred over channel aliases).Example (targeting #omc-dev with production-tested settings):
jq \
--arg command "(clawdbot agent --session-id omx-hooks --message {{instruction}} --thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json >>/tmp/omx-openclaw-agent.jsonl 2>&1 || true)" \
'.notifications = (.notifications // {enabled: true}) |
.notifications.enabled = true |
.notifications.verbosity = "verbose" |
.notifications.events = (.notifications.events // {}) |
.notifications.events["session-start"] = {enabled: true} |
.notifications.events["session-idle"] = {enabled: true} |
.notifications.events["ask-user-question"] = {enabled: true} |
.notifications.events["session-stop"] = {enabled: true} |
.notifications.events["session-end"] = {enabled: true} |
.notifications.openclaw = (.notifications.openclaw // {}) |
.notifications.openclaw.enabled = true |
.notifications.openclaw.gateways = (.notifications.openclaw.gateways // {}) |
.notifications.openclaw.gateways["local"] = {
type: "command",
command: $command,
timeout: 120000
} |
.notifications.openclaw.hooks = (.notifications.openclaw.hooks // {}) |
.notifications.openclaw.hooks["session-start"] = {
enabled: true,
gateway: "local",
instruction: "OMX hook=session-start project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한êµì–´ë¡œ ìƒíƒœë¥?ê³µìœ í•˜ê³ SOUL.mdë¥?ì°¸ê³ í•?í•„ìš”í•?í›„ì† ì¡°ì¹˜ë¥?#omc-devì—?안내하세ìš?"
} |
.notifications.openclaw.hooks["session-idle"] = {
enabled: true,
gateway: "local",
instruction: "OMX hook=session-idle project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한êµì–´ë¡œ idle ìƒí™©ì?간단íž?ê³µìœ í•˜ê³ ì§„í–‰ì¤‘ì¸ ìž‘ì—… íŒ”ë¡œì—…ì„ ì•ˆë‚´í•˜ì„¸ìš?"
} |
.notifications.openclaw.hooks["ask-user-question"] = {
enabled: true,
gateway: "local",
instruction: "OMX hook=ask-user-question session={{sessionId}} tmux={{tmuxSession}} question={{question}}. 한êµì–´ë¡œ 사용ìž?ì‘답 í•„ìš”ë¥?#omc-devì—?알리ê³?즉시 ì•¡ì…˜ ì•„ì´í…œì„ ì œì‹œí•˜ì„¸ìš?"
} |
.notifications.openclaw.hooks["stop"] = {
enabled: true,
gateway: "local",
instruction: "OMX hook=session-stop project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한êµì–´ë¡œ 중단 ìƒíƒœì™€ ì •ë¦¬ ì•¡ì…˜ì?SOUL.md 기준으로 ì „ë‹¬í•˜ì„¸ìš?"
} |
.notifications.openclaw.hooks["session-end"] = {
enabled: true,
gateway: "local",
instruction: "OMX hook=session-end project={{projectName}} session={{sessionId}} tmux={{tmuxSession}} reason={{reason}}. 한êµì–´ë¡œ 완료 요약ì?1줄로 남기ê³?í•„ìš”í•?í›„ì† ì¡°ì¹˜ë¥?안내하세ìš?"
}' "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
Verification for this mode:
clawdbot agent --session-id omx-hooks --message "OMX hook test via clawdbot agent path" \
--thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json
Dev runbook (Korean + tmux follow-up):
# 1) identify active OMX tmux sessions
tmux list-sessions -F '#{session_name}' | rg '^omx-' || true
# 2) confirm hook templates include session/tmux context
jq '.notifications.openclaw.hooks' "$CONFIG_FILE"
# 3) inspect agent JSONL logs when delivery looks broken
tail -n 120 /tmp/omx-openclaw-agent.jsonl | jq -s '.[] | {timestamp: (.timestamp // .time), status: (.status // .error // "ok")}'
# 4) check for recent errors in logs
rg '"error"|"failed"|"timeout"' /tmp/omx-openclaw-agent.jsonl | tail -20
OMX accepts both:
notifications.openclaw schema (legacy/runtime shape)custom_webhook_command, custom_cli_command)Deterministic precedence:
notifications.openclaw wins when present and valid.notifications.idleCooldownSecondsnotifications.profilesnotifications.defaultProfilenotifications.reply.enabledOMX_REPLY_ENABLED=true, and for Discord OMX_REPLY_DISCORD_USER_IDS=...status to a tracked OMX notification to receive a bounded read-only session summary. This is a reply-thread-scoped status probe, not a general remote control surface.jq '.notifications.enabled = false' "$CONFIG_FILE" > "$CONFIG_FILE.tmp" && mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
After writing config, run a smoke check:
npm run build
For OpenClaw-like HTTP integrations, verify both:
/hooks/wake smoke test/hooks/agent delivery verificationShow:
custom_webhook_command, custom_cli_command)notifications.openclaw exists (and therefore overrides aliases)~/.kimi/.omx-config.json)data-ai
Kimi-native team worker protocol (ACK, mailbox, task lifecycle)
documentation
Persistent markdown project wiki stored under .omk/wiki with keyword search and lifecycle capture
development
URL-driven website cloning with visual + functional verification
testing
Structured visual QA verdict for screenshot-to-reference comparisons