[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71APTP5G3JD0AVCDEEN8FQH":3,"skill-same:01M71APTP5G3JD0AVCDEEN8FQH":71},{"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":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":14,"repositoryHtmlUrl":54,"repositoryHomepageUrl":6,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M71APTP5G3JD0AVCDEEN8FQH","webhook-subscriptions",null,"Create and manage webhook subscriptions for event-driven agent activation. Use when the user wants external services to trigger agent runs automatically.","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\u002Fhermes\u002Fwebhook-subscriptions\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"webhook subscriptions","subscriptions","webhook","driven","user","event-driven","services","automation","use","trigger","manage","event","for","integrations","events","activation","create","when","2026-11-10 10:12:30",false,"---\nname: webhook-subscriptions\ndescription: Create and manage webhook subscriptions for event-driven agent activation. Use when the user wants external services to trigger agent runs automatically.\nversion: 1.0.0\nmetadata:\n  hermes:\n    tags: [webhook, events, automation, integrations]\n---\n\n# Webhook Subscriptions\n\nCreate dynamic webhook subscriptions so external services (GitHub, GitLab, Stripe, CI\u002FCD, IoT sensors, monitoring tools) can trigger Hermes agent runs by POSTing events to a URL.\n\n## Setup (Required First)\n\nThe webhook platform must be enabled before subscriptions can be created. Check with:\n```bash\nhermes webhook list\n```\n\nIf it says \"Webhook platform is not enabled\", set it up:\n\n### Option 1: Setup wizard\n```bash\nhermes gateway setup\n```\nFollow the prompts to enable webhooks, set the port, and set a global HMAC secret.\n\n### Option 2: Manual config\nAdd to `~\u002F.hermes\u002Fconfig.yaml`:\n```yaml\nplatforms:\n  webhook:\n    enabled: true\n    extra:\n      host: \"0.0.0.0\"\n      port: 8644\n      secret: \"generate-a-strong-secret-here\"\n```\n\n### Option 3: Environment variables\nAdd to `~\u002F.hermes\u002F.env`:\n```bash\nWEBHOOK_ENABLED=true\nWEBHOOK_PORT=8644\nWEBHOOK_SECRET=generate-a-strong-secret-here\n```\n\nAfter configuration, start (or restart) the gateway:\n```bash\nhermes gateway run\n# Or if using systemd:\nsystemctl --user restart hermes-gateway\n```\n\nVerify it's running:\n```bash\ncurl http:\u002F\u002Flocalhost:8644\u002Fhealth\n```\n\n## Commands\n\nAll management is via the `hermes webhook` CLI command:\n\n### Create a subscription\n```bash\nhermes webhook subscribe \u003Cname> \\\n  --prompt \"Prompt template with {payload.fields}\" \\\n  --events \"event1,event2\" \\\n  --description \"What this does\" \\\n  --skills \"skill1,skill2\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"12345\" \\\n  --secret \"optional-custom-secret\"\n```\n\nReturns the webhook URL and HMAC secret. The user configures their service to POST to that URL.\n\n### List subscriptions\n```bash\nhermes webhook list\n```\n\n### Remove a subscription\n```bash\nhermes webhook remove \u003Cname>\n```\n\n### Test a subscription\n```bash\nhermes webhook test \u003Cname>\nhermes webhook test \u003Cname> --payload '{\"key\": \"value\"}'\n```\n\n## Prompt Templates\n\nPrompts support `{dot.notation}` for accessing nested payload fields:\n\n- `{issue.title}` — GitHub issue title\n- `{pull_request.user.login}` — PR author\n- `{data.object.amount}` — Stripe payment amount\n- `{sensor.temperature}` — IoT sensor reading\n\nIf no prompt is specified, the full JSON payload is dumped into the agent prompt.\n\n## Common Patterns\n\n### GitHub: new issues\n```bash\nhermes webhook subscribe github-issues \\\n  --events \"issues\" \\\n  --prompt \"New GitHub issue #{issue.number}: {issue.title}\\n\\nAction: {action}\\nAuthor: {issue.user.login}\\nBody:\\n{issue.body}\\n\\nPlease triage this issue.\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"-100123456789\"\n```\n\nThen in GitHub repo Settings → Webhooks → Add webhook:\n- Payload URL: the returned webhook_url\n- Content type: application\u002Fjson\n- Secret: the returned secret\n- Events: \"Issues\"\n\n### GitHub: PR reviews\n```bash\nhermes webhook subscribe github-prs \\\n  --events \"pull_request\" \\\n  --prompt \"PR #{pull_request.number} {action}: {pull_request.title}\\nBy: {pull_request.user.login}\\nBranch: {pull_request.head.ref}\\n\\n{pull_request.body}\" \\\n  --skills \"github-code-review\" \\\n  --deliver github_comment\n```\n\n### Stripe: payment events\n```bash\nhermes webhook subscribe stripe-payments \\\n  --events \"payment_intent.succeeded,payment_intent.payment_failed\" \\\n  --prompt \"Payment {data.object.status}: {data.object.amount} cents from {data.object.receipt_email}\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"-100123456789\"\n```\n\n### CI\u002FCD: build notifications\n```bash\nhermes webhook subscribe ci-builds \\\n  --events \"pipeline\" \\\n  --prompt \"Build {object_attributes.status} on {project.name} branch {object_attributes.ref}\\nCommit: {commit.message}\" \\\n  --deliver discord \\\n  --deliver-chat-id \"1234567890\"\n```\n\n### Generic monitoring alert\n```bash\nhermes webhook subscribe alerts \\\n  --prompt \"Alert: {alert.name}\\nSeverity: {alert.severity}\\nMessage: {alert.message}\\n\\nPlease investigate and suggest remediation.\" \\\n  --deliver origin\n```\n\n## Security\n\n- Each subscription gets an auto-generated HMAC-SHA256 secret (or provide your own with `--secret`)\n- The webhook adapter validates signatures on every incoming POST\n- Static routes from config.yaml cannot be overwritten by dynamic subscriptions\n- Subscriptions persist to `~\u002F.hermes\u002Fwebhook_subscriptions.json`\n\n## How It Works\n\n1. `hermes webhook subscribe` writes to `~\u002F.hermes\u002Fwebhook_subscriptions.json`\n2. The webhook adapter hot-reloads this file on each incoming request (mtime-gated, negligible overhead)\n3. When a POST arrives matching a route, the adapter formats the prompt and triggers an agent run\n4. The agent's response is delivered to the configured target (Telegram, Discord, GitHub comment, etc.)\n\n## Troubleshooting\n\nIf webhooks aren't working:\n\n1. **Is the gateway running?** Check with `systemctl --user status hermes-gateway` or `ps aux | grep gateway`\n2. **Is the webhook server listening?** `curl http:\u002F\u002Flocalhost:8644\u002Fhealth` should return `{\"status\": \"ok\"}`\n3. **Check gateway logs:** `grep webhook ~\u002F.hermes\u002Flogs\u002Fgateway.log | tail -20`\n4. **Signature mismatch?** Verify the secret in your service matches the one from `hermes webhook list`. GitHub sends `X-Hub-Signature-256`, GitLab sends `X-Gitlab-Token`.\n5. **Firewall\u002FNAT?** The webhook URL must be reachable from the service. For local development, use a tunnel (ngrok, cloudflared).\n6. **Wrong event type?** Check `--events` filter matches what the service sends. Use `hermes webhook test \u003Cname>` to verify the route works.\n","# Webhook Subscriptions\n\nCreate dynamic webhook subscriptions so external services (GitHub, GitLab, Stripe, CI\u002FCD, IoT sensors, monitoring tools) can trigger Hermes agent runs by POSTing events to a URL.\n\n## Setup (Required First)\n\nThe webhook platform must be enabled before subscriptions can be created. Check with:\n```bash\nhermes webhook list\n```\n\nIf it says \"Webhook platform is not enabled\", set it up:\n\n### Option 1: Setup wizard\n```bash\nhermes gateway setup\n```\nFollow the prompts to enable webhooks, set the port, and set a global HMAC secret.\n\n### Option 2: Manual config\nAdd to `~\u002F.hermes\u002Fconfig.yaml`:\n```yaml\nplatforms:\n  webhook:\n    enabled: true\n    extra:\n      host: \"0.0.0.0\"\n      port: 8644\n      secret: \"generate-a-strong-secret-here\"\n```\n\n### Option 3: Environment variables\nAdd to `~\u002F.hermes\u002F.env`:\n```bash\nWEBHOOK_ENABLED=true\nWEBHOOK_PORT=8644\nWEBHOOK_SECRET=generate-a-strong-secret-here\n```\n\nAfter configuration, start (or restart) the gateway:\n```bash\nhermes gateway run\n# Or if using systemd:\nsystemctl --user restart hermes-gateway\n```\n\nVerify it's running:\n```bash\ncurl http:\u002F\u002Flocalhost:8644\u002Fhealth\n```\n\n## Commands\n\nAll management is via the `hermes webhook` CLI command:\n\n### Create a subscription\n```bash\nhermes webhook subscribe \u003Cname> \\\n  --prompt \"Prompt template with {payload.fields}\" \\\n  --events \"event1,event2\" \\\n  --description \"What this does\" \\\n  --skills \"skill1,skill2\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"12345\" \\\n  --secret \"optional-custom-secret\"\n```\n\nReturns the webhook URL and HMAC secret. The user configures their service to POST to that URL.\n\n### List subscriptions\n```bash\nhermes webhook list\n```\n\n### Remove a subscription\n```bash\nhermes webhook remove \u003Cname>\n```\n\n### Test a subscription\n```bash\nhermes webhook test \u003Cname>\nhermes webhook test \u003Cname> --payload '{\"key\": \"value\"}'\n```\n\n## Prompt Templates\n\nPrompts support `{dot.notation}` for accessing nested payload fields:\n\n- `{issue.title}` — GitHub issue title\n- `{pull_request.user.login}` — PR author\n- `{data.object.amount}` — Stripe payment amount\n- `{sensor.temperature}` — IoT sensor reading\n\nIf no prompt is specified, the full JSON payload is dumped into the agent prompt.\n\n## Common Patterns\n\n### GitHub: new issues\n```bash\nhermes webhook subscribe github-issues \\\n  --events \"issues\" \\\n  --prompt \"New GitHub issue #{issue.number}: {issue.title}\\n\\nAction: {action}\\nAuthor: {issue.user.login}\\nBody:\\n{issue.body}\\n\\nPlease triage this issue.\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"-100123456789\"\n```\n\nThen in GitHub repo Settings → Webhooks → Add webhook:\n- Payload URL: the returned webhook_url\n- Content type: application\u002Fjson\n- Secret: the returned secret\n- Events: \"Issues\"\n\n### GitHub: PR reviews\n```bash\nhermes webhook subscribe github-prs \\\n  --events \"pull_request\" \\\n  --prompt \"PR #{pull_request.number} {action}: {pull_request.title}\\nBy: {pull_request.user.login}\\nBranch: {pull_request.head.ref}\\n\\n{pull_request.body}\" \\\n  --skills \"github-code-review\" \\\n  --deliver github_comment\n```\n\n### Stripe: payment events\n```bash\nhermes webhook subscribe stripe-payments \\\n  --events \"payment_intent.succeeded,payment_intent.payment_failed\" \\\n  --prompt \"Payment {data.object.status}: {data.object.amount} cents from {data.object.receipt_email}\" \\\n  --deliver telegram \\\n  --deliver-chat-id \"-100123456789\"\n```\n\n### CI\u002FCD: build notifications\n```bash\nhermes webhook subscribe ci-builds \\\n  --events \"pipeline\" \\\n  --prompt \"Build {object_attributes.status} on {project.name} branch {object_attributes.ref}\\nCommit: {commit.message}\" \\\n  --deliver discord \\\n  --deliver-chat-id \"1234567890\"\n```\n\n### Generic monitoring alert\n```bash\nhermes webhook subscribe alerts \\\n  --prompt \"Alert: {alert.name}\\nSeverity: {alert.severity}\\nMessage: {alert.message}\\n\\nPlease investigate and suggest remediation.\" \\\n  --deliver origin\n```\n\n## Security\n\n- Each subscription gets an auto-generated HMAC-SHA256 secret (or provide your own with `--secret`)\n- The webhook adapter validates signatures on every incoming POST\n- Static routes from config.yaml cannot be overwritten by dynamic subscriptions\n- Subscriptions persist to `~\u002F.hermes\u002Fwebhook_subscriptions.json`\n\n## How It Works\n\n1. `hermes webhook subscribe` writes to `~\u002F.hermes\u002Fwebhook_subscriptions.json`\n2. The webhook adapter hot-reloads this file on each incoming request (mtime-gated, negligible overhead)\n3. When a POST arrives matching a route, the adapter formats the prompt and triggers an agent run\n4. The agent's response is delivered to the configured target (Telegram, Discord, GitHub comment, etc.)\n\n## Troubleshooting\n\nIf webhooks aren't working:\n\n1. **Is the gateway running?** Check with `systemctl --user status hermes-gateway` or `ps aux | grep gateway`\n2. **Is the webhook server listening?** `curl http:\u002F\u002Flocalhost:8644\u002Fhealth` should return `{\"status\": \"ok\"}`\n3. **Check gateway logs:** `grep webhook ~\u002F.hermes\u002Flogs\u002Fgateway.log | tail -20`\n4. **Signature mismatch?** Verify the secret in your service matches the one from `hermes webhook list`. GitHub sends `X-Hub-Signature-256`, GitLab sends `X-Gitlab-Token`.\n5. **Firewall\u002FNAT?** The webhook URL must be reachable from the service. For local development, use a tunnel (ngrok, cloudflared).\n6. **Wrong event type?** Check `--events` filter matches what the service sends. Use `hermes webhook test \u003Cname>` to verify the route works.\n",{"name":5,"version":47,"metadata":48,"description":7},"1.0.0",{"hermes":49},{"tags":50},[26,38,31,37],"main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fhermes\u002Fwebhook-subscriptions","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill webhook-subscriptions",{"tool":63,"command":64},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill webhook-subscriptions",{"tool":66,"command":67},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill webhook-subscriptions","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fhermes\u002Fwebhook-subscriptions\u002FSKILL.md",true,[],[72,96,121,131,144,161],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":83,"publishedAt":42},"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",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[84,85,86,87,88,89,90,91,92,93,94,95],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":42},"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",[],[103,104,105,106,107,108,86,109,110,111,112,41,113,114,115,116,117,118,119,120],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","brew","live","data","google","install","read","across","api",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":42},"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",[],[128,129,103,113,114,115,116,107,86,118,130,119,120,41,111,110,109,117,108,106],"trend radar","radar","pulse",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":42},"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",[],[138,139,140,141,142,143],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":153,"publishedAt":42},"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",[150],{"categoryNo":151,"categoryName":152,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[146,92,154,155,156,95,113,157,158,159,105,160,117],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":42},"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",[],[163,168,169,170,117,171,158,172,173,174,175,176],"status","play","go","latest","github","discover","control","cmd","volume"]