{"owner":"DIYgod","repo":"RSSHub","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"skills":{"AGENTS.md":"## Review guidelines\n\n### Route Configuration\n\n1. **Example Format**: The `example` field must start with `/` and be a working RSSHub route path (e.g., `/example/route`), not a full URL or source website URL.\n\n2. **Route Name**: Do NOT repeat the namespace name in the route name. The namespace is already defined in `namespace.ts`.\n\n3. **Radar Source Format**: Use relative paths without `https://` prefix in `radar[]. source`. Example: `source: ['www.example.com/path']` instead of `source: ['https://www.example.com/path']`.\n\n4. **Radar Target**: The `radar[].target` must match the route path. If the source URL does not contain a path parameter, do not include it in the target.\n\n5. **Namespace URL**: In `namespace.ts`, the `url` field should NOT include the `https://` protocol prefix.\n\n6. **Single Category**: Provide only ONE category in the `categories` array, not multiple.\n\n7. **Unnecessary Files**: Do NOT create separate `README.md` or `radar.ts` files. Put descriptions in `Route['description']` and radar rules in `Route['radar']`.\n\n8. **Legacy Router**: Do NOT add routes to `lib/router.js` - this file is deprecated.\n\n9. **Features Accuracy**: Set `requirePuppeteer: true` only if your route actually uses Puppeteer. Do not mismatch feature flags.\n\n10. **Maintainer GitHub ID**: The `maintainers` field must contain valid GitHub usernames. Verify that the username exists before adding it.\n\n### Code Style\n\n11. **Naming Convention**: Use `camelCase` for variable names in JavaScript/TypeScript. Avoid `snake_case` (e.g., use `videoUrl` instead of `video_url`).\n\n12. **Type Imports**: Use `import type { ... }` for type-only imports instead of `import { ... }`.\n\n13. **Import Sorting**: Keep imports sorted. Run autofix if linter reports import order issues.\n\n14. **Unnecessary Template Literals**: Do not use template literals when simple strings suffice (e.g., use `'plain string'` instead of `` `plain string` ``).\n\n15. **Avoid Loading HTML Twice**: Do not call `load()` from cheerio multiple times on the same content. Reuse the initial `$` object.\n\n16. **Async/Await in Close**: When closing Puppeteer pages/browsers, use `await page.close()` and `await browser.close()` instead of non-awaited calls.\n\n17. **No Explicit Null**: No need to explicitly set a property to `null` if it does not exist - just omit it.\n\n18. **Valid Item Properties**: Only use properties defined in [lib/types. ts](https://github.com/DIYgod/RSSHub/blob/master/lib/types.ts). Custom properties like `avatar`, `bio` will be ignored by RSSHub.\n\n19. **String Methods**: Use `startsWith()` instead of `includes()` when checking if a string begins with a specific prefix.\n\n20. **Simplify Code**: Combine multiple conditional assignments into single expressions using `||` or `??` operators when appropriate.\n\n### Data Handling\n\n21. **Use Cache**: Always [cache](https://docs.rsshub.app/joinus/advanced/use-cache) the returned results when fetching article details in a loop using `cache.tryGet()`.\n\n22. **Description Content**: The `description` field should contain ONLY the main article content. Do NOT include `title`, `author`, `pubDate`, or tags in `description` - they have their own dedicated fields.\n\n23. **Category Field**: Extract tags/categories from articles and place them in the `category` field, not in `description`.\n\n24. **pubDate Field**: Always include `pubDate` when the source provides date/time information. Use the `parseDate` utility function.\n\n25. **No Fake Dates**: Do NOT use `new Date()` as a fallback for `pubDate`. If no date is available, leave it undefined. See [No Date documentation](https://docs.rsshub.app/joinus/advanced/pub-date#no-date).\n\n26. **No Title Trimming**: Do not manually trim or truncate titles. RSSHub core handles title processing automatically.\n\n27. **Unique Links**: Ensure each item's `link` is unique as it will be used as `guid`. Avoid fallback URLs that could cause duplicate `guid` values.\n\n28. **Human-Readable Links**: The feed `link` field should point to a human-readable webpage URL, NOT an API endpoint URL.\n\n### API and Data Fetching\n\n29. **Prefer APIs Over Scraping**: When the target website has an API (often found by scrolling pages or checking network requests), use the API endpoint instead of HTML scraping.\n\n30. **JSON Parsing**: When using `ofetch`, `JSON.parse` is automatically applied. Do not manually decode JSON escape sequences like `\\u003C`.\n\n31. **No Page Turning**: RSS feeds should only request the first page of content. Do not implement pagination parameters for users.\n\n32. **Use Common Parameters**: Use RSSHub's built-in common parameters like [`limit`](https://docs.rsshub.app/guide/parameters#limit-entries) instead of implementing custom query parameters for limiting entries.\n\n33. **No Custom Query Parameters**: Avoid using querystring parameters for route configuration. Use path parameters (`:param`) instead.\n\n34. **No Custom Filtering**: Do not implement custom tag/category filtering in routes. Users can apply filtering using [common parameters](https://docs.rsshub.app/guide/parameters).\n\n35. **Avoid Dynamic Hashes**: If an API requires a hash that changes across builds, extract it dynamically from the webpage rather than hardcoding it.\n\n36. **User-Agent**: Use RSSHub's built-in [User-Agent](https://github.com/DIYgod/RSSHub/blob/master/lib/config.ts#L494) (`config.trueUA`) when making requests that need realistic browser headers.\n\n### Media and Enclosures\n\n37. **Valid MIME Types**: The `enclosure_type` must be a valid MIME type as defined in RFC specifications. For example, `video/youtube` is NOT valid - use actual video file URLs with proper types like `video/mp4`.\n\n38. **Direct Media URLs**: `enclosure_url` must point directly to downloadable media files (e.g., `.mp4`, `.mp3`), not to web pages containing media.\n\n39. **Video Poster**: Use the HTML5 `<video>` element's `poster` attribute for video thumbnails instead of adding separate `<img>` elements.\n\n40. **No Referrer Policy in Routes**: Do not add `referrerpolicy` attributes to images/videos - RSSHub middleware handles this automatically.\n\n### Puppeteer Usage\n\n41. **Limit Request Types**: Do not allow every type of request through Puppeteer. Explicitly provide a list of allowed request types (e.g., `document`) to avoid wasting resources on images, scripts, etc.\n\n42. **Use Selectors, Not Delays**: Do not use fixed `setTimeout` delays. Use `page.waitForSelector()` instead to wait for specific elements.\n\n43. **Avoid Multiple Sessions**: Do not call Puppeteer inside `Promise.all()` loops - this creates multiple browser sessions and dramatically increases resource usage.\n\n44. **Do Not Bypass Empty Checks**: Do not return empty arrays with custom messages to bypass RSSHub's [internal checks](https://github.com/DIYgod/RSSHub/blob/master/lib/middleware/parameter. ts#L72) for empty items. This makes it hard for users and maintainers to know if a feed is broken.\n\n### Default Values and Examples\n\n45. **Preserve Default Values**: Do not change documented default values for existing route parameters unless the current default is broken.\n\n46. **Preserve Working Examples**: Do not modify existing route examples unless they no longer work.\n\n47. **Route Parameters**: The `parameters` object keys must match the actual path parameters defined in the route path. Do not add non-existent parameters.\n\n### Error Handling\n\n48. **Error Messages**: Use clear, actionable error messages that help users understand what went wrong.\n\n49. **Resolve All Review Comments**: Before requesting re-review, ensure ALL previous review comments are addressed, not just some of them.\n\n### Code Organization\n\n50. **Move Functions Up**: Move function definitions to the highest possible scope. Avoid defining functions inside loops or callbacks when they can be defined at module level.\n\n51. **No Await in Loops**: Avoid using `await` inside loops when possible. Use `Promise.all()` with proper concurrency control instead.\n\n52. **Check URL Validity**: Before using URLs from config files or namespaces, verify they don't return 404 errors.\n\n53. **Comments Language**: Write code comments in English for consistency and accessibility.\n\n54. **Parentheses in Arrow Functions**: Always use parentheses around arrow function parameters, even for single parameters.\n"},"files":{"AGENTS.md":"## Review guidelines\n\n### Route Configuration\n\n1. **Example Format**: The `example` field must start with `/` and be a working RSSHub route path (e.g., `/example/route`), not a full URL or source website URL.\n\n2. **Route Name**: Do NOT repeat the namespace name in the route name. The namespace is already defined in `namespace.ts`.\n\n3. **Radar Source Format**: Use relative paths without `https://` prefix in `radar[]. source`. Example: `source: ['www.example.com/path']` instead of `source: ['https://www.example.com/path']`.\n\n4. **Radar Target**: The `radar[].target` must match the route path. If the source URL does not contain a path parameter, do not include it in the target.\n\n5. **Namespace URL**: In `namespace.ts`, the `url` field should NOT include the `https://` protocol prefix.\n\n6. **Single Category**: Provide only ONE category in the `categories` array, not multiple.\n\n7. **Unnecessary Files**: Do NOT create separate `README.md` or `radar.ts` files. Put descriptions in `Route['description']` and radar rules in `Route['radar']`.\n\n8. **Legacy Router**: Do NOT add routes to `lib/router.js` - this file is deprecated.\n\n9. **Features Accuracy**: Set `requirePuppeteer: true` only if your route actually uses Puppeteer. Do not mismatch feature flags.\n\n10. **Maintainer GitHub ID**: The `maintainers` field must contain valid GitHub usernames. Verify that the username exists before adding it.\n\n### Code Style\n\n11. **Naming Convention**: Use `camelCase` for variable names in JavaScript/TypeScript. Avoid `snake_case` (e.g., use `videoUrl` instead of `video_url`).\n\n12. **Type Imports**: Use `import type { ... }` for type-only imports instead of `import { ... }`.\n\n13. **Import Sorting**: Keep imports sorted. Run autofix if linter reports import order issues.\n\n14. **Unnecessary Template Literals**: Do not use template literals when simple strings suffice (e.g., use `'plain string'` instead of `` `plain string` ``).\n\n15. **Avoid Loading HTML Twice**: Do not call `load()` from cheerio multiple times on the same content. Reuse the initial `$` object.\n\n16. **Async/Await in Close**: When closing Puppeteer pages/browsers, use `await page.close()` and `await browser.close()` instead of non-awaited calls.\n\n17. **No Explicit Null**: No need to explicitly set a property to `null` if it does not exist - just omit it.\n\n18. **Valid Item Properties**: Only use properties defined in [lib/types. ts](https://github.com/DIYgod/RSSHub/blob/master/lib/types.ts). Custom properties like `avatar`, `bio` will be ignored by RSSHub.\n\n19. **String Methods**: Use `startsWith()` instead of `includes()` when checking if a string begins with a specific prefix.\n\n20. **Simplify Code**: Combine multiple conditional assignments into single expressions using `||` or `??` operators when appropriate.\n\n### Data Handling\n\n21. **Use Cache**: Always [cache](https://docs.rsshub.app/joinus/advanced/use-cache) the returned results when fetching article details in a loop using `cache.tryGet()`.\n\n22. **Description Content**: The `description` field should contain ONLY the main article content. Do NOT include `title`, `author`, `pubDate`, or tags in `description` - they have their own dedicated fields.\n\n23. **Category Field**: Extract tags/categories from articles and place them in the `category` field, not in `description`.\n\n24. **pubDate Field**: Always include `pubDate` when the source provides date/time information. Use the `parseDate` utility function.\n\n25. **No Fake Dates**: Do NOT use `new Date()` as a fallback for `pubDate`. If no date is available, leave it undefined. See [No Date documentation](https://docs.rsshub.app/joinus/advanced/pub-date#no-date).\n\n26. **No Title Trimming**: Do not manually trim or truncate titles. RSSHub core handles title processing automatically.\n\n27. **Unique Links**: Ensure each item's `link` is unique as it will be used as `guid`. Avoid fallback URLs that could cause duplicate `guid` values.\n\n28. **Human-Readable Links**: The feed `link` field should point to a human-readable webpage URL, NOT an API endpoint URL.\n\n### API and Data Fetching\n\n29. **Prefer APIs Over Scraping**: When the target website has an API (often found by scrolling pages or checking network requests), use the API endpoint instead of HTML scraping.\n\n30. **JSON Parsing**: When using `ofetch`, `JSON.parse` is automatically applied. Do not manually decode JSON escape sequences like `\\u003C`.\n\n31. **No Page Turning**: RSS feeds should only request the first page of content. Do not implement pagination parameters for users.\n\n32. **Use Common Parameters**: Use RSSHub's built-in common parameters like [`limit`](https://docs.rsshub.app/guide/parameters#limit-entries) instead of implementing custom query parameters for limiting entries.\n\n33. **No Custom Query Parameters**: Avoid using querystring parameters for route configuration. Use path parameters (`:param`) instead.\n\n34. **No Custom Filtering**: Do not implement custom tag/category filtering in routes. Users can apply filtering using [common parameters](https://docs.rsshub.app/guide/parameters).\n\n35. **Avoid Dynamic Hashes**: If an API requires a hash that changes across builds, extract it dynamically from the webpage rather than hardcoding it.\n\n36. **User-Agent**: Use RSSHub's built-in [User-Agent](https://github.com/DIYgod/RSSHub/blob/master/lib/config.ts#L494) (`config.trueUA`) when making requests that need realistic browser headers.\n\n### Media and Enclosures\n\n37. **Valid MIME Types**: The `enclosure_type` must be a valid MIME type as defined in RFC specifications. For example, `video/youtube` is NOT valid - use actual video file URLs with proper types like `video/mp4`.\n\n38. **Direct Media URLs**: `enclosure_url` must point directly to downloadable media files (e.g., `.mp4`, `.mp3`), not to web pages containing media.\n\n39. **Video Poster**: Use the HTML5 `<video>` element's `poster` attribute for video thumbnails instead of adding separate `<img>` elements.\n\n40. **No Referrer Policy in Routes**: Do not add `referrerpolicy` attributes to images/videos - RSSHub middleware handles this automatically.\n\n### Puppeteer Usage\n\n41. **Limit Request Types**: Do not allow every type of request through Puppeteer. Explicitly provide a list of allowed request types (e.g., `document`) to avoid wasting resources on images, scripts, etc.\n\n42. **Use Selectors, Not Delays**: Do not use fixed `setTimeout` delays. Use `page.waitForSelector()` instead to wait for specific elements.\n\n43. **Avoid Multiple Sessions**: Do not call Puppeteer inside `Promise.all()` loops - this creates multiple browser sessions and dramatically increases resource usage.\n\n44. **Do Not Bypass Empty Checks**: Do not return empty arrays with custom messages to bypass RSSHub's [internal checks](https://github.com/DIYgod/RSSHub/blob/master/lib/middleware/parameter. ts#L72) for empty items. This makes it hard for users and maintainers to know if a feed is broken.\n\n### Default Values and Examples\n\n45. **Preserve Default Values**: Do not change documented default values for existing route parameters unless the current default is broken.\n\n46. **Preserve Working Examples**: Do not modify existing route examples unless they no longer work.\n\n47. **Route Parameters**: The `parameters` object keys must match the actual path parameters defined in the route path. Do not add non-existent parameters.\n\n### Error Handling\n\n48. **Error Messages**: Use clear, actionable error messages that help users understand what went wrong.\n\n49. **Resolve All Review Comments**: Before requesting re-review, ensure ALL previous review comments are addressed, not just some of them.\n\n### Code Organization\n\n50. **Move Functions Up**: Move function definitions to the highest possible scope. Avoid defining functions inside loops or callbacks when they can be defined at module level.\n\n51. **No Await in Loops**: Avoid using `await` inside loops when possible. Use `Promise.all()` with proper concurrency control instead.\n\n52. **Check URL Validity**: Before using URLs from config files or namespaces, verify they don't return 404 errors.\n\n53. **Comments Language**: Write code comments in English for consistency and accessibility.\n\n54. **Parentheses in Arrow Functions**: Always use parentheses around arrow function parameters, even for single parameters.\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"## Review guidelines\n\n### Route Configuration\n\n1. **Example Format**: The `example` field must start with `/` and be a working RSSHub route path (e.g., `/example/route`), not a full URL or source website URL.\n\n2. **Route Name**: Do NOT repeat the namespace name in the route name. The namespace is already defined in `namespace.ts`.\n\n3. **Radar Source Format**: Use relative paths without `https://` prefix in `radar[]. source`. Example: `source: ['www.example.com/path']` instead of `source: ['https://www.example.com/path']`.\n\n4. **Radar Target**: The `radar[].target` must match the route path. If the source URL does not contain a path parameter, do not include it in the target.\n\n5. **Namespace URL**: In `namespace.ts`, the `url` field should NOT include the `https://` protocol prefix.\n\n6. **Single Category**: Provide only ONE category in the `categories` array, not multiple.\n\n7. **Unnecessary Files**: Do NOT create separate `README.md` or `radar.ts` files. Put descriptions in `Route['description']` and radar rules in `Route['radar']`.\n\n8. **Legacy Router**: Do NOT add routes to `lib/router.js` - this file is deprecated.\n\n9. **Features Accuracy**: Set `requirePuppeteer: true` only if your route actually uses Puppeteer. Do not mismatch feature flags.\n\n10. **Maintainer GitHub ID**: The `maintainers` field must contain valid GitHub usernames. Verify that the username exists before adding it.\n\n### Code Style\n\n11. **Naming Convention**: Use `camelCase` for variable names in JavaScript/TypeScript. Avoid `snake_case` (e.g., use `videoUrl` instead of `video_url`).\n\n12. **Type Imports**: Use `import type { ... }` for type-only imports instead of `import { ... }`.\n\n13. **Import Sorting**: Keep imports sorted. Run autofix if linter reports import order issues.\n\n14. **Unnecessary Template Literals**: Do not use template literals when simple strings suffice (e.g., use `'plain string'` instead of `` `plain string` ``).\n\n15. **Avoid Loading HTML Twice**: Do not call `load()` from cheerio multiple times on the same content. Reuse the initial `$` object.\n\n16. **Async/Await in Close**: When closing Puppeteer pages/browsers, use `await page.close()` and `await browser.close()` instead of non-awaited calls.\n\n17. **No Explicit Null**: No need to explicitly set a property to `null` if it does not exist - just omit it.\n\n18. **Valid Item Properties**: Only use properties defined in [lib/types. ts](https://github.com/DIYgod/RSSHub/blob/master/lib/types.ts). Custom properties like `avatar`, `bio` will be ignored by RSSHub.\n\n19. **String Methods**: Use `startsWith()` instead of `includes()` when checking if a string begins with a specific prefix.\n\n20. **Simplify Code**: Combine multiple conditional assignments into single expressions using `||` or `??` operators when appropriate.\n\n### Data Handling\n\n21. **Use Cache**: Always [cache](https://docs.rsshub.app/joinus/advanced/use-cache) the returned results when fetching article details in a loop using `cache.tryGet()`.\n\n22. **Description Content**: The `description` field should contain ONLY the main article content. Do NOT include `title`, `author`, `pubDate`, or tags in `description` - they have their own dedicated fields.\n\n23. **Category Field**: Extract tags/categories from articles and place them in the `category` field, not in `description`.\n\n24. **pubDate Field**: Always include `pubDate` when the source provides date/time information. Use the `parseDate` utility function.\n\n25. **No Fake Dates**: Do NOT use `new Date()` as a fallback for `pubDate`. If no date is available, leave it undefined. See [No Date documentation](https://docs.rsshub.app/joinus/advanced/pub-date#no-date).\n\n26. **No Title Trimming**: Do not manually trim or truncate titles. RSSHub core handles title processing automatically.\n\n27. **Unique Links**: Ensure each item's `link` is unique as it will be used as `guid`. Avoid fallback URLs that could cause duplicate `guid` values.\n\n28. **Human-Readable Links**: The feed `link` field should point to a human-readable webpage URL, NOT an API endpoint URL.\n\n### API and Data Fetching\n\n29. **Prefer APIs Over Scraping**: When the target website has an API (often found by scrolling pages or checking network requests), use the API endpoint instead of HTML scraping.\n\n30. **JSON Parsing**: When using `ofetch`, `JSON.parse` is automatically applied. Do not manually decode JSON escape sequences like `\\u003C`.\n\n31. **No Page Turning**: RSS feeds should only request the first page of content. Do not implement pagination parameters for users.\n\n32. **Use Common Parameters**: Use RSSHub's built-in common parameters like [`limit`](https://docs.rsshub.app/guide/parameters#limit-entries) instead of implementing custom query parameters for limiting entries.\n\n33. **No Custom Query Parameters**: Avoid using querystring parameters for route configuration. Use path parameters (`:param`) instead.\n\n34. **No Custom Filtering**: Do not implement custom tag/category filtering in routes. Users can apply filtering using [common parameters](https://docs.rsshub.app/guide/parameters).\n\n35. **Avoid Dynamic Hashes**: If an API requires a hash that changes across builds, extract it dynamically from the webpage rather than hardcoding it.\n\n36. **User-Agent**: Use RSSHub's built-in [User-Agent](https://github.com/DIYgod/RSSHub/blob/master/lib/config.ts#L494) (`config.trueUA`) when making requests that need realistic browser headers.\n\n### Media and Enclosures\n\n37. **Valid MIME Types**: The `enclosure_type` must be a valid MIME type as defined in RFC specifications. For example, `video/youtube` is NOT valid - use actual video file URLs with proper types like `video/mp4`.\n\n38. **Direct Media URLs**: `enclosure_url` must point directly to downloadable media files (e.g., `.mp4`, `.mp3`), not to web pages containing media.\n\n39. **Video Poster**: Use the HTML5 `<video>` element's `poster` attribute for video thumbnails instead of adding separate `<img>` elements.\n\n40. **No Referrer Policy in Routes**: Do not add `referrerpolicy` attributes to images/videos - RSSHub middleware handles this automatically.\n\n### Puppeteer Usage\n\n41. **Limit Request Types**: Do not allow every type of request through Puppeteer. Explicitly provide a list of allowed request types (e.g., `document`) to avoid wasting resources on images, scripts, etc.\n\n42. **Use Selectors, Not Delays**: Do not use fixed `setTimeout` delays. Use `page.waitForSelector()` instead to wait for specific elements.\n\n43. **Avoid Multiple Sessions**: Do not call Puppeteer inside `Promise.all()` loops - this creates multiple browser sessions and dramatically increases resource usage.\n\n44. **Do Not Bypass Empty Checks**: Do not return empty arrays with custom messages to bypass RSSHub's [internal checks](https://github.com/DIYgod/RSSHub/blob/master/lib/middleware/parameter. ts#L72) for empty items. This makes it hard for users and maintainers to know if a feed is broken.\n\n### Default Values and Examples\n\n45. **Preserve Default Values**: Do not change documented default values for existing route parameters unless the current default is broken.\n\n46. **Preserve Working Examples**: Do not modify existing route examples unless they no longer work.\n\n47. **Route Parameters**: The `parameters` object keys must match the actual path parameters defined in the route path. Do not add non-existent parameters.\n\n### Error Handling\n\n48. **Error Messages**: Use clear, actionable error messages that help users understand what went wrong.\n\n49. **Resolve All Review Comments**: Before requesting re-review, ensure ALL previous review comments are addressed, not just some of them.\n\n### Code Organization\n\n50. **Move Functions Up**: Move function definitions to the highest possible scope. Avoid defining functions inside loops or callbacks when they can be defined at module level.\n\n51. **No Await in Loops**: Avoid using `await` inside loops when possible. Use `Promise.all()` with proper concurrency control instead.\n\n52. **Check URL Validity**: Before using URLs from config files or namespaces, verify they don't return 404 errors.\n\n53. **Comments Language**: Write code comments in English for consistency and accessibility.\n\n54. **Parentheses in Arrow Functions**: Always use parentheses around arrow function parameters, even for single parameters.\n","category":"root","tokens":2079}]}