[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GDEV9B395D4JRR03RNC2ZR":3,"skill-same:01M6GDEV9B395D4JRR03RNC2ZR":74},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6GDEV9B395D4JRR03RNC2ZR","watchers",null,"Poll RSS, JSON APIs, and GitHub with watermark dedup.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9a63fde81aabe6e93dd6468ec17a1e8ae24bc907904eb19e797bb10f47569d0\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"macos","terminal","github","linux","automation","http","monitoring","cron","json","rss","hermes","hermes agent","devops","with","2026-11-10 10:12:30",false,"---\r\nname: watchers\r\ndescription: Poll RSS, JSON APIs, and GitHub with watermark dedup.\r\nversion: 1.0.0\r\nauthor: Hermes Agent\r\nlicense: MIT\r\nplatforms: [linux, macos]\r\nmetadata:\r\n  hermes:\r\n    tags: [cron, polling, rss, github, http, automation, monitoring]\r\n    category: devops\r\n    requires_toolsets: [terminal]\r\n    related_skills: []\r\n---\r\n\r\n# Watchers\r\n\r\nPoll external sources on an interval and react only to new items. Three ready-made scripts plus a shared watermark helper; wire them into a cron job (or run them ad-hoc from the terminal).\r\n\r\n## When to Use\r\n\r\n- User wants to watch an RSS\u002FAtom feed and be notified of new entries\r\n- User wants to watch a GitHub repo's issues \u002F pulls \u002F releases \u002F commits\r\n- User wants to poll an arbitrary JSON endpoint and get notified on new items\r\n- User asks for \"a watcher for X\" or \"notify me when X changes\"\r\n\r\n## Mental model\r\n\r\nA watcher is just a script that:\r\n\r\n1. Fetches data from the external source\r\n2. Compares against a watermark file of previously-seen IDs\r\n3. Writes the new watermark back\r\n4. Prints new items to stdout (or nothing on no-change)\r\n\r\nThe scripts below handle all three. The agent runs them via the terminal tool — from a cron job, a webhook, or an interactive chat — and reports what's new.\r\n\r\n## Ready-made scripts\r\n\r\nAll three live in `$HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002F` once the skill is installed. Each reads `WATCHER_STATE_DIR` (defaults to `$HERMES_HOME\u002Fwatcher-state\u002F`) for its state file, keyed by the `--name` argument.\r\n\r\n| Script | What it watches | Dedup key |\r\n|---|---|---|\r\n| `watch_rss.py` | RSS 2.0 or Atom feed URL | `\u003Cguid>` \u002F `\u003Cid>` |\r\n| `watch_http_json.py` | Any JSON endpoint returning a list of objects | Configurable id field |\r\n| `watch_github.py` | GitHub issues \u002F pulls \u002F releases \u002F commits for a repo | `id` \u002F `sha` |\r\n\r\nAll three:\r\n\r\n- First run records a baseline — never replays existing feed\r\n- Watermark is a bounded ID set (max 500) to cap memory\r\n- Output format: `## \u003Ctitle>\\n\u003Curl>\\n\\n\u003Coptional body>` per item\r\n- Empty stdout on no-new — the caller treats that as silent\r\n- Non-zero exit on fetch errors\r\n\r\n## Usage\r\n\r\nRun a watcher directly from the terminal tool:\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_rss.py \\\r\n  --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss --max 5\r\n```\r\n\r\nWatch a GitHub repo (set `GITHUB_TOKEN` in `${HERMES_HOME:-~\u002F.hermes}\u002F.env` to avoid the 60 req\u002Fhr anonymous rate limit):\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_github.py \\\r\n  --name hermes-issues --repo NousResearch\u002Fhermes-agent --scope issues\r\n```\r\n\r\nPoll an arbitrary JSON API:\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_http_json.py \\\r\n  --name api --url https:\u002F\u002Fapi.example.com\u002Fevents \\\r\n  --id-field event_id --items-path data.events\r\n```\r\n\r\n## Wiring into cron\r\n\r\nAsk the agent to schedule a cron job with a prompt like:\r\n\r\n> Every 15 minutes, run `watch_rss.py --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss`. If it prints anything, summarize the headlines and deliver them. If it prints nothing, stay silent.\r\n\r\nThe agent invokes the script via the terminal tool inside the cron job's agent loop; no changes to cron's built-in `--script` flag are needed.\r\n\r\n## State files\r\n\r\nEvery watcher writes `$HERMES_HOME\u002Fwatcher-state\u002F\u003Cname>.json`. Inspect:\r\n\r\n```bash\r\ncat $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\r\n```\r\n\r\nForce a replay (next run treated as first poll):\r\n\r\n```bash\r\nrm $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\r\n```\r\n\r\n## Writing your own\r\n\r\nAll three scripts use the same template: load watermark, fetch, diff, save, emit. `scripts\u002F_watermark.py` is the shared helper; import it to get atomic writes + bounded ID set + first-run baseline for free. See any of the three reference scripts for how little boilerplate it takes.\r\n\r\n## Common Pitfalls\r\n\r\n1. **Printing a \"no new items\" header every tick.** Callers rely on empty stdout = silent. If you print anything on an empty delta, you spam the channel. The shipped scripts handle this; custom scripts must too.\r\n2. **Expecting the first run to emit items.** It won't — first run records a baseline. If you need an initial digest, delete the state file after the first run or add a `--prime-with-latest N` flag in your own script.\r\n3. **Unbounded watermark growth.** The shared helper caps at 500 IDs. Raise it for high-churn feeds; lower it on constrained filesystems.\r\n4. **Putting the state dir where the agent's sandbox can't write.** `$HERMES_HOME\u002Fwatcher-state\u002F` is always writable. Docker\u002FModal backends may not see arbitrary host paths.\r\n","# Watchers\r\n\r\nPoll external sources on an interval and react only to new items. Three ready-made scripts plus a shared watermark helper; wire them into a cron job (or run them ad-hoc from the terminal).\r\n\r\n## When to Use\r\n\r\n- User wants to watch an RSS\u002FAtom feed and be notified of new entries\r\n- User wants to watch a GitHub repo's issues \u002F pulls \u002F releases \u002F commits\r\n- User wants to poll an arbitrary JSON endpoint and get notified on new items\r\n- User asks for \"a watcher for X\" or \"notify me when X changes\"\r\n\r\n## Mental model\r\n\r\nA watcher is just a script that:\r\n\r\n1. Fetches data from the external source\r\n2. Compares against a watermark file of previously-seen IDs\r\n3. Writes the new watermark back\r\n4. Prints new items to stdout (or nothing on no-change)\r\n\r\nThe scripts below handle all three. The agent runs them via the terminal tool — from a cron job, a webhook, or an interactive chat — and reports what's new.\r\n\r\n## Ready-made scripts\r\n\r\nAll three live in `$HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002F` once the skill is installed. Each reads `WATCHER_STATE_DIR` (defaults to `$HERMES_HOME\u002Fwatcher-state\u002F`) for its state file, keyed by the `--name` argument.\r\n\r\n| Script | What it watches | Dedup key |\r\n|---|---|---|\r\n| `watch_rss.py` | RSS 2.0 or Atom feed URL | `\u003Cguid>` \u002F `\u003Cid>` |\r\n| `watch_http_json.py` | Any JSON endpoint returning a list of objects | Configurable id field |\r\n| `watch_github.py` | GitHub issues \u002F pulls \u002F releases \u002F commits for a repo | `id` \u002F `sha` |\r\n\r\nAll three:\r\n\r\n- First run records a baseline — never replays existing feed\r\n- Watermark is a bounded ID set (max 500) to cap memory\r\n- Output format: `## \u003Ctitle>\\n\u003Curl>\\n\\n\u003Coptional body>` per item\r\n- Empty stdout on no-new — the caller treats that as silent\r\n- Non-zero exit on fetch errors\r\n\r\n## Usage\r\n\r\nRun a watcher directly from the terminal tool:\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_rss.py \\\r\n  --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss --max 5\r\n```\r\n\r\nWatch a GitHub repo (set `GITHUB_TOKEN` in `${HERMES_HOME:-~\u002F.hermes}\u002F.env` to avoid the 60 req\u002Fhr anonymous rate limit):\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_github.py \\\r\n  --name hermes-issues --repo NousResearch\u002Fhermes-agent --scope issues\r\n```\r\n\r\nPoll an arbitrary JSON API:\r\n\r\n```bash\r\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_http_json.py \\\r\n  --name api --url https:\u002F\u002Fapi.example.com\u002Fevents \\\r\n  --id-field event_id --items-path data.events\r\n```\r\n\r\n## Wiring into cron\r\n\r\nAsk the agent to schedule a cron job with a prompt like:\r\n\r\n> Every 15 minutes, run `watch_rss.py --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss`. If it prints anything, summarize the headlines and deliver them. If it prints nothing, stay silent.\r\n\r\nThe agent invokes the script via the terminal tool inside the cron job's agent loop; no changes to cron's built-in `--script` flag are needed.\r\n\r\n## State files\r\n\r\nEvery watcher writes `$HERMES_HOME\u002Fwatcher-state\u002F\u003Cname>.json`. Inspect:\r\n\r\n```bash\r\ncat $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\r\n```\r\n\r\nForce a replay (next run treated as first poll):\r\n\r\n```bash\r\nrm $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\r\n```\r\n\r\n## Writing your own\r\n\r\nAll three scripts use the same template: load watermark, fetch, diff, save, emit. `scripts\u002F_watermark.py` is the shared helper; import it to get atomic writes + bounded ID set + first-run baseline for free. See any of the three reference scripts for how little boilerplate it takes.\r\n\r\n## Common Pitfalls\r\n\r\n1. **Printing a \"no new items\" header every tick.** Callers rely on empty stdout = silent. If you print anything on an empty delta, you spam the channel. The shipped scripts handle this; custom scripts must too.\r\n2. **Expecting the first run to emit items.** It won't — first run records a baseline. If you need an initial digest, delete the state file after the first run or add a `--prime-with-latest N` flag in your own script.\r\n3. **Unbounded watermark growth.** The shared helper caps at 500 IDs. Raise it for high-churn feeds; lower it on constrained filesystems.\r\n4. **Putting the state dir where the agent's sandbox can't write.** `$HERMES_HOME\u002Fwatcher-state\u002F` is always writable. Docker\u002FModal backends may not see arbitrary host paths.\r\n",{"name":5,"author":43,"license":15,"version":44,"metadata":45,"platforms":51,"description":7},"Hermes Agent","1.0.0",{"hermes":46},{"tags":47,"category":36,"related_skills":49,"requires_toolsets":50},[31,48,33,26,29,28,30],"polling",[],[25],[27,24],"main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9a63fde81aabe6e93dd6468ec17a1e8ae24bc907904eb19e797bb10f47569d0",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add zapabob\u002FSkills --skill watchers",{"tool":66,"command":67},"bunx","bunx skills add zapabob\u002FSkills --skill watchers",{"tool":69,"command":70},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill watchers","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002Fb9\u002Fb9a63fde81aabe6e93dd6468ec17a1e8ae24bc907904eb19e797bb10f47569d0\u002FSKILL.md",true,[],[75,104,139,166,193,199],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":90,"publishedAt":38},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[81,84,85],{"categoryNo":82,"categoryName":83,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[77,91,24,92,26,27,93,94,95,96,97,98,99,34,35,100,52,101,102,103],"openclaw","cli","windows","official","search","https","social-media","api","Media","twitter","social","via","post",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":121,"publishedAt":38},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[110,113,116,117,118],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":114,"categoryName":115,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},{"categoryNo":119,"categoryName":120,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000036","内容创作者",[122,123,124,125,24,126,27,127,93,128,129,130,131,132,133,134,135,136,137,138],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":148,"publishedAt":38},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[141,24,27,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":175,"publishedAt":38},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[172],{"categoryNo":173,"categoryName":174,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[176,24,177,178,93,179,180,181,182,183,184,156,185,186,187,188,189,190,191,192],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":194,"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":195,"categories":196,"keywords":198,"publishedAt":38},"01M6GJS19KDPRY112JTR326S06","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[197],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37],{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":203,"categories":204,"keywords":207,"publishedAt":38},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[205,206],{"categoryNo":82,"categoryName":83,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},[208,209,210,27,211,149,212,213,214,152,215,98,216,217,218,219,220,221,222,223],"llms","vLLM","serving llms vllm","research","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]