Install
openclaw skills install eval-repo评估 GitHub 开源项目是否与用户研究方向相关,提供复现环境指南、风险提示,并存入知识库供后续参考。
openclaw skills install eval-repo用户在飞书发来一个 GitHub 仓库链接并表达"评估/判断"意图(如"这个项目对我课题有用吗" "帮我评估下这个开源项目""这个 repo 能不能复现 / 环境怎么配")时,本 Skill:
与 ingest_paper 的区别:ingest_paper 是"把资料存进来";本 Skill 是"先评估值不值, 评估结果本身就是有价值的知识,顺带存档"。评估的核心是结合用户已有知识库的判断, 而不是孤立地复述 README。
Activate when(同时满足):
Do NOT activate when:
--open_id。
网页测试拿不到时用 webchat_test。init_user --check)。用户记录里的 research_direction 在评估时必须用上。.env(GITEA_URL / GITEA_ADMIN_TOKEN / GITEA_BOT_USERNAME;
建议再配 GITHUB_TOKEN 提高抓取限额)。中间文件放 /tmp/paperkb/:
/tmp/paperkb/text_<owner>_<repo>.txt(脚本自动生成并返回 text_path)/tmp/paperkb/draft_eval.md、/tmp/paperkb/draft_concept_*.md 等python3 scripts/fetch_github.py --url "<GitHub 链接或 owner/repo>"
返回 JSON:full_name / url / description / language / stars / forks / open_issues / created_at / pushed_at / license / archived / topics / default_branch / dep_files_found(找到的依赖文件列表)/ has_readme / text_path(合并文本,供你阅读分析)。
text_path(后面查重、落库都要用)和 url(GitHub 原始地址,要写进 summary)。读 text_path 全文(README + 依赖文件 + 元信息)。取用户记录里的 research_direction (评估的相关性必须围绕它)。
按下面的五维判断逻辑评估这个项目,最后给一个三档结论。 你是基于 README/依赖文件/元信息做"初筛分诊",不是真把代码跑起来——结论是帮用户省时间的 判断信号,不是"保证能跑"的承诺,措辞要体现这一点。
五维判断逻辑(有先后的闸门,不是简单加权):
三档结论(每档都必须绑定到"是哪个维度决定的"理由,不要只甩分数):
结合知识库:先看 Step 5 读到的目录,判断库里有没有相关论文/项目, 在"与库内已有资料的关系"里说明它是补充、对比基线、还是重复。库为空时如实写 "知识库暂无可关联资料"。
输出结构化 JSON(你内部使用,用于后续生成 summary):
{
"type_key": "project",
"title": "<简洁中文项目名/标题>",
"title_original": "<owner/repo 或原项目名>",
"brief": "<一句话简介,50字内>",
"keywords": ["5-8个"],
"relevance": {"score": <1-10>, "reason": "<结合研究方向>"},
"verdict": "<值得深入 | 选择性参考 | 暂不建议>",
"verdict_reason": "<一句话,绑定到决定性维度>",
"env": {
"deps": "<检测到的依赖文件与关键依赖;没有则写'未声明依赖文件'>",
"python_or_runtime": "<能推断的 Python/CUDA/框架版本,推断不出留空>",
"risks": "<版本未锁/无依赖文件/特定硬件或仿真器/已归档 等复现风险>",
"setup_steps": "<给用户的建议复现步骤,3-6 步>"
},
"concepts": ["<抽象概念,如 模仿学习>"],
"resources": [{"name": "<项目名>", "type": "开源项目", "note": "<评价>"}]
}
python3 scripts/check_duplicate.py --open_id <open_id> \
--title "<title>" --text_path "<Step1 的 text_path>"
--force;否则终止。python3 scripts/kb_read.py --open_id <open_id> --list all
据 Step 3 的 concepts/resources 与已有目录,决定每项 create/update/skip:
create 项写草稿到 /tmp/paperkb/draft_concept_<名>.md / draft_resource_<名>.md 后:
# 概念页
python3 scripts/save_page.py --open_id <open_id> --kind concept \
--name "<概念名>" --file "<草稿路径>" --brief "<一句话定义>"
# 资源页(本开源项目)
python3 scripts/save_page.py --open_id <open_id> --kind resource \
--name "<项目名>" --file "<草稿路径>" --brief "<一句话简介>" --resource_type 开源项目
update 项先 kb_read.py --read "concepts/<名>" 读旧内容,把新信息融合改写进全文
(非追加)再同名保存。
【wikilink 格式铁律,所有页面通用】 所有 [[...]] 双链只写文件名本身,绝不带目录前缀:
[[模仿学习]]、[[ManiSkill]][[concepts/模仿学习]]、[[resources/ManiSkill]](带前缀会让 Gitea 拼出重复路径 404)白名单 = 本次 create/update 的页面 + kb_read 列出的已有页面。[[wikilink]] 只能指向白名单内页面。
summary 页结构(frontmatter 统一 + 正文为评估内容):
YAML frontmatter 格式铁律(所有字符串值加双引号;关键词用带引号的标准数组):
---
标题: "<title>"
原文标题: "<title_original>"
类型: "开源项目"
来源: "GitHub"
项目地址: "<fetch_github 返回的 url>"
关键词: ["关键词1", "关键词2", "关键词3"]
相关性评分: "<relevance.score,1-10>"
存入时间: "<今天 yyyy-MM-dd>"
---
# <title>
## 一句话总结
<brief> | 🔗 项目地址:<url>
## 结论:<verdict>
<verdict_reason>(说明:此结论基于 README/依赖/元信息的初筛分诊,非实际运行验证)
## 项目用途
<...>
## 技术栈与活跃度
主语言 <language>|Stars <stars>|最近提交 <pushed_at>|许可证 <license>|
是否已归档 <archived>。<对活跃度/可信度的一句判断>
## 核心方法与功能
<...>
## 与我研究方向的相关性
评分 <score>/10。<reason,结合 research_direction>
## 与库内已有资料的关系
<它是补充/对比基线/重复;库为空则写"知识库暂无可关联资料">
## 环境复现清单
- 依赖:<env.deps>
- 运行环境:<env.python_or_runtime>
- 复现风险:<env.risks>
- 建议步骤:<env.setup_steps>
## 风险与坑
<...>
## 关键概念
[[概念名]](只写文件名、仅白名单内;无则省略本节)
## 科研资源
[[项目名]](只写文件名、仅白名单内;无则省略本节)
写入 /tmp/paperkb/draft_eval.md,然后:
python3 scripts/save_paper.py --open_id <open_id> \
--type_key project \
--title "<title>" \
--summary_file /tmp/paperkb/draft_eval.md \
--keywords "<逗号分隔>" \
--score <relevance.score,1-10> \
--brief "<brief>" \
--text_path "<Step1 的 text_path>" \
[--force]
(开源项目无 PDF、无 arxiv_id,故不传 --pdf_path / --arxiv_id。) 输出含 summary_url / repo_url。
用户记录里 feishu_app_token 和 feishu_table_id 非空时,调
feishu_bitable_app_table_record(action: create)。字段格式严格遵守(之前踩过坑):
7。int(time.mktime(time.strptime("今天日期","%Y-%m-%d")))*1000"显示文本|URL" 竖线分隔字符串,不是对象。
例:"<title>|<summary_url>"fields: {
"标题": "<title>", "类型": "开源项目", "关键词": "<逗号分隔>",
"相关性评分": <纯数字 1-10>, "存入时间": <今天毫秒时间戳>,
"Gitea链接": "<title>|<summary_url>", "arxiv_id": ""
}
失败最多重试 1 次,仍失败则跳过,回复中注明"飞书表格同步失败,不影响知识库"。
✅ 已评估并存入知识库!
📦 <title>(<language>|⭐<stars>|最近提交 <pushed_at>)
🔗 项目地址:<url>
🎯 结论:<verdict> — <verdict_reason 精简一句>
⭐ 与你研究方向的相关性:<score>/10 — <reason 精简一句>
🛠 环境提示:<env.risks 或"依赖清晰,可按 README 复现",一句>
🧠 概念页:<新建X/更新Y,列名字;无则省略>
🛠 资源页:<同上;无则省略>
📄 查看完整评估:<summary_url>
覆盖模式开头改"✅ 已重新评估并覆盖更新!"。飞书跳过/失败时追加一句说明。