An agent skill for authoring PR-ready RSSHub routes — code that survives code review, not just code that runs.
English | 中文
This is an unofficial community project. It is not affiliated with, endorsed by, or connected to RSSHub or its maintainers. It is a summary of publicly visible review feedback, offered as advice only: whenever it disagrees with
AGENTS.md, the official docs, or a maintainer, they are right and this is wrong.
If an agent uses this skill and a reviewer raises something it did not cover, the skill may offer to report that back here. It will never do so unless you explicitly agree.
Concretely, the skill is instructed to:
- ask first, every single time — no exceptions;
- never open an issue, open a pull request, edit a file, or make any network call about this repository unless you asked it to;
- if you decline, drop the matter entirely.
If you do agree, the report is filed with your GitHub account via gh, which means it
appears publicly under your name. Nothing leaves your machine otherwise.
This matters because the skill is built from real review feedback — but a feedback loop that
runs silently would be a betrayal of the person who installed it. So: visible, opt-in, and
always under your control. Details in CONTRIBUTING.md.
The rule content here is derived from real review data and is reproducible with tools/.
The explanatory prose was drafted with substantial AI assistance and reviewed by a human
contributor. That combination has a particular failure mode worth stating plainly: AI-written
guidance tends to state patterns more confidently than the evidence supports.
Two consequences for readers:
- Every count in this repository can be recomputed with
npm run fetch && npm run analyze. - Any claim that carries neither a count nor a rule ID should be treated as unverified.
Most RSSHub route guides explain how to fetch and parse a page. That part is easy. The hard part is the review. This skill is built from the review record itself, so that an agent can get it right the first time and not spend a maintainer's evening on avoidable round trips.
RSSHub is maintained by volunteers who review an extraordinary volume of contributions. Every number in this repository is a small window onto work they do for free. Nothing here is intended as a way to game review — the goal is the opposite: send PRs that need less of their time, and learn from what they have already had to explain hundreds of times.
Every claim traces back to real reviewer feedback, not to intuition:
| Corpus | 2,727 route PRs from DIYgod/RSSHub — 1,987 merged, 740 closed without merge |
| Comments | 18,680 (5,037 human, 589 auto-review, 13,054 other bot) |
| Collection | GitHub GraphQL via gh; feat(route) and fix(route), each split into merged and closed-without-merge |
| Reproduce | npm i && npm run fetch && npm run analyze |
The pipeline lives in tools/ and is re-runnable, so the counts can be refreshed
as review practice changes. See the caveat at the bottom about what this data can and cannot
tell you.
Ranked by how often each subject comes up in human review comments:
| Subject | Mentions |
|---|---|
description content |
282 |
categories |
221 |
| cache usage | 191 |
example path |
170 |
| redundant / unnecessary code | 166 |
maintainers |
102 |
pubDate |
99 |
| the site already has an official feed | 81 |
| Puppeteer | 79 |
| images and media | 74 |
.first() / .last() |
73 |
| radar | 37 |
?. / ?? '' |
35 |
hardcoded User-Agent |
30 |
The bolded row is the one a corpus of merged PRs alone would have missed: it comes mostly from routes that were declined before any code review.
Read this as "where contributors most often need help", not as a list of traps. The most common request is simply: does this defensive construct actually have a reason to exist? Answering that with a count instead of an opinion is most of what this skill teaches.
This is a plain Agent Skills package: a folder with a
SKILL.md at its root. Anything that implements that standard can load it. Clone it into the
skills directory your agent reads, keeping the repository name — the spec requires the
name in the frontmatter to match the directory name.
git clone https://github.com/AboutRSS/rsshub-route-authoring-skill.git| Agent | Skills directory | Status |
|---|---|---|
| CodeBuddy | ~/.codebuddy/skills/ |
verified |
| Antigravity | ~/.gemini/antigravity/skills/ |
verified |
| Claude Code | ~/.claude/skills/ |
documented, not verified here |
| Cursor | uses .cursor/rules/*.mdc — a different system |
not applicable as-is |
On Windows the same paths are C:\Users\<you>\.codebuddy\skills\ and
C:\Users\<you>\.gemini\antigravity\skills\.
Two things to know before it works:
- Run
npm iinside the skill folder once. Onlyscripts/needs it (cheerio, iconv-lite);references/is plain Markdown. - The skill operates on an RSSHub checkout, so the workspace it runs in has to be one, and
ghhas to be authenticated for rule fetching.
Antigravity also has project-level Workflow files at .agent/workflows/*.md that can invoke
a global skill; see its documentation if you want a slash command for this one.
If you fork this repository, replace the account name in the clone command above.
The package uses only standard Agent Skills fields — name, description, license,
compatibility, metadata, plus allowed-tools (ignored by platforms that do not define it).
There is no platform-specific configuration, no environment file and no installer script.
What limits portability is the environment, not the format:
| Requirement | Needed for | Without it |
|---|---|---|
| An RSSHub checkout as the workspace | everything — routes are written into lib/routes/, and AGENTS.md is read from the repo root |
the skill has nowhere to work |
| Node.js | RSSHub itself, per its own package.json engines field |
RSSHub will not start |
| pnpm 10 | installing RSSHub's dependencies | pnpm i fails |
gh, authenticated |
fetching AGENTS.md and .github/prompts/pr_review_rules.md, and everything under tools/ |
the auto-review rule list cannot be fetched |
npm i inside this folder |
scripts/verify-selectors.mjs and scripts/pre-submit-check.mjs |
the verification scripts cannot run |
Everything in references/ is plain Markdown and needs no setup on any platform — deliberately
so, since that is where most of the value lives.
allowed-tools is declared so platforms that support it can pre-authorise the small set of
commands this skill needs: file reads and edits, page fetches, and git / node / npm /
pnpm / gh. It has only been exercised on CodeBuddy and Antigravity. If it blocks something
on your platform, delete the line — it is optional.
The skill activates on requests to write, fix or review an RSSHub route. Its core loop:
- Set up the environment (RSSHub checkout, dependencies, dev server)
- Read the repo's own
AGENTS.mdand the official docs - Confirm the route does not already exist
- Prefer an API, then server-rendered HTML, then Puppeteer; first page only
- Write
namespace.ts+ the route file - Verify with evidence —
scripts/verify-selectors.mjsproduces the counts - Submit using the current PR template
- Respond to review, then clean up after merge
# Justify or kill .first() / .trim(), and check link absoluteness
npm run verify -- --url <page> --item <sel> --field <sel> --attr href --base <url>
# Static gate before committing (LF, BOM, hardcoded UA, pagination, fake dates, …)
npm run check -- lib/routes/<namespace>Example output — this is the evidence a reviewer is asking for:
item selector : .list_body_bd li -> 35 item(s)
--- .first() / .last() justification
items with >1 : 0 / 35
=> NOT justified — remove .first() / .last()
--- .trim() justification
items where text !== text.trim() : 0 / 35
=> NOT justified — remove .trim()
--- links
resolvable : 35 / 35
unique : 35 / 35
Two of the evals cover the opposite case — where .first() is justified and must be kept
and defended with a count. "Always delete" would be as wrong as "always keep".
SKILL.md main SOP
CONTRIBUTING.md how to report feedback, and how credit works
.github/ISSUE_TEMPLATE/ structured forms for observations and corrections
references/
anti-patterns.md the corpus, distilled (21 sections, with counts)
examples.md API / HTML / Puppeteer route templates
review-response.md decoding comments, answer templates, CI checks, after merge
engineering-traps.md LF line endings, TS annotations, branch setup
pr-template.md current PR template and how to fill it
scripts/
verify-selectors.mjs produces the counts that justify defensive code
pre-submit-check.mjs static gate, scoped to files that differ from HEAD
evals/
evals.json cases drawn from real merged PRs
tools/ corpus pipeline, not loaded when the skill runs
Three earlier skills cover RSSHub route authoring. This one is written independently rather than forked, so it can disagree with them where the review record points the other way — but they were here first and are worth reading.
| Repo | What it does well | Where the review record disagrees |
|---|---|---|
| ovo-Tim/rsshub-skill | Broadest rule coverage; correctly forbids a separate radar.ts; vendors the docs as a submodule |
Example handler omits Context / Promise<Data>; no warning about hardcoded User-Agent |
| wha7ev9r/rsshub-route-skill | Largest; only one with an eval set; strong "common pitfalls" section | Advises adding a User-Agent on 403 — the auto-review bot rejects that as a numbered rule; PR checklist and commit format are outdated |
| ChuYinan2023/rsshub-route-developer | Clear six-phase workflow; notes that pnpm run format rewrites the whole repo |
Instructs creating a separate radar.ts, which the rules forbid |
Structure follows ovo-Tim/rsshub-skill. The eval format follows wha7ev9r/rsshub-route-skill.
Thanks to all three for mapping the ground first.
Please read these before relying on the numbers.
- Counts are a snapshot (collected 2026-09-10). The catalogue of flagged behaviours is
stable; the ranking is not. Re-run
tools/before trusting it. - Counts are not proof of correctness. They measure how often reviewers raise a subject, which is a proxy — not a verdict on whether any given instance is wrong.
- Correlation is not causation. For example, PRs containing images in their comments have a lower median time-to-merge (6.0h vs 8.8h) — but images include screenshots posted by reviewers while debugging, so this says nothing about whether contributors should attach screenshots. Only 135 of 2,727 PRs (5.0%) mention screenshots at all.
- The unmerged half is not representative of rejection alone. 225 of the 740 closed PRs simply went stale or were abandoned; others were closed by anti-spam automation. The counts describe what reviewers raise, not a rejection rate.
- Platform coverage is uneven. The shell snippets were exercised end to end on Windows; the macOS/Linux equivalents are provided but untested. Corrections are welcome. None of the substantive guidance — rules, anti-patterns, review response — depends on the platform.
- The auto-review bot contradicts itself occasionally — in this corpus it called
_extraboth invalid and valid. Judge its findings. - Nothing here overrides the target repository.
AGENTS.mdand https://docs.rsshub.app/joinus/ win whenever they conflict with this skill.
MIT