GitHub Radar
An open-source intelligence engine for AI PMs. Four modes, one Layer analysis framework.
Language Selection
This skill ships with both English and Chinese versions. The agent should automatically match the user's language:
- - If the user speaks English -> Use
skill.md, agents/analyzer.md, references/layer_model.md, templates/*.html, and generate English reports - If the user speaks Chinese -> Use
skill_cn.md, agents/analyzer_cn.md, references/layer_model_cn.md, templates/*_cn.html, and generate Chinese reports - Scripts (
scripts/) and config (config/) are language-neutral and shared by both versions
When to Use
- - "What's worth looking at today?" /
--pulse -> Mode 1 - "Find me GitHub projects related to [topic]" -> Mode 2
- "Monitor anomalous signals" /
--watch -> Mode 3 - "Analyze the ecosystem around [repo]" -> Mode 4
- Any need involving GitHub project discovery, trend analysis, or paradigm assessment
File Structure
CODEBLOCK0
Dependencies
| Dependency | Requirement | Check Command |
|---|
| gh CLI | >= 2.40.0, authenticated | INLINECODE12 |
| Python |
>= 3.9 |
python --version |
| Extra Python packages | None, stdlib only | — |
| API quota | 5,000 requests/hour when authenticated |
python scripts/check_rate_limit.py |
Common Prerequisites
Must be completed before running any mode:
CODEBLOCK1
Determine the execution strategy based on the returned mode field:
- -
full -> Normal execution, including star history fetching - INLINECODE17 -> Skip fetchstarhistory.py, use basic data only
- INLINECODE18 -> Run search scripts only, skip detail API calls
Mode 1: Proactive Exploration (Radar Pulse)
Trigger: --pulse or "What's worth looking at today?"
Execution Steps
CODEBLOCK2
Filtering Rules
- 1. Label each candidate's Layer
- Remove L1 (model-level, too low-level) and L5 (wrapper/demo, noise)
- PM value weighting: L2 x 1.5, L3 x 1.3, L4 x 1.0
- Take Top 3-5, deep-dive into 1-2
Output Format
CODEBLOCK3
Report saved to: output/radar-pulse_{date}.md
Mode 2: Direction Search
Trigger: User provides a technical direction or keywords
Execution Steps
Step 1: Check Quota
CODEBLOCK4
Step 2: Keyword Expansion + Layer 1 Relevance Review
- 1. Understand the topic: State the core concept of the user's search in one sentence
- Expand keywords: Generate 8-15 search keywords around the topic, covering:
- Synonymous expressions (swarm -> fleet, colony)
- Scenario-specific terms (swarm observability, coding agent swarm)
- Adjacent concepts (coordination, monitoring — things adjacent to swarm)
- 3. Layer 1 self-review: Review each keyword; the criterion is "would most results returned be about the same category of thing?" — exact match to every word is not required:
-
Keep: Results are different angles on the same topic
-
Remove: Most results fall into a broader category where the topic is only a small subset
- Example — topic "agent swarm":
swarm orchestration keep (same topic);
multi-agent framework remove (swarm is a subset of multi-agent; most results won't be about swarms)
- Example — topic "Agent-human collaboration":
human-in-the-loop agent keep (same topic);
AI assistant remove (assistant != human-agent collaboration)
- 4. Present to user for confirmation: List kept and removed keywords with rationale; proceed with search only after user confirms
Step 3: Search
CODEBLOCK5
Step 3.5: Dynamic Strategy When Recall Is Low
If deduplicated results < 50, do not silently expand. Instead, present the current situation to the user with three options:
Searched {n} keywords, only {m} unique results after deduplication. Possible reasons and options:
A. This direction hasn't formed a distinct category yet — The relevant capabilities may be embedded as features within larger frameworks rather than existing as standalone projects. Recommend abandoning the search; this finding is itself valuable.
B. Keyword coverage is insufficient — Current keywords may be missing expressions commonly used by the community. I suggest adding the following keywords: {list}. Will continue after confirmation.
C. Proceed with existing results — Although {m} results is a small set, if quality is sufficient, we can go straight to analysis. Suitable for a quick overview of the landscape.
Heuristics for recommending an option:
- - Most keywords return 0 results -> lean toward A (category doesn't exist)
- Only the main keyword has results, expanded terms return nothing -> lean toward B (missing community terminology)
- Few results but highly relevant -> lean toward C (small category with clear signal)
Step 4: Layer 2 Result Relevance Classification
After raw search results are returned and before analysis, classify each repo's relevance:
| Classification | Criteria | Handling |
|---|
| high | This project is directly working on the topic | Include in competitive landscape analysis |
| medium |
Related to the topic, but not its primary focus | Include based on quality |
|
low | Keyword match was coincidental; project is actually about something else | Filter out, list under "Filtered Out" |
Judgment basis: repo name + description. Ask yourself, "Would this project's author consider themselves working on {user's topic}?"
Step 5: Star History + PM Analysis
CODEBLOCK6
Output Structure
CODEBLOCK7
Reports generated in both HTML and MD: output/search_{keyword}_{date}.html/.md
Mode 3: Anomalous Signal Monitoring (Signal Watch)
Trigger: --watch or "Monitor anomalous signals"
Known blind spot: Currently only detects growth anomalies in new projects (created within 90 days). Detecting sudden surges in established projects requires persistent storage for differential comparison — reserved for future iteration.
Execution Steps
Step 1: Check Quota
CODEBLOCK8
Step 2: Candidate Discovery
CODEBLOCK9
The script returns a candidate list (sorted by rough velocity descending), each containing:
- -
stars, forks, created, INLINECODE30 - INLINECODE31 = stars / age_days (rough velocity)
- INLINECODE32 = forks / stars (adoption depth signal)
Step 3: Initial Screening + Growth Curve Fetching
- 1. Exclude obviously irrelevant items: Check descriptions, exclude games, tutorials, awesome-lists, and other non-technical projects
- Fetch star history for remaining candidates (full mode only):
CODEBLOCK10
Returned growth metrics:
| Metric | Meaning |
|---|
| INLINECODE33 / INLINECODE34 | Average daily growth |
| INLINECODE35 |
7d avg / 30d avg; >1 means accelerating |
|
trend_direction | Last 3 days avg / prior 4 days avg; indicates current trend |
|
consecutive_growth_days | Consecutive days of growth |
|
peak_recency | Days since peak; 0 = today |
|
burst_ratio | Peak day / 7d avg; high = spike-type growth |
|
recent_7_days[] | Daily breakdown; used to assess growth shape |
Step 4: Growth Pattern Classification
Examine the shape of recent_7_days[] to determine the growth type:
| Pattern | Characteristics | PM Implication | Signal Quality |
|---|
| sustained | INLINECODE42 + INLINECODE43 | Organic growth, real demand | High |
| accelerating |
trend_direction > 2 +
consecutive > 5 | Currently surging, act fast | Highest |
|
spike+decay |
burst_ratio > 5 +
trend_direction < 0.5 | One-time launch burst, likely noise | Low |
|
step | Single-day spike + stable before and after | Event-driven (influencer repost) | Medium, watch follow-through |
Step 5: Three-Tier Assessment + PM Analysis
Read agents/analyzer.md and assess each candidate holistically:
- - Worth deep-diving: sustained/accelerating pattern + L2/L3 layer
- Watch: Has growth signal but pattern is unclear, or step-type awaiting follow-through
- Ignore: spike+decay + L5 wrapper / tutorial / fork_ratio < 0.02
Output Structure
CODEBLOCK11
Report saved to: output/signal-watch_{date}.html
Mode 4: Deep Link Analysis
Trigger: User provides a repo URL or owner/repo name
Execution Steps
CODEBLOCK12
Output Structure
CODEBLOCK13
Output Style
- - CSS uses the
--bg/--surface/--border/--accent/--muted variable system, consistent across modes - PM insights use
.pm-box card component (white background + border), not inline INLINECODE52 - Layer positioning uses
.layer-box component with badge + reasoning list + "why not X" - Paradigm assessment uses
.paradigm component (blue background + border) - Competitor candidates go in
<details> collapsed sections - All technical metrics include plain-language explanations (plain language principle)
Report saved to: output/deep-link_{owner}_{repo}_{date}.html
Seed List Customization
Edit config/seed_list.json to add or remove developers you follow:
CODEBLOCK14
The default list currently includes 76 important AI builders/orgs, covering 17 categories including labs, agent frameworks, coding agents, inference, platforms, and more.
GitHub Radar
面向AI产品经理的开源情报引擎。四种模式,一个分层分析框架。
语言选择
本技能内置中英文双版本。代理应自动匹配用户语言:
- - 如果用户使用英文 -> 使用 skill.md、agents/analyzer.md、references/layermodel.md、templates/.html,生成英文报告
- 如果用户使用中文 -> 使用 skillcn.md、agents/analyzercn.md、references/layermodelcn.md、templates/cn.html,生成中文报告
- 脚本(scripts/)和配置(config/)为语言无关,两个版本共享
使用时机
- - 今天有什么值得看的? / --pulse -> 模式1
- 帮我找找与[主题]相关的GitHub项目 -> 模式2
- 监控异常信号 / --watch -> 模式3
- 分析[仓库]的生态系统 -> 模式4
- 任何涉及GitHub项目发现、趋势分析或范式评估的需求
文件结构
github-trend-observer/
├── skill.md # 代理执行指令(英文)
├── skill_cn.md # 代理执行指令(中文)
├── ONBOARD.md # 代理冷启动指令(英文)
├── ONBOARD_CN.md # 代理冷启动指令(中文)
├── requirements.txt # 依赖声明
├── agents/
│ ├── analyzer.md # PM洞察分析代理(英文)
│ └── analyzer_cn.md # PM洞察分析代理(中文)
├── scripts/
│ ├── gh_utils.py # 统一gh CLI工具函数
│ ├── checkratelimit.py # API速率限制检查器
│ ├── fetchstarhistory.py # Star增长数据获取器
│ ├── radar_pulse.py # 模式1趋势获取器
│ ├── search_repos.py # 模式2搜索
│ ├── watch_signals.py # 模式3异常检测
│ ├── deep_link.py # 模式4关系分析
│ ├── generate_report.py # HTML/MD报告生成
│ └── test_oss.py # 自动化测试(6层,41个测试)
├── config/
│ ├── seed_list.json # 关键开发者列表
│ └── domain_keywords.json # 领域关键词映射
├── templates/
│ ├── radar-pulse.html # 模式1报告模板(中英文变体)
│ ├── direction-search.html # 模式2报告模板
│ ├── signal-watch.html # 模式3报告模板
│ └── deep-link.html # 模式4报告模板
├── evals/
│ ├── evals.json # 测试用例(英文)
│ └── evals_cn.json # 测试用例(中文)
└── references/
├── layer_model.md # 分层分类标准(英文)
└── layermodelcn.md # 分层分类标准(中文)
依赖项
| 依赖项 | 要求 | 检查命令 |
|---|
| gh CLI | >= 2.40.0,已认证 | gh auth status |
| Python |
>= 3.9 | python --version |
| 额外Python包 | 无,仅标准库 | — |
| API配额 | 认证后每小时5000次请求 | python scripts/check
ratelimit.py |
通用前置条件
运行任何模式前必须完成:
bash
1. 检查API配额
python scripts/check
ratelimit.py
根据返回的 mode 字段确定执行策略:
- - full -> 正常执行,包括star历史获取
- degraded -> 跳过 fetchstarhistory.py,仅使用基础数据
- minimal -> 仅运行搜索脚本,跳过详情API调用
模式1:主动探索(雷达脉冲)
触发条件:--pulse 或 今天有什么值得看的?
执行步骤
bash
步骤1:检查配额
python scripts/check
ratelimit.py
步骤2:获取候选项目
python scripts/radar_pulse.py --days 7
步骤3:读取 agents/analyzer.md + references/layer_model.md
分层分类 -> 过滤掉L1/L5 -> 选择1-2个PM价值最高的
步骤4:获取选定项目的star历史(仅full模式)
python scripts/fetch
starhistory.py owner/repo
过滤规则
- 1. 为每个候选项目标注层级
- 移除L1(模型层,过于底层)和L5(封装/演示,噪音)
- PM价值权重:L2 x 1.5,L3 x 1.3,L4 x 1.0
- 取Top 3-5,深入分析1-2个
输出格式
markdown
雷达脉冲 — {日期}
L2/L3/L4选择 | 从{n}个候选中过滤{m}个 | API: {剩余}/{限额}
今日精选
{仓库} [L?]
{描述}
| Stars | 30天增长 | 语言 | 创建时间 |
|-------|----------|------|---------|
选择理由:{理由}
范式信号:{技术栈正在发生的变化}
建议:通过模式4深入分析 / 持续关注
也值得一看
| 仓库 | 层级 | Stars | 一句话简介 |
|------|------|-------|-----------|
已过滤
- - L1: {n}个项目({示例})
- L5: {n}个项目({示例})
报告保存至:output/radar-pulse_{日期}.md
模式2:方向搜索
触发条件:用户提供技术方向或关键词
执行步骤
步骤1:检查配额
bash
python scripts/check
ratelimit.py
步骤2:关键词扩展 + 第一层相关性审查
- 1. 理解主题:用一句话说明用户搜索的核心概念
- 扩展关键词:围绕主题生成8-15个搜索关键词,覆盖:
- 同义表达(swarm -> fleet, colony)
- 场景特定术语(swarm observability, coding agent swarm)
- 相邻概念(coordination, monitoring — 与swarm相邻的概念)
- 3. 第一层自审:审查每个关键词,标准是大多数返回结果是否属于同一类事物? — 不需要每个词都精确匹配:
-
保留:结果是对同一主题的不同角度
-
移除:大多数结果属于更广泛的类别,主题只是其中的一小部分
- 示例 — 主题agent swarm:swarm orchestration 保留(同一主题);multi-agent framework 移除(swarm是multi-agent的子集;大多数结果不会是关于swarm的)
- 示例 — 主题Agent-human collaboration:human-in-the-loop agent 保留(同一主题);AI assistant 移除(assistant != 人机协作)
- 4. 向用户展示确认:列出保留和移除的关键词及理由;用户确认后才进行搜索
步骤3:搜索
bash
python scripts/search_repos.py {主关键词} \
--also {关键词2} {关键词3} ... \
--expand {备选1} {备选2} ... \
--min-stars 20 --min-recall 50
步骤3.5:召回率低时的动态策略
如果去重后结果 < 50,不要静默扩展。而是向用户展示当前情况并提供三个选项:
搜索了{n}个关键词,去重后仅有{m}个唯一结果。可能的原因和选项:
A. 该方向尚未形成独立类别 — 相关能力可能作为功能嵌入在更大的框架中,而非独立项目存在。建议放弃搜索;这一发现本身就有价值。
B. 关键词覆盖不足 — 当前关键词可能遗漏了社区常用的表达方式。建议添加以下关键词:{列表}。确认后继续。
C. 使用现有结果继续 — 虽然{m}个结果数量较少,但如果质量足够,可以直接进行分析。适合快速了解领域概况。
推荐选项的启发式规则:
- - 大多数关键词返回0结果 -> 倾向于A(类别不存在)
- 只有主关键词有结果,扩展词无结果 -> 倾向于B(缺少社区术语)
- 结果少但高度相关 -> 倾向于C(小类别但有明确信号)
步骤4:第二层结果相关性分类
原始搜索结果返回后,在分析之前,对每个仓库的相关性进行分类:
| 分类 | 标准 | 处理方式 |
|------|