GitHub Trending Analyzer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited GitHub Trending Analyzer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A workflow protocol for tracking GitHub trending repositories with LLM-powered analysis. Fetches trending projects, enriches each with structured Chinese insights (what/analogy/help/who), classifies by themes, compares against historical snapshots, and generates reports in two modes — a compact brief (default) or a detailed report with per-project analysis (opt-in).
Run the five-step pipeline in order.
Construct the URL with time range and optional language filter:
https://github.com/trending[/{language}]?since={daily|weekly|monthly}Fetch with a browser User-Agent to avoid bot detection. Parse the HTML to extract:
name (org/repo)url (full GitHub link)desc (one-line description from the page)lang (primary language)stars (total stargazers count)today_stars (increment for this period)Regex patterns (reference from source):
<h2[^>]*>.*?<a href="/([^"]+)"<p class="[^"]*col-9[^"]*"[^>]*>\s*(.*?)\s*</p><span itemprop="programmingLanguage">([^<]+)</span>/stargazers link text after stripping HTML tags([\d,]+)\s*stars?\s*(?:this|today) (case-insensitive)For each batch of 5 projects (to avoid token limits), send this prompt to your LLM:
Analyze the following {N} GitHub Trending projects. Output strict JSON array.
Each project needs 4 fields:
- what: What it is (≤30 Chinese characters)
- analogy: Life analogy (one sentence)
- help: What it helps you do (2 items, each ≤40 chars, array)
- who: Who needs it (one sentence, ≤30 chars)
Project list:
1. org/repo (Language) — description...
2. ...
Output ONLY the JSON array, no other text. Example:
[{"name":"org/repo","what":"...","analogy":"...","help":["...","..."],"who":"..."}]Parse the response:
`json / ` ),\s*([\]}]) → \1\[.*\] (DOTALL)json.loads() or equivalentFallback: If array parsing fails, extract individual objects via bracket-counting and parse one by one.
Deep mode (optional): Use longer limits (what ≤50 chars, help 3 items) for richer analysis.
Load the bundled theme_rules.json. For each project:
name + " " + desc and lowercaseResult: {theme_name: [projects...]} dictionary.
Load memory.json from the workspace root (see Output Protocol). Schema:
[
{
"date": "2026-06-19",
"since": "weekly",
"lang": "python",
"repos": [{"name":"...", "url":"...", "desc":"...", "lang":"...", "stars":..., "today_stars":..., "analysis":{...}}]
}
]Compare current repos against the latest entry with the same since (and same lang filter):
Two report modes, driven by the bundled templates:
report_template_brief.md — stops at "💡 Trend Analysis". Always emitted.report_template_detailed.md — the brief content plus a per-project "📋 Project Details" section with the 4-field analysis. Emitted only when the user asks for detail (or when deep analysis was run).Trend insight prompt (used in the "Trend Analysis" section of both modes):
基于以下GitHub Trending项目摘要,用3-5句话分析当前最强技术趋势和驱动力:
{list of "name: what" for all projects}Save under reports/YYYY-MM-DD/ with a {since} suffix (daily / weekly / monthly), e.g. trending_briefing_weekly.md. Same-day re-runs of the same since+lang overwrite that report.
Empty tables: when a section (new/hot/dropped) has no rows, render the table header followed by a single *none* row; keep "Theme Breakdown" and "Trend Analysis" only if there are classified projects. On a first run (no memory baseline), omit the "Dropped Off" section rather than showing it empty.
org/repo vs repo) and case-insensitive substring.(date, since, lang). Same-key re-runs merge; other keys are added. Retain the 30 most recent distinct dates.date+since+lang, else latest with same since+lang) → detect repos without analysis → re-run LLM only for those → merge back into both memory.json and repos/YYYY-MM-DD_repos.json → regenerate reports.Implementation hint: detect_gaps(repos) returns [r for r in repos if not r.get('analysis')].
Write all artifacts under the current working directory (the consuming workspace). Never write into the skill package.
<cwd>/
├── repos/YYYY-MM-DD_repos.json
├── reports/YYYY-MM-DD/trending_briefing_{since}[_{lang}].md
├── reports/YYYY-MM-DD/trending_detailed_{since}[_{lang}].md # opt-in
└── memory.json{since} is daily | weekly | monthly. Append _{lang} only when a language filter was used (python, go, …). Date lives in the reports folder — do not repeat it in the report filename.
Create repos/ and reports/YYYY-MM-DD/ if missing. Same-day re-runs of the same since+lang overwrite that report file.
repos/YYYY-MM-DD_repos.jsonDay-level crawl cache. Incremental merge on every run:
{
"date": "2026-08-19",
"updated_at": "2026-08-19T16:45:00+08:00",
"snapshots": [
{
"since": "daily",
"lang": "",
"fetched_at": "2026-08-19T16:45:00+08:00",
"repos": [{"name":"...","url":"...","desc":"...","lang":"...","stars":0,"today_stars":0,"analysis":{}}]
}
]
}Merge rules:
{date, updated_at, snapshots: []}.(since, lang) matches this run (lang is "" when unfiltered).name): overwrite crawl fields (url, desc, lang, stars, today_stars); keep existing analysis unless this run produced a new one.since on the same day must not wipe another window).memory.jsonWorkspace-root history used by Step 4 diffs and gap-fill. Incremental merge:
(date, since, lang). Same key: apply the same per-repo merge as the day cache. New key: append.date is among the 30 most recent distinct dates (so one day with daily+weekly+monthly does not evict history).reports/{date}/trending_briefing_{since}[_{lang}].md): new/hot/dropped/themes + trend insight. Stops at "Trend Analysis" — no per-project blocks.reports/{date}/trending_detailed_{since}[_{lang}].md): brief content followed by one "📋 Project Details" block per project with the 4-field analysis. Only when the user requests detail.Console output during execution:
Before emitting reports, confirm:
name, url, desc, lang, stars, today_stars fields.YYYY-MM-DD_repos.json and memory.json reload without error after the merge.Edit the bundled theme_rules.json:
The 4-field schema (what/analogy/help/who) is optimized for Chinese tech audiences. Adapt for other contexts:
The HTML parsing patterns are GitHub-specific. To adapt for other platforms (Hacker News, Product Hunt):
The reference uses local JSON. For multi-agent or cloud deployments:
load_memory() / save_memory() with a DB or object storage client~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.