[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XDS2NJDSDFBHZ5S4KY4E3J":3,"skill-same:01M6XDS2NJDSDFBHZ5S4KY4E3J":82},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":14,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":67,"install":68,"resources":81},"01M6XDS2NJDSDFBHZ5S4KY4E3J","configure-notifications",null,"Configure OMX notifications - unified entry point for all platforms","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcodex\u002Fconfigure-notifications\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"notifications","configure","configure notifications","openclaw","bot","discord","slack","setup","settings","telegram bot","telegram","webhook","notification","for","entry","point","2026-11-10 10:12:30",false,"---\nname: configure-notifications\ndescription: Configure OMX notifications - unified entry point for all platforms\ntriggers:\n  - \"configure notifications\"\n  - \"setup notifications\"\n  - \"notification settings\"\n  - \"configure discord\"\n  - \"configure telegram\"\n  - \"configure slack\"\n  - \"configure openclaw\"\n  - \"setup discord\"\n  - \"setup telegram\"\n  - \"setup slack\"\n  - \"setup openclaw\"\n  - \"discord notifications\"\n  - \"telegram notifications\"\n  - \"slack notifications\"\n  - \"openclaw notifications\"\n  - \"discord webhook\"\n  - \"telegram bot\"\n  - \"slack webhook\"\n---\n\n# Configure OMX Notifications\n\nUnified and only entry point for notification setup.\n\n- **Native integrations (first-class):** Discord, Telegram, Slack\n- **Generic extensibility integrations:** `custom_webhook_command`, `custom_cli_command`\n\n> Standalone configure skills (`configure-discord`, `configure-telegram`, `configure-slack`, `configure-openclaw`) are removed.\n\n## Step 1: Inspect Current State\n\n```bash\nCONFIG_FILE=\"$HOME\u002F.codex\u002F.omx-config.json\"\n\nif [ -f \"$CONFIG_FILE\" ]; then\n  jq -r '\n    {\n      notifications_enabled: (.notifications.enabled \u002F\u002F false),\n      discord: (.notifications.discord.enabled \u002F\u002F false),\n      discord_bot: (.notifications[\"discord-bot\"].enabled \u002F\u002F false),\n      telegram: (.notifications.telegram.enabled \u002F\u002F false),\n      slack: (.notifications.slack.enabled \u002F\u002F false),\n      openclaw: (.notifications.openclaw.enabled \u002F\u002F false),\n      custom_webhook_command: (.notifications.custom_webhook_command.enabled \u002F\u002F false),\n      custom_cli_command: (.notifications.custom_cli_command.enabled \u002F\u002F false),\n      verbosity: (.notifications.verbosity \u002F\u002F \"session\"),\n      idleCooldownSeconds: (.notifications.idleCooldownSeconds \u002F\u002F 60),\n      reply_enabled: (.notifications.reply.enabled \u002F\u002F false)\n    }\n  ' \"$CONFIG_FILE\"\nelse\n  echo \"NO_CONFIG_FILE\"\nfi\n```\n\n## Step 2: Main Menu\n\nUse AskUserQuestion:\n\n**Question:** \"What would you like to configure?\"\n\n**Options:**\n1. **Discord (native)** - webhook or bot\n2. **Telegram (native)** - bot token + chat id\n3. **Slack (native)** - incoming webhook\n4. **Generic webhook command** - `custom_webhook_command`\n5. **Generic CLI command** - `custom_cli_command`\n6. **Cross-cutting settings** - verbosity, idle cooldown, profiles, reply listener\n7. **Disable all notifications** - set `notifications.enabled = false`\n\n## Step 3: Configure Native Platforms (Discord \u002F Telegram \u002F Slack)\n\nCollect and validate platform-specific values, then write directly under native keys:\n\n- Discord webhook: `notifications.discord`\n- Discord bot: `notifications[\"discord-bot\"]`\n- Telegram: `notifications.telegram`\n- Slack: `notifications.slack`\n\nDo not write these as generic command\u002Fwebhook aliases.\n\n## Step 4: Configure Generic Extensibility\n\n### 4a) `custom_webhook_command`\n\nUse AskUserQuestion to collect:\n- URL\n- Optional headers\n- Optional method (`POST` default, or `PUT`)\n- Optional event list (`session-end`, `ask-user-question`, `session-start`, `session-idle`, `stop`)\n- Optional instruction template\n\nWrite:\n\n```bash\njq \\\n  --arg url \"$URL\" \\\n  --arg method \"${METHOD:-POST}\" \\\n  --arg instruction \"${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.custom_webhook_command = {\n     enabled: true,\n     url: $url,\n     method: $method,\n     instruction: $instruction,\n     events: [\"session-end\", \"ask-user-question\"]\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n### 4b) `custom_cli_command`\n\nUse AskUserQuestion to collect:\n- Command template (supports `{{event}}`, `{{instruction}}`, `{{sessionId}}`, `{{projectPath}}`)\n- Optional event list\n- Optional instruction template\n\nWrite:\n\n```bash\njq \\\n  --arg command \"$COMMAND_TEMPLATE\" \\\n  --arg instruction \"${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.custom_cli_command = {\n     enabled: true,\n     command: $command,\n     instruction: $instruction,\n     events: [\"session-end\", \"ask-user-question\"]\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n> Activation gate: OpenClaw-backed dispatch is active only when `OMX_OPENCLAW=1`.\n> For command gateways, also require `OMX_OPENCLAW_COMMAND=1`.\n> Optional timeout env override: `OMX_OPENCLAW_COMMAND_TIMEOUT_MS` (ms).\n\n### 4b-1) OpenClaw + Clawdbot Agent Workflow (recommended for dev)\n\nIf the user explicitly asks to route hook notifications through **clawdbot agent turns**\n(not direct message\u002Fwebhook forwarding), use a command gateway that invokes\n`clawdbot agent` and delivers back to Discord.\n\nNotes:\n- Hook name mapping is intentional: notifications `session-stop` -> OpenClaw hook `stop`.\n- OMX shell-escapes template substitutions for command gateways (including `{{instruction}}`).\n- Keep `instruction` templates concise and avoid untrusted shell metacharacters.\n- During troubleshooting, avoid swallowing command output; route it to a log file.\n- Timeout precedence: `gateways.\u003Cname>.timeout` > `OMX_OPENCLAW_COMMAND_TIMEOUT_MS` > `5000`.\n- For clawdbot agent workflows, set `gateways.\u003Cname>.timeout` to `120000` (recommended).\n- For dev operations, enforce Korean output in all hook instructions.\n- Include both `session={{sessionId}}` and `tmux={{tmuxSession}}` in hook text for traceability.\n- If follow-up is needed, explicitly instruct clawdbot to consult `SOUL.md` and continue in `#omc-dev`.\n- **Error handling**: Append `|| true` to prevent OMX hook failures from blocking the session.\n- **JSONL logging**: Use `.jsonl` extension and append (`>>`) for structured log aggregation.\n- **Reply target format**: Use `--reply-to 'channel:CHANNEL_ID'` for reliability (preferred over channel aliases).\n\nExample (targeting `#omc-dev` with production-tested settings):\n\n```bash\njq \\\n  --arg command \"(clawdbot agent --session-id omx-hooks --message {{instruction}} --thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json >>\u002Ftmp\u002Fomx-openclaw-agent.jsonl 2>&1 || true)\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.verbosity = \"verbose\" |\n   .notifications.events = (.notifications.events \u002F\u002F {}) |\n   .notifications.events[\"session-start\"] = {enabled: true} |\n   .notifications.events[\"session-idle\"] = {enabled: true} |\n   .notifications.events[\"ask-user-question\"] = {enabled: true} |\n   .notifications.events[\"session-stop\"] = {enabled: true} |\n   .notifications.events[\"session-end\"] = {enabled: true} |\n   .notifications.openclaw = (.notifications.openclaw \u002F\u002F {}) |\n   .notifications.openclaw.enabled = true |\n   .notifications.openclaw.gateways = (.notifications.openclaw.gateways \u002F\u002F {}) |\n   .notifications.openclaw.gateways[\"local\"] = {\n     type: \"command\",\n     command: $command,\n     timeout: 120000\n   } |\n   .notifications.openclaw.hooks = (.notifications.openclaw.hooks \u002F\u002F {}) |\n   .notifications.openclaw.hooks[\"session-start\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-start project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 상태를 공유하고 SOUL.md를 참고해 필요한 후속 조치를 #omc-dev에 안내하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"session-idle\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-idle project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 idle 상황을 간단히 공유하고 진행중인 작업 팔로업을 안내하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"ask-user-question\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=ask-user-question session={{sessionId}} tmux={{tmuxSession}} question={{question}}. 한국어로 사용자 응답 필요를 #omc-dev에 알리고 즉시 액션 아이템을 제시하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"stop\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-stop project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 중단 상태와 정리 액션을 SOUL.md 기준으로 전달하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"session-end\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-end project={{projectName}} session={{sessionId}} tmux={{tmuxSession}} reason={{reason}}. 한국어로 완료 요약을 1줄로 남기고 필요한 후속 조치를 안내하세요.\"\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\nVerification for this mode:\n\n```bash\nclawdbot agent --session-id omx-hooks --message \"OMX hook test via clawdbot agent path\" \\\n  --thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json\n```\n\nDev runbook (Korean + tmux follow-up):\n\n```bash\n# 1) identify active OMX tmux sessions\ntmux list-sessions -F '#{session_name}' | rg '^omx-' || true\n\n# 2) confirm hook templates include session\u002Ftmux context\njq '.notifications.openclaw.hooks' \"$CONFIG_FILE\"\n\n# 3) inspect agent JSONL logs when delivery looks broken\ntail -n 120 \u002Ftmp\u002Fomx-openclaw-agent.jsonl | jq -s '.[] | {timestamp: (.timestamp \u002F\u002F .time), status: (.status \u002F\u002F .error \u002F\u002F \"ok\")}'\n\n# 4) check for recent errors in logs\nrg '\"error\"|\"failed\"|\"timeout\"' \u002Ftmp\u002Fomx-openclaw-agent.jsonl | tail -20\n```\n\n### 4c) Compatibility + precedence contract\n\nOMX accepts both:\n- explicit `notifications.openclaw` schema (legacy\u002Fruntime shape)\n- generic aliases (`custom_webhook_command`, `custom_cli_command`)\n\nDeterministic precedence:\n1. `notifications.openclaw` **wins** when present and valid.\n2. Generic aliases are ignored in that case (with warning).\n\n## Step 5: Cross-Cutting Settings\n\n### Verbosity\n- minimal \u002F session (recommended) \u002F agent \u002F verbose\n\n### Idle cooldown\n- `notifications.idleCooldownSeconds`\n\n### Profiles\n- `notifications.profiles`\n- `notifications.defaultProfile`\n\n### Reply listener\n- `notifications.reply.enabled`\n- env gates: `OMX_REPLY_ENABLED=true`, and for Discord `OMX_REPLY_DISCORD_USER_IDS=...`\n\n## Step 6: Disable All Notifications\n\n```bash\njq '.notifications.enabled = false' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n## Step 7: Verification Guidance\n\nAfter writing config, run a smoke check:\n\n```bash\nnpm run build\n```\n\nFor OpenClaw-like HTTP integrations, verify both:\n- `\u002Fhooks\u002Fwake` smoke test\n- `\u002Fhooks\u002Fagent` delivery verification\n\n## Final Summary Template\n\nShow:\n- Native platforms enabled\n- Generic aliases enabled (`custom_webhook_command`, `custom_cli_command`)\n- Whether explicit `notifications.openclaw` exists (and therefore overrides aliases)\n- Verbosity + idle cooldown + reply listener state\n- Config path (`~\u002F.codex\u002F.omx-config.json`)\n","# Configure OMX Notifications\n\nUnified and only entry point for notification setup.\n\n- **Native integrations (first-class):** Discord, Telegram, Slack\n- **Generic extensibility integrations:** `custom_webhook_command`, `custom_cli_command`\n\n> Standalone configure skills (`configure-discord`, `configure-telegram`, `configure-slack`, `configure-openclaw`) are removed.\n\n## Step 1: Inspect Current State\n\n```bash\nCONFIG_FILE=\"$HOME\u002F.codex\u002F.omx-config.json\"\n\nif [ -f \"$CONFIG_FILE\" ]; then\n  jq -r '\n    {\n      notifications_enabled: (.notifications.enabled \u002F\u002F false),\n      discord: (.notifications.discord.enabled \u002F\u002F false),\n      discord_bot: (.notifications[\"discord-bot\"].enabled \u002F\u002F false),\n      telegram: (.notifications.telegram.enabled \u002F\u002F false),\n      slack: (.notifications.slack.enabled \u002F\u002F false),\n      openclaw: (.notifications.openclaw.enabled \u002F\u002F false),\n      custom_webhook_command: (.notifications.custom_webhook_command.enabled \u002F\u002F false),\n      custom_cli_command: (.notifications.custom_cli_command.enabled \u002F\u002F false),\n      verbosity: (.notifications.verbosity \u002F\u002F \"session\"),\n      idleCooldownSeconds: (.notifications.idleCooldownSeconds \u002F\u002F 60),\n      reply_enabled: (.notifications.reply.enabled \u002F\u002F false)\n    }\n  ' \"$CONFIG_FILE\"\nelse\n  echo \"NO_CONFIG_FILE\"\nfi\n```\n\n## Step 2: Main Menu\n\nUse AskUserQuestion:\n\n**Question:** \"What would you like to configure?\"\n\n**Options:**\n1. **Discord (native)** - webhook or bot\n2. **Telegram (native)** - bot token + chat id\n3. **Slack (native)** - incoming webhook\n4. **Generic webhook command** - `custom_webhook_command`\n5. **Generic CLI command** - `custom_cli_command`\n6. **Cross-cutting settings** - verbosity, idle cooldown, profiles, reply listener\n7. **Disable all notifications** - set `notifications.enabled = false`\n\n## Step 3: Configure Native Platforms (Discord \u002F Telegram \u002F Slack)\n\nCollect and validate platform-specific values, then write directly under native keys:\n\n- Discord webhook: `notifications.discord`\n- Discord bot: `notifications[\"discord-bot\"]`\n- Telegram: `notifications.telegram`\n- Slack: `notifications.slack`\n\nDo not write these as generic command\u002Fwebhook aliases.\n\n## Step 4: Configure Generic Extensibility\n\n### 4a) `custom_webhook_command`\n\nUse AskUserQuestion to collect:\n- URL\n- Optional headers\n- Optional method (`POST` default, or `PUT`)\n- Optional event list (`session-end`, `ask-user-question`, `session-start`, `session-idle`, `stop`)\n- Optional instruction template\n\nWrite:\n\n```bash\njq \\\n  --arg url \"$URL\" \\\n  --arg method \"${METHOD:-POST}\" \\\n  --arg instruction \"${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.custom_webhook_command = {\n     enabled: true,\n     url: $url,\n     method: $method,\n     instruction: $instruction,\n     events: [\"session-end\", \"ask-user-question\"]\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n### 4b) `custom_cli_command`\n\nUse AskUserQuestion to collect:\n- Command template (supports `{{event}}`, `{{instruction}}`, `{{sessionId}}`, `{{projectPath}}`)\n- Optional event list\n- Optional instruction template\n\nWrite:\n\n```bash\njq \\\n  --arg command \"$COMMAND_TEMPLATE\" \\\n  --arg instruction \"${INSTRUCTION:-OMX event {{event}} for {{projectPath}}}\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.custom_cli_command = {\n     enabled: true,\n     command: $command,\n     instruction: $instruction,\n     events: [\"session-end\", \"ask-user-question\"]\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n> Activation gate: OpenClaw-backed dispatch is active only when `OMX_OPENCLAW=1`.\n> For command gateways, also require `OMX_OPENCLAW_COMMAND=1`.\n> Optional timeout env override: `OMX_OPENCLAW_COMMAND_TIMEOUT_MS` (ms).\n\n### 4b-1) OpenClaw + Clawdbot Agent Workflow (recommended for dev)\n\nIf the user explicitly asks to route hook notifications through **clawdbot agent turns**\n(not direct message\u002Fwebhook forwarding), use a command gateway that invokes\n`clawdbot agent` and delivers back to Discord.\n\nNotes:\n- Hook name mapping is intentional: notifications `session-stop` -> OpenClaw hook `stop`.\n- OMX shell-escapes template substitutions for command gateways (including `{{instruction}}`).\n- Keep `instruction` templates concise and avoid untrusted shell metacharacters.\n- During troubleshooting, avoid swallowing command output; route it to a log file.\n- Timeout precedence: `gateways.\u003Cname>.timeout` > `OMX_OPENCLAW_COMMAND_TIMEOUT_MS` > `5000`.\n- For clawdbot agent workflows, set `gateways.\u003Cname>.timeout` to `120000` (recommended).\n- For dev operations, enforce Korean output in all hook instructions.\n- Include both `session={{sessionId}}` and `tmux={{tmuxSession}}` in hook text for traceability.\n- If follow-up is needed, explicitly instruct clawdbot to consult `SOUL.md` and continue in `#omc-dev`.\n- **Error handling**: Append `|| true` to prevent OMX hook failures from blocking the session.\n- **JSONL logging**: Use `.jsonl` extension and append (`>>`) for structured log aggregation.\n- **Reply target format**: Use `--reply-to 'channel:CHANNEL_ID'` for reliability (preferred over channel aliases).\n\nExample (targeting `#omc-dev` with production-tested settings):\n\n```bash\njq \\\n  --arg command \"(clawdbot agent --session-id omx-hooks --message {{instruction}} --thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json >>\u002Ftmp\u002Fomx-openclaw-agent.jsonl 2>&1 || true)\" \\\n  '.notifications = (.notifications \u002F\u002F {enabled: true}) |\n   .notifications.enabled = true |\n   .notifications.verbosity = \"verbose\" |\n   .notifications.events = (.notifications.events \u002F\u002F {}) |\n   .notifications.events[\"session-start\"] = {enabled: true} |\n   .notifications.events[\"session-idle\"] = {enabled: true} |\n   .notifications.events[\"ask-user-question\"] = {enabled: true} |\n   .notifications.events[\"session-stop\"] = {enabled: true} |\n   .notifications.events[\"session-end\"] = {enabled: true} |\n   .notifications.openclaw = (.notifications.openclaw \u002F\u002F {}) |\n   .notifications.openclaw.enabled = true |\n   .notifications.openclaw.gateways = (.notifications.openclaw.gateways \u002F\u002F {}) |\n   .notifications.openclaw.gateways[\"local\"] = {\n     type: \"command\",\n     command: $command,\n     timeout: 120000\n   } |\n   .notifications.openclaw.hooks = (.notifications.openclaw.hooks \u002F\u002F {}) |\n   .notifications.openclaw.hooks[\"session-start\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-start project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 상태를 공유하고 SOUL.md를 참고해 필요한 후속 조치를 #omc-dev에 안내하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"session-idle\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-idle project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 idle 상황을 간단히 공유하고 진행중인 작업 팔로업을 안내하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"ask-user-question\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=ask-user-question session={{sessionId}} tmux={{tmuxSession}} question={{question}}. 한국어로 사용자 응답 필요를 #omc-dev에 알리고 즉시 액션 아이템을 제시하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"stop\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-stop project={{projectName}} session={{sessionId}} tmux={{tmuxSession}}. 한국어로 중단 상태와 정리 액션을 SOUL.md 기준으로 전달하세요.\"\n   } |\n   .notifications.openclaw.hooks[\"session-end\"] = {\n     enabled: true,\n     gateway: \"local\",\n     instruction: \"OMX hook=session-end project={{projectName}} session={{sessionId}} tmux={{tmuxSession}} reason={{reason}}. 한국어로 완료 요약을 1줄로 남기고 필요한 후속 조치를 안내하세요.\"\n   }' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\nVerification for this mode:\n\n```bash\nclawdbot agent --session-id omx-hooks --message \"OMX hook test via clawdbot agent path\" \\\n  --thinking minimal --deliver --reply-channel discord --reply-to 'channel:1468539002985644084' --timeout 120 --json\n```\n\nDev runbook (Korean + tmux follow-up):\n\n```bash\n# 1) identify active OMX tmux sessions\ntmux list-sessions -F '#{session_name}' | rg '^omx-' || true\n\n# 2) confirm hook templates include session\u002Ftmux context\njq '.notifications.openclaw.hooks' \"$CONFIG_FILE\"\n\n# 3) inspect agent JSONL logs when delivery looks broken\ntail -n 120 \u002Ftmp\u002Fomx-openclaw-agent.jsonl | jq -s '.[] | {timestamp: (.timestamp \u002F\u002F .time), status: (.status \u002F\u002F .error \u002F\u002F \"ok\")}'\n\n# 4) check for recent errors in logs\nrg '\"error\"|\"failed\"|\"timeout\"' \u002Ftmp\u002Fomx-openclaw-agent.jsonl | tail -20\n```\n\n### 4c) Compatibility + precedence contract\n\nOMX accepts both:\n- explicit `notifications.openclaw` schema (legacy\u002Fruntime shape)\n- generic aliases (`custom_webhook_command`, `custom_cli_command`)\n\nDeterministic precedence:\n1. `notifications.openclaw` **wins** when present and valid.\n2. Generic aliases are ignored in that case (with warning).\n\n## Step 5: Cross-Cutting Settings\n\n### Verbosity\n- minimal \u002F session (recommended) \u002F agent \u002F verbose\n\n### Idle cooldown\n- `notifications.idleCooldownSeconds`\n\n### Profiles\n- `notifications.profiles`\n- `notifications.defaultProfile`\n\n### Reply listener\n- `notifications.reply.enabled`\n- env gates: `OMX_REPLY_ENABLED=true`, and for Discord `OMX_REPLY_DISCORD_USER_IDS=...`\n\n## Step 6: Disable All Notifications\n\n```bash\njq '.notifications.enabled = false' \"$CONFIG_FILE\" > \"$CONFIG_FILE.tmp\" && mv \"$CONFIG_FILE.tmp\" \"$CONFIG_FILE\"\n```\n\n## Step 7: Verification Guidance\n\nAfter writing config, run a smoke check:\n\n```bash\nnpm run build\n```\n\nFor OpenClaw-like HTTP integrations, verify both:\n- `\u002Fhooks\u002Fwake` smoke test\n- `\u002Fhooks\u002Fagent` delivery verification\n\n## Final Summary Template\n\nShow:\n- Native platforms enabled\n- Generic aliases enabled (`custom_webhook_command`, `custom_cli_command`)\n- Whether explicit `notifications.openclaw` exists (and therefore overrides aliases)\n- Verbosity + idle cooldown + reply listener state\n- Config path (`~\u002F.codex\u002F.omx-config.json`)\n",{"name":5,"triggers":45,"description":7},[26,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,33,61],"setup notifications","notification settings","configure discord","configure telegram","configure slack","configure openclaw","setup discord","setup telegram","setup slack","setup openclaw","discord notifications","telegram notifications","slack notifications","openclaw notifications","discord webhook","slack webhook","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcodex\u002Fconfigure-notifications","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill configure-notifications",{"tool":74,"command":75},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill configure-notifications",{"tool":77,"command":78},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill configure-notifications","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcodex\u002Fconfigure-notifications\u002FSKILL.md",true,[],[83,106,132,142,155,172],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":94,"publishedAt":40},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[89],{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[95,96,97,98,27,99,100,101,102,103,104,105],"wechat search","wechat","search","capabilities","design","web search","compliance","web","official","fetch","with",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":40},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[113,114,115,116,117,118,97,119,120,121,122,123,124,125,126,127,128,129,130,131],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":40},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[139,140,113,124,125,126,127,117,97,129,141,130,131,123,121,120,119,128,118,116],"trend radar","radar","pulse",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":40},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[149,150,151,152,153,154],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":40},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[157,102,165,166,167,105,124,168,169,170,115,171,128],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":40},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[174,179,180,181,128,182,169,183,184,185,186,187],"status","play","go","latest","github","discover","control","cmd","volume"]