---
name: "skill-radar"
description: "Personal Skill Radar：Agent 技能雷达与自动追踪器"
---

# Personal Skill Radar：Agent 技能雷达与自动追踪器

## 适用场景
希望每天自动追踪全球开源社区（GitHub、Tavily 网页发现、Claude Code / Codex / OpenClaw 生态）中最新发布的优质 Agent Skills（包含 `SKILL.md` 的高质量仓库），进行内容哈希去重、大模型多维价值评分（个人匹配度、实用性、新颖度）、基础静态安全筛查，并自动向 Slack、Telegram 或飞书每日推送不超过 5 个最值得安装的精选技能。

## 功能说明
> 告别在 GitHub 和各大 AI 社区大海捞针、充斥营销软文与低劣提示词合集的痛点。本技能提供一套轻量、确定性、高鲁棒的 Agent 技能发现雷达，只抓取经过验证的真实 `SKILL.md` 并完成全流程自动化评估推送。

## 这个案例能帮你做什么
- 通过 GitHub Search API 定时抓取 `filename:SKILL.md`，并结合 Tavily Search API 交叉验证补充候选。
- 自动解析 YAML frontmatter（`name`、`description`），计算 `SKILL.md` 内容 SHA-256 哈希，区分全新首发（new）与实质性更新（updated），避免重复推送。
- 基础静态安全筛查：拦截包含 `curl | bash`、环境变量/Token 嗅探、未经授权文件上传、反向 Shell 等高危代码的恶意 Skill。
- 大模型结构化评估：依据个人偏好清单（`preferences.yaml`）进行 0-10 分评级，输出推荐动作（install / watch / skip）及为什么值得看。
- 通过 Webhook 发送每日精选 Digest，支持 `--dry-run` 离线演练。

## 你需要的 Skills（按类型）

| 类型 | Skill / 工具 | 用途 | 来源 |
|---|---|---|---|
| 数据发现 | GitHub REST API / Tavily API | 搜索包含 `SKILL.md` 的开源仓库与网页 | External API |
| 内容解析 | `PyYAML` / `hashlib` | 解析 frontmatter 与计算内容哈希 | Python Standard Library |
| 大模型接口 | OpenAI-Compatible API | 结构化输出评分 JSON | LLM API |
| 消息推送 | Slack / 飞书 / Telegram Webhook | 每日推送 Top 5 精选卡片 | Built-in |

## 快速体验版（先跑一轮）

```text
你是我的 Agent Skills 雷达发现专家。
请帮我做一次离线模拟技能筛查（Dry-run）：
1. 假设发现了一个名为 "browser-cookie-sync" 的 Skill，其 SKILL.md 包含自动化读取 Chrome 数据库并上传到外部 HTTP 接口的代码。
2. 请进行静态安全检查，指出其命中的高危模式（敏感文件/私钥外泄风险）。
3. 假设另一个名为 "latex-table-formatter" 的 Skill，提供纯本地无外部网络依赖的 LaTeX 转换能力。
4. 基于个人偏好（偏好开发者生产力、本地离线工具，厌恶营销包装），输出标准化评价 JSON 及推荐结论。
```

## 稳定自动版（可长期运行）

### 1) 核心雷达架构实现 (`skill_radar.py`)

```python
import os
import re
import json
import hashlib
import requests
import yaml
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class SkillCandidate:
    repo: str
    path: str
    html_url: str
    content: str
    skill_hash: str
    name: str = ""
    description: str = ""
    risk_level: str = "low"
    risk_reason: str = ""

def parse_skill_md(content: str, repo: str, path: str, url: str) -> Optional[SkillCandidate]:
    """解析 SKILL.md 中的 YAML frontmatter 与计算哈希"""
    content_hash = hashlib.sha256(content.encode('utf-8')).hexdigest()
    
    # 提取 frontmatter
    fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", content, re.DOTALL)
    name = "unknown"
    desc = ""
    if fm_match:
        try:
            meta = yaml.safe_load(fm_match.group(1))
            name = meta.get("name", name)
            desc = meta.get("description", "")
        except Exception:
            pass
            
    cand = SkillCandidate(
        repo=repo,
        path=path,
        html_url=url,
        content=content,
        skill_hash=content_hash,
        name=name,
        description=desc
    )
    
    # 静态安全检查
    audit_safety(cand)
    return cand

def audit_safety(cand: SkillCandidate):
    """基础静态安全筛查"""
    dangerous_patterns = [
        (r"curl\s+.*?\|\s*(ba)?sh", "包含未经验证的远程管道执行 (curl | bash)"),
        (r"rm\s+-rf\s+[/~]", "包含破坏性根目录删除指令 (rm -rf)"),
        (r"(PRIVATE_KEY|AWS_SECRET_ACCESS_KEY|token).*?=\s*os\.environ", "疑似越权读取系统核心敏感凭据"),
        (r"base64\.b64decode\(.*?exec\(", "包含混淆执行代码")
    ]
    for pattern, reason in dangerous_patterns:
        if re.search(pattern, cand.content, re.IGNORECASE):
            cand.risk_level = "high"
            cand.risk_reason = reason
            return

def evaluate_with_llm(cand: SkillCandidate, api_key: str, api_base: str, model: str):
    """调用大模型获取结构化评分"""
    if cand.risk_level == "high":
        return {
            "score": 2.0,
            "summary": cand.description,
            "why_useful": "存在高危安全漏洞，建议跳过",
            "recommendation": "skip",
            "risk": "high"
        }
        
    prompt = f"""
你是一个严格的 Agent Skill 评估器。
请对以下 Skill 进行打分（0-10 分）：
名称: {cand.name}
说明: {cand.description}
代码/指令片段:
{cand.content[:1500]}

必须以合法 JSON 格式输出以下字段，不要附带任何 markdown 代码块标识：
{{"score": 8.5, "summary": "一句话介绍", "why_useful": "为什么有价值", "recommendation": "install/watch/skip", "risk": "low"}}
"""
    headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
    payload = {
        "model": model,
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.2
    }
    resp = requests.post(f"{api_base}/chat/completions", headers=headers, json=payload, timeout=20)
    if resp.status_code == 200:
        raw_text = resp.json()["choices"][0]["message"]["content"]
        # 清除可能的外围包裹
        cleaned = re.sub(r"^```json\s*", "", raw_text.strip(), flags=re.MULTILINE)
        cleaned = re.sub(r"```$", "", cleaned.strip(), flags=re.MULTILINE)
        return json.loads(cleaned)
    return None

if __name__ == '__main__':
    demo_skill = """---
name: "git-worktree-helper"
description: "自动化管理 Git 隔离工作区以支持子代理并行开发"
---
# Git Worktree Helper
Use `git worktree add` to create isolated environments for sub-agents.
"""
    parsed = parse_skill_md(demo_skill, "example/repo", "skills/git-worktree/SKILL.md", "https://github.com/example/repo")
    print("[+] 解析成功:", parsed.name, "| 安全等级:", parsed.risk_level)
```

### 2) 每日运行与 Cron 调度

```cron
# 每天早晨 9:00 自动执行技能雷达，并将 Top 5 精选推送至团队频道
0 9 * * * cd /path/to/skill-radar && python -m skill_radar --once >> logs/radar.log 2>&1
```

## 风险与边界
- 静态规则筛查只能拦截已知特征模式，不代表经过完整反恶意软件认证（沙箱动态行为分析）。
- GitHub Search API 存在每分钟请求频率限制，必须配置 Exponential Backoff（指数退避）并在每次请求间增加随机延迟。

## 使用建议
- 建立 `state/seen.json` 历史库，记录每个 Skill 的 `key` 与 `skill_hash`，内容未变化时直接跳过 LLM 评分以节约 Token。
- 评分低于 8.0 或标记为 `high risk` 的项目，禁止直接触发客户端安装。

## 成功标准
- 每日准时输出结构化 Digest，精选推荐条目不超过 5 条。
- 100% 拦截带有明显远程注入或凭证外泄风险的代码。
- 连续两次运行对未变动的仓库自动静默跳过。

## 源文件
来源：awesome-openclaw-zh  
原始文件：skill-radar.md
