skill
academic-digest
Daily Chinese academic digest from PubMed, Europe PMC, arXiv, Research Square and GitHub: a 3+7 report pushed to WeChat via ServerChan. Self-contained Agent Skill for Claude Code, Codex and DSH.
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/tf1993614/academic-digest itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Nov 1, 2026自动学术速递
每天按你的关键词,把 PubMed / Europe PMC / arXiv / Research Square / GitHub 的新内容 筛成一份中文日报,推送到微信。
脚本管事实,模型管表达,Server酱管到达。
这是什么
- 每天一次,按
config.yaml里的关键词组(示例是六组)抓取 PubMed、Europe PMC、 arXiv、Research Square 与 GitHub。 - 目标 3 篇今日必读 + 7 篇其它速览(候选不足时按实际数量);今日必读带标签、 摘要、局限性与方法精读。
- GitHub 单独成块:新库、活跃库、关注库的新 release,以及 AI 工具 / Agent Harness 的 G6 区块。
- 一个自包含的 Agent Skill:仓库里同时提交
.dsh、.claude、.agents三个扫描根下的 生成副本,克隆后三家客户端各扫各的目录。 - 推送走 Server酱,日报是 Markdown,手机微信直接可读。
为什么做
每天翻五个来源、读几十条英文摘要,真正值得读的往往只有几篇;RSS 只按时间排,不会按 你的关键词筛。这个项目把流程拆成三段:
- 确定性脚本负责采集、去重、排序、配额、校验与推送;
- 模型只负责读候选池、写 3 + 7 的选题理由与中文摘要;
- Server酱负责到达。
采集、校验、推送都可以离线复现;模型写得好不好,有 digest check 按固定契约把关。
一期日报长什么样
下面是 tests/fixtures/digest/valid/digest.md 的节选(测试假数据,不是真实论文):
# 学术速递 · 2026-10-22
> 关键词:… | 新论文 12 篇,精选 10 篇 | GitHub 5 个
## 今日必读
### 1. Aging multi-omics atlas of the mouse brain
- 标签:`aging` `multi-omics`
- 摘要:…
- 局限性:…
- 方法精读:…
- [原文](…) · [PDF](…)
## 其它速览
- **Single-cell foundation model benchmark** — `single-cell foundation model` · 摘要:… · 局限性:… · [链接](…)
## GitHub
### 新项目
- **owner/repo** ⭐ 42 · Python · 2026-10-21 · 一句话定位 · 与哪组相关 · [链接](…)
## AI 工具 / Agent Harness
- **anthropics/claude-code v2.0.0**(官方 release,2026-10-21)· 更新要点 · [链接](…)
---
来源:pubmed ok (2) | europepmc ok (9) | github ok (5)
候选:12 | 入选:10 | 生成:2026-10-22T08:00:00+08:00
- 今日必读目标 3 篇,四要素齐全;方法精读只基于 OA 全文,拿不到就明确写“仅基于摘要”。
- 其它速览一篇一行,含摘要、局限、标签与链接。
- GitHub 三个区块与 G6 不占论文的 3 + 7 席位;没有更新时整块省略,不补空条目。
- 页脚覆盖每个源的状态、候选数、入选数与生成时间;
digest check会逐项校验。
快速开始(5 分钟)
要求:Python 3.11+、git。第一次先装一次依赖。最省事的是 pip install -e .:它会装依赖,
并顺带提供可选的 academic-digest 命令;academic_digest 的代码随 skill 走,入口脚本
自己解析 sys.path,所以不装这个包也能跑:
git clone https://github.com/tf1993614/academic-digest.git
cd academic-digest
python3 -m venv .venv && . .venv/bin/activate
pip install -e .
下面四条命令只读 tests/fixtures/ 里的录制响应,不联网、不需要 secrets、不需要
config.yaml:
# 1. 配置与录制响应自检
python3 skills/academic-digest/scripts/doctor.py \
--config tests/fixtures/walking/config.yaml \
--fixtures tests/fixtures/walking
# 2. 采集候选池;--now 固定逻辑时钟,输出可复现
python3 skills/academic-digest/scripts/collect.py \
--config tests/fixtures/walking/config.yaml \
--fixtures tests/fixtures/walking \
--now 2026-10-22T08:00:00+08:00 \
--out /tmp/candidates.json \
--state-db /tmp/state.sqlite3
# 3. 校验一份模型写好的 selection 与日报
python3 skills/academic-digest/scripts/digest.py check \
--candidates tests/fixtures/digest/valid/candidates.json \
--selection tests/fixtures/digest/valid/selection.json \
--digest tests/fixtures/digest/valid/digest.md
# 4. 构建 Server酱 payload;不读 SendKey、不发送
python3 skills/academic-digest/scripts/push.py \
--config tests/fixtures/walking/config.yaml \
--candidates tests/fixtures/digest/valid/candidates.json \
--selection tests/fixtures/digest/valid/selection.json \
--digest tests/fixtures/digest/valid/digest.md \
--now 2026-10-22T08:00:00+08:00 \
--dry-run
四条都退出 0,说明代码、fixture 与依赖都就位。接下来配置真实运行:
# secrets.env:写入 SERVERCHAN_SENDKEY 与 GITHUB_TOKEN,权限 600(gitignored)
skills/academic-digest/scripts/setup-secrets.sh
# config.yaml:从模板复制后按访谈调整(gitignored)
cp config.example.yaml config.yaml
set -a; . ./secrets.env; set +a
python3 skills/academic-digest/scripts/doctor.py --config config.yaml
doctor 联网检查每个源的连通性、GitHub 配额与状态库路径;看到最后一行
doctor: all checks passed 之后再接定时。
获取凭据(Server酱 SendKey 与 GitHub token)
两个值都只写进仓库根的 secrets.env(已被 gitignore,权限 600)。最省事是运行一次性
向导,它会打开下面的页面、隐藏输入、写文件并设权限:
skills/academic-digest/scripts/setup-secrets.sh
手动配置也可以:
Server酱 SendKey
- 打开 https://sct.ftqq.com/,用微信扫码登录。
- 在「SendKey / 密钥」页面复制 key(常见形如
sctp...)。 - 写入
secrets.env:SERVERCHAN_SENDKEY=<复制的 key>。
Server酱³ 的 key 形如 sctp<uid>t...,控制台在 https://sc3.ft07.com/;本项目会自动
选择推送域名。免费额度与限制以 Server酱官网为准。
GitHub token
- 打开 https://github.com/settings/tokens/new。
- Note 填
academic-digest,Expiration 选 90 天。 - Classic token:只做公开数据发现时不勾任何 scope;要跟踪自己 starred 的私有仓库
时勾
repo。也可以建 fine-grained token,只给公开仓库只读权限。 - 复制
ghp_.../github_pat_...,写入secrets.env:GITHUB_TOKEN=<复制的 token>。 - 执行
chmod 600 secrets.env;不要提交secrets.env,也不要把 key 贴进对话、日报或 Prompt。
不配置 GitHub token 时,把 config.yaml 的 sources.github 设为 false;不配置
SendKey 时 push 会退出 2(不会发送)。
接到你的客户端
仓库自带三份生成副本,克隆后不需要再复制或软链即可被三家发现(依赖仍需按上一节装一次):
| 客户端 | 扫描根 | 触发 |
|---|---|---|
| DSH | .dsh/skills/ | 会话中加载;看板卡定时需 task-board 插件(见下) |
| Claude Code | .claude/skills/ | /academic-digest |
| Codex | .agents/skills/ | /skills 选择器 |
DSH 本体不带任务看板与 cron;看板卡来自 DSH Web 的任务看板插件
@linxin666/dsh-client-ui-task-board(装@linxin666/dsh-web-all全家桶时已包含)。 侧栏里没有「任务看板」时,按「每天定时跑」里的命令安装后再重启dsh web。
三份副本由 scripts/sync-skills.sh 从 skills/academic-digest/ 生成,除
references/scheduling.md 外逐字节一致;不要手改副本,改源目录后重新同步。
想在所有仓库里使用,可以把对应副本软链到用户级扫描根:
mkdir -p ~/.dsh/skills ~/.claude/skills ~/.agents/skills
ln -sfn "$PWD/.dsh/skills/academic-digest" ~/.dsh/skills/academic-digest
ln -sfn "$PWD/.claude/skills/academic-digest" ~/.claude/skills/academic-digest
ln -sfn "$PWD/.agents/skills/academic-digest" ~/.agents/skills/academic-digest
运行数据(config.yaml、secrets.env、out/、state/)留在执行命令的那个仓库根,不跟着
skill 走;推荐始终在你克隆的仓库根运行。客户端的发现规则见
Claude Code skills 与
Codex skills。
配置
config.yaml 从 config.example.yaml 复制,已被 gitignore。
最常改的几项:
timezone:IANA 时区,默认示例是Asia/Shanghai;topics:六组关键词与每组max_items(G2 最多 4 篇,G6 独立成块);sources:PubMed、Europe PMC、arXiv、Research Square、GitHub 默认开; bioRxiv / medRxiv 默认关;lookback.arxiv:至少 4 天,否则配置校验失败(周五到周一的公告会合并);journal_filter:可选期刊白名单,默认不限;push.sendkey_env:SendKey 所在的环境变量名,默认SERVERCHAN_SENDKEY; SendKey 本身不写进配置。
完整字段、默认值与校验规则见 docs/configuration.md。
每天定时跑
DSH:看板卡 + task-board 插件
DSH 本体不带任务看板与 cron;看板卡与 cron 来自 DSH Web 的任务看板插件
@linxin666/dsh-client-ui-task-board(装 @linxin666/dsh-web-all 全家桶时已包含)。
如果侧栏已有「任务看板」,跳过安装;没有则安装并重启 dsh web:
dsh plugin --profile web add @linxin666/dsh-client-ui-task-board@latest
# 或者一次装全家桶
dsh plugin --profile web add @linxin666/dsh-web-all@latest
dsh web
然后在看板建卡:cron 0 8 * * *、时区 Asia/Shanghai;看板起会话加载 skill,不经过
wrapper。建卡字段与 Prompt 见
references/scheduling/dsh.md。
没有这个插件时,task_board_* 工具和看板 cron 都不存在;本版没有为 DSH 提供 headless
wrapper,定时请改用 Claude Code / Codex 的 run-daily.sh,或自行调度。
Claude Code / Codex:本机定时器 + wrapper
同一个无人值守入口 skills/academic-digest/scripts/run-daily.sh <claude|codex>;它加载
secrets.env、加并发锁、写 out/logs/run-daily.log、透传退出码。systemd、launchd、
crontab 的可粘贴片段分别在
references/scheduling/claude.md
与
references/scheduling/codex.md。
错过触发不会补跑;各源自己的 lookback(默认 2–4 天)会在下一次运行时补上窗口。
云端定时与 GitHub Actions 定时不在 V1 范围内。
命令与退出码
| 命令 | 用途 |
|---|---|
collect | 抓取各源,写出候选池 out/candidates.json |
fulltext | 取单篇 OA 全文,抽取方法 / 结果 / 局限 |
digest check | 校验模型写的 selection.json 与 digest.md |
push | 把校验过的日报推到微信 |
doctor | 检查配置、源连通性与状态库路径 |
--fixtures DIR 只读录制响应、绝不联网;给出时应同时固定 --now。完整参数、产物与
退出码见 docs/cli.md。
| 退出码 | 含义 |
|---|---|
0 | 成功(含空日报按配置发送 / 跳过、push --dry-run) |
1 | 源、状态库、输出文件、自检、日报校验或推送失败 |
2 | 配置或参数错误、缺少 SendKey(尚未发起网络请求) |
失败时会发生什么
- 单个源失败:其余源继续产出,
collect退出 0,日报页脚如实标failed。 - 全部源失败:
collect退出 1,不推送假日报。 - 推送失败:每条消息默认重试 2 次;仍失败则写入 SQLite
pending,下一次 live run 先补发。 - 空日报:默认发一条“今日没有匹配的检索条目”;
push.send_empty: false时跳过并退出 0。 - 完成标准:只有
push退出 0 且 stdout 出现[ok] push:才算当天完成。
日报生成步骤需要一个能读候选池、跑命令的模型;采集、全文抽取、digest check、push
与 doctor 都是确定性脚本。
安全与隐私
SERVERCHAN_SENDKEY与GITHUB_TOKEN只从环境变量读取,不写进日报、日志、状态库或 git。secrets.env权限应为600;config.yaml、secrets.env、out/、state/都在.gitignore里。- 错误信息会先脱敏;候选池不包含 Unpaywall 邮箱。
- 微信没有个人号 API,V1 只支持 Server酱;额度与限制以 Server酱官网为准。
- 启用 GitHub 源需要一个免费 token;Unpaywall 邮箱可选,留空只是少一条 OA 全文路径。
- 除采集请求与 ServerChan 推送外,不额外上传运行数据;本项目没有遥测。
项目结构
skills/academic-digest/ # 源 skill:SKILL.md、references/、scripts/、academic_digest/
.dsh|.claude|.agents/skills/academic-digest/ # 三份生成副本(勿手改)
docs/ # 命令、配置、开发记录、ADR、调研
tests/ # 离线 fixture 与测试
scripts/ # check / sync / check-skills / review-patch
config.example.yaml # 配置模板
运行数据 config.yaml、secrets.env、out/、state/ 留在仓库根,不跟着 skill 走。
FAQ 与已知限制
- Windows? 用 WSL2;
set -a; . ./secrets.env是 bash 语法。 - 需要 API key 吗? 采集与推送不需要 LLM key;写 3 + 7 日报需要你已登录的 Claude / Codex 订阅,或 DSH 里已配置的模型。GitHub 源需要一个免费 token。
- 为什么 bioRxiv / medRxiv 默认关? 它们按日期区间全量拉取再本地过滤,量大; 需要全量覆盖时再打开。
- 为什么只有 Server酱? 微信没有个人号 API;V1 只做 ServerChan。
- 有云端定时或 GitHub Actions 定时吗? 没有;定时只做本机调度与 DSH 看板卡(后者需 task-board 插件)。
- arXiv 偶尔超时? 单个源失败仍会发日报并在页脚标注;不会为了重试而重跑整次采集。
- PDF 解析用什么? PyMuPDF(AGPL-3.0);HTML 用 beautifulsoup4 + lxml。再分发前请自行确认许可证兼容性。
- V1 没有什么? Web UI、邮件、公众号、多用户、反馈闭环、动态补窗都不在范围内。
Star History
开发、致谢与许可
一次跑完全部检查(mypy、pyflakes、文档一致性、pytest):
scripts/check.sh
测试全部离线且固定 --now;CLI 是唯一的测试缝。更多约定见
CODING_STANDARDS.md 与
docs/agents/code-review.md。
感谢 PubMed E-utilities、Europe PMC、arXiv、Research Square、GitHub API、Server酱、 PyMuPDF、BeautifulSoup 与 DSH 提供的接口和工具。
本项目以 MIT License 发布,作者 tf1993614。完整文档入口见
docs/README.md。