[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GJS19KDPRY112JTR326S06":3,"skill-same:01M6GJS19KDPRY112JTR326S06":92},{"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},"01M6GJS19KDPRY112JTR326S06","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\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\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,"---\nname: watchers\ndescription: Poll RSS, JSON APIs, and GitHub with watermark dedup.\nversion: 1.0.0\nauthor: Hermes Agent\nlicense: MIT\nplatforms: [linux, macos]\nmetadata:\n  hermes:\n    tags: [cron, polling, rss, github, http, automation, monitoring]\n    category: devops\n    requires_toolsets: [terminal]\n    related_skills: []\n---\n\n# Watchers\n\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).\n\n## When to Use\n\n- User wants to watch an RSS\u002FAtom feed and be notified of new entries\n- User wants to watch a GitHub repo's issues \u002F pulls \u002F releases \u002F commits\n- User wants to poll an arbitrary JSON endpoint and get notified on new items\n- User asks for \"a watcher for X\" or \"notify me when X changes\"\n\n## Mental model\n\nA watcher is just a script that:\n\n1. Fetches data from the external source\n2. Compares against a watermark file of previously-seen IDs\n3. Writes the new watermark back\n4. Prints new items to stdout (or nothing on no-change)\n\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.\n\n## Ready-made scripts\n\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.\n\n| Script | What it watches | Dedup key |\n|---|---|---|\n| `watch_rss.py` | RSS 2.0 or Atom feed URL | `\u003Cguid>` \u002F `\u003Cid>` |\n| `watch_http_json.py` | Any JSON endpoint returning a list of objects | Configurable id field |\n| `watch_github.py` | GitHub issues \u002F pulls \u002F releases \u002F commits for a repo | `id` \u002F `sha` |\n\nAll three:\n\n- First run records a baseline — never replays existing feed\n- Watermark is a bounded ID set (max 500) to cap memory\n- Output format: `## \u003Ctitle>\\n\u003Curl>\\n\\n\u003Coptional body>` per item\n- Empty stdout on no-new — the caller treats that as silent\n- Non-zero exit on fetch errors\n\n## Usage\n\nRun a watcher directly from the terminal tool:\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_rss.py \\\n  --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss --max 5\n```\n\nWatch a GitHub repo (set `GITHUB_TOKEN` in `~\u002F.hermes\u002F.env` to avoid the 60 req\u002Fhr anonymous rate limit):\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_github.py \\\n  --name hermes-issues --repo NousResearch\u002Fhermes-agent --scope issues\n```\n\nPoll an arbitrary JSON API:\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_http_json.py \\\n  --name api --url https:\u002F\u002Fapi.example.com\u002Fevents \\\n  --id-field event_id --items-path data.events\n```\n\n## Wiring into cron\n\nAsk the agent to schedule a cron job with a prompt like:\n\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.\n\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.\n\n## State files\n\nEvery watcher writes `$HERMES_HOME\u002Fwatcher-state\u002F\u003Cname>.json`. Inspect:\n\n```bash\ncat $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\n```\n\nForce a replay (next run treated as first poll):\n\n```bash\nrm $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\n```\n\n## Writing your own\n\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.\n\n## Common Pitfalls\n\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.\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.\n3. **Unbounded watermark growth.** The shared helper caps at 500 IDs. Raise it for high-churn feeds; lower it on constrained filesystems.\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.\n\n","# Watchers\n\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).\n\n## When to Use\n\n- User wants to watch an RSS\u002FAtom feed and be notified of new entries\n- User wants to watch a GitHub repo's issues \u002F pulls \u002F releases \u002F commits\n- User wants to poll an arbitrary JSON endpoint and get notified on new items\n- User asks for \"a watcher for X\" or \"notify me when X changes\"\n\n## Mental model\n\nA watcher is just a script that:\n\n1. Fetches data from the external source\n2. Compares against a watermark file of previously-seen IDs\n3. Writes the new watermark back\n4. Prints new items to stdout (or nothing on no-change)\n\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.\n\n## Ready-made scripts\n\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.\n\n| Script | What it watches | Dedup key |\n|---|---|---|\n| `watch_rss.py` | RSS 2.0 or Atom feed URL | `\u003Cguid>` \u002F `\u003Cid>` |\n| `watch_http_json.py` | Any JSON endpoint returning a list of objects | Configurable id field |\n| `watch_github.py` | GitHub issues \u002F pulls \u002F releases \u002F commits for a repo | `id` \u002F `sha` |\n\nAll three:\n\n- First run records a baseline — never replays existing feed\n- Watermark is a bounded ID set (max 500) to cap memory\n- Output format: `## \u003Ctitle>\\n\u003Curl>\\n\\n\u003Coptional body>` per item\n- Empty stdout on no-new — the caller treats that as silent\n- Non-zero exit on fetch errors\n\n## Usage\n\nRun a watcher directly from the terminal tool:\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_rss.py \\\n  --name hn --url https:\u002F\u002Fnews.ycombinator.com\u002Frss --max 5\n```\n\nWatch a GitHub repo (set `GITHUB_TOKEN` in `~\u002F.hermes\u002F.env` to avoid the 60 req\u002Fhr anonymous rate limit):\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_github.py \\\n  --name hermes-issues --repo NousResearch\u002Fhermes-agent --scope issues\n```\n\nPoll an arbitrary JSON API:\n\n```bash\npython $HERMES_HOME\u002Fskills\u002Fdevops\u002Fwatchers\u002Fscripts\u002Fwatch_http_json.py \\\n  --name api --url https:\u002F\u002Fapi.example.com\u002Fevents \\\n  --id-field event_id --items-path data.events\n```\n\n## Wiring into cron\n\nAsk the agent to schedule a cron job with a prompt like:\n\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.\n\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.\n\n## State files\n\nEvery watcher writes `$HERMES_HOME\u002Fwatcher-state\u002F\u003Cname>.json`. Inspect:\n\n```bash\ncat $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\n```\n\nForce a replay (next run treated as first poll):\n\n```bash\nrm $HERMES_HOME\u002Fwatcher-state\u002Fhn.json\n```\n\n## Writing your own\n\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.\n\n## Common Pitfalls\n\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.\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.\n3. **Unbounded watermark growth.** The shared helper caps at 500 IDs. Raise it for high-churn feeds; lower it on constrained filesystems.\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.\n\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","registry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional",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\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",true,[74,80,84,88],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"scripts\u002F_watermark.py","SCRIPT","脚本",5243,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002Fscripts\u002F_watermark.py",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002Fwatch_github.py",6160,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002Fscripts\u002Fwatch_github.py",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fwatch_http_json.py",4589,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002Fscripts\u002Fwatch_http_json.py",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fwatch_rss.py",4114,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002Fscripts\u002Fwatch_rss.py",[93,122,157,184,211,236],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":108,"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",[99,102,103],{"categoryNo":100,"categoryName":101,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[95,109,24,110,26,27,111,112,113,114,115,116,117,34,35,118,52,119,120,121],"openclaw","cli","windows","official","search","https","social-media","api","Media","twitter","social","via","post",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":139,"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",[128,131,134,135,136],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":132,"categoryName":133,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},{"categoryNo":137,"categoryName":138,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000036","内容创作者",[140,141,142,143,24,144,27,145,111,146,147,148,149,150,151,152,153,154,155,156],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"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",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[159,24,27,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":193,"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",[190],{"categoryNo":191,"categoryName":192,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[194,24,195,196,111,197,198,199,200,201,202,174,203,204,205,206,207,208,209,210],"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":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":219,"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",[217,218],{"categoryNo":100,"categoryName":101,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},[220,221,222,27,223,167,224,225,226,170,227,116,228,229,230,231,232,233,234,235],"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",{"skillNo":237,"name":238,"nameZh":6,"description":239,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":240,"categories":241,"keywords":242,"publishedAt":38},"01M6GJR9STSK42W3XT78YEQYCS","unsloth","Unsloth: 2-5x faster LoRA\u002FQLoRA fine-tuning, less VRAM.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Funsloth\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[],[243,27,244,223,245,246,247,248,249,250,251,252,253,254,170,201,255,256,257,258],"Unsloth","memory","training","fast","Optimization","Fine-Tuning","LoRA","QLoRA","Fast Training","Memory-Efficient","Llama","Mistral","datasets","TRL","PEFT","vram"]