{"id":"1615f244-2e26-4372-b4e5-200246b1e6d9","slug":"academic-digest","kind":"skill","name":"academic-digest","summary":"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.","owner":"tf1993614","repoUrl":"https://github.com/tf1993614/academic-digest","license":"MIT","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-10-24T11:16:24.000Z","addedAt":"2026-11-01T02:04:30.798Z","logoUrl":"https://avatars.githubusercontent.com/u/61369770?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["developer-tools"],"tags":["academic","arxiv","claude-code","codex","daily-digest","deepseek-harness","europepmc","github"],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-11-01T02:19:39.572Z","sample":false,"url":"https://conduits.dev/tools/academic-digest","language":"Python","transports":["stdio"],"install":{"pypi":"academic-digest"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# 自动学术速递\n\n每天按你的关键词，把 PubMed / Europe PMC / arXiv / Research Square / GitHub 的新内容\n筛成一份中文日报，推送到微信。\n\n![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white)\n![License MIT](https://img.shields.io/badge/License-MIT-yellow)\n![Clients](https://img.shields.io/badge/clients-Claude%20Code%20%7C%20Codex%20%7C%20DSH-6b4fbb)\n\n> 脚本管事实，模型管表达，Server酱管到达。\n\n## 这是什么\n\n- 每天一次，按 `config.yaml` 里的关键词组（示例是六组）抓取 PubMed、Europe PMC、\n  arXiv、Research Square 与 GitHub。\n- 目标 **3 篇今日必读 + 7 篇其它速览**（候选不足时按实际数量）；今日必读带标签、\n  摘要、局限性与方法精读。\n- GitHub 单独成块：新库、活跃库、关注库的新 release，以及 AI 工具 / Agent Harness 的\n  G6 区块。\n- 一个自包含的 Agent Skill：仓库里同时提交 `.dsh`、`.claude`、`.agents` 三个扫描根下的\n  生成副本，克隆后三家客户端各扫各的目录。\n- 推送走 [Server酱](https://sct.ftqq.com/)，日报是 Markdown，手机微信直接可读。\n\n## 为什么做\n\n每天翻五个来源、读几十条英文摘要，真正值得读的往往只有几篇；RSS 只按时间排，不会按\n你的关键词筛。这个项目把流程拆成三段：\n\n1. **确定性脚本**负责采集、去重、排序、配额、校验与推送；\n2. **模型**只负责读候选池、写 3 + 7 的选题理由与中文摘要；\n3. **Server酱**负责到达。\n\n采集、校验、推送都可以离线复现；模型写得好不好，有 `digest check` 按固定契约把关。\n\n## 一期日报长什么样\n\n下面是 `tests/fixtures/digest/valid/digest.md` 的节选（测试假数据，不是真实论文）：\n\n```markdown\n# 学术速递 · 2026-10-22\n> 关键词：… ｜ 新论文 12 篇，精选 10 篇 ｜ GitHub 5 个\n\n## 今日必读\n### 1. Aging multi-omics atlas of the mouse brain\n- 标签：`aging` `multi-omics`\n- 摘要：…\n- 局限性：…\n- 方法精读：…\n- [原文](…) · [PDF](…)\n\n## 其它速览\n- **Single-cell foundation model benchmark** — `single-cell foundation model` · 摘要：… · 局限性：… · [链接](…)\n\n## GitHub\n### 新项目\n- **owner/repo** ⭐ 42 · Python · 2026-10-21 · 一句话定位 · 与哪组相关 · [链接](…)\n\n## AI 工具 / Agent Harness\n- **anthropics/claude-code v2.0.0**（官方 release，2026-10-21）· 更新要点 · [链接](…)\n\n---\n来源：pubmed ok (2) ｜ europepmc ok (9) ｜ github ok (5)\n候选：12 ｜ 入选：10 ｜ 生成：2026-10-22T08:00:00+08:00\n```\n\n- 今日必读目标 3 篇，四要素齐全；方法精读只基于 OA 全文，拿不到就明确写“仅基于摘要”。\n- 其它速览一篇一行，含摘要、局限、标签与链接。\n- GitHub 三个区块与 G6 不占论文的 3 + 7 席位；没有更新时整块省略，不补空条目。\n- 页脚覆盖每个源的状态、候选数、入选数与生成时间；`digest check` 会逐项校验。\n\n## 快速开始（5 分钟）\n\n要求：Python 3.11+、git。第一次先装一次依赖。最省事的是 `pip install -e .`：它会装依赖，\n并顺带提供可选的 `academic-digest` 命令；`academic_digest` 的代码随 skill 走，入口脚本\n自己解析 `sys.path`，所以不装这个包也能跑：\n\n```bash\ngit clone https://github.com/tf1993614/academic-digest.git\ncd academic-digest\npython3 -m venv .venv && . .venv/bin/activate\npip install -e .\n```\n\n下面四条命令只读 `tests/fixtures/` 里的录制响应，不联网、不需要 secrets、不需要\n`config.yaml`：\n\n```bash\n# 1. 配置与录制响应自检\npython3 skills/academic-digest/scripts/doctor.py \\\n  --config tests/fixtures/walking/config.yaml \\\n  --fixtures tests/fixtures/walking\n\n# 2. 采集候选池；--now 固定逻辑时钟，输出可复现\npython3 skills/academic-digest/scripts/collect.py \\\n  --config tests/fixtures/walking/config.yaml \\\n  --fixtures tests/fixtures/walking \\\n  --now 2026-10-22T08:00:00+08:00 \\\n  --out /tmp/candidates.json \\\n  --state-db /tmp/state.sqlite3\n\n# 3. 校验一份模型写好的 selection 与日报\npython3 skills/academic-digest/scripts/digest.py check \\\n  --candidates tests/fixtures/digest/valid/candidates.json \\\n  --selection tests/fixtures/digest/valid/selection.json \\\n  --digest tests/fixtures/digest/valid/digest.md\n\n# 4. 构建 Server酱 payload；不读 SendKey、不发送\npython3 skills/academic-digest/scripts/push.py \\\n  --config tests/fixtures/walking/config.yaml \\\n  --candidates tests/fixtures/digest/valid/candidates.json \\\n  --selection tests/fixtures/digest/valid/selection.json \\\n  --digest tests/fixtures/digest/valid/digest.md \\\n  --now 2026-10-22T08:00:00+08:00 \\\n  --dry-run\n```\n\n四条都退出 0，说明代码、fixture 与依赖都就位。接下来配置真实运行：\n\n```bash\n# secrets.env：写入 SERVERCHAN_SENDKEY 与 GITHUB_TOKEN，权限 600（gitignored）\nskills/academic-digest/scripts/setup-secrets.sh\n# config.yaml：从模板复制后按访谈调整（gitignored）\ncp config.example.yaml config.yaml\nset -a; . ./secrets.env; set +a\npython3 skills/academic-digest/scripts/doctor.py --config config.yaml\n```\n\n`doctor` 联网检查每个源的连通性、GitHub 配额与状态库路径；看到最后一行\n`doctor: all checks passed` 之后再接定时。\n\n## 获取凭据（Server酱 SendKey 与 GitHub token）\n\n两个值都只写进仓库根的 `secrets.env`（已被 gitignore，权限 600）。最省事是运行一次性\n向导，它会打开下面的页面、隐藏输入、写文件并设权限：\n\n```bash\nskills/academic-digest/scripts/setup-secrets.sh\n```\n\n手动配置也可以：\n\n### Server酱 SendKey\n\n1. 打开 <https://sct.ftqq.com/>，用微信扫码登录。\n2. 在「SendKey / 密钥」页面复制 key（常见形如 `sctp...`）。\n3. 写入 `secrets.env`：`SERVERCHAN_SENDKEY=<复制的 key>`。\n\nServer酱³ 的 key 形如 `sctp<uid>t...`，控制台在 <https://sc3.ft07.com/>；本项目会自动\n选择推送域名。免费额度与限制以 Server酱官网为准。\n\n### GitHub token\n\n1. 打开 <https://github.com/settings/tokens/new>。\n2. Note 填 `academic-digest`，Expiration 选 90 天。\n3. Classic token：只做公开数据发现时**不勾任何 scope**；要跟踪自己 starred 的私有仓库\n   时勾 `repo`。也可以建 fine-grained token，只给公开仓库只读权限。\n4. 复制 `ghp_...` / `github_pat_...`，写入 `secrets.env`：`GITHUB_TOKEN=<复制的 token>`。\n5. 执行 `chmod 600 secrets.env`；不要提交 `secrets.env`，也不要把 key 贴进对话、日报或\n   Prompt。\n\n不配置 GitHub token 时，把 `config.yaml` 的 `sources.github` 设为 `false`；不配置\nSendKey 时 `push` 会退出 2（不会发送）。\n\n## 接到你的客户端\n\n仓库自带三份生成副本，克隆后不需要再复制或软链即可被三家发现（依赖仍需按上一节装一次）：\n\n| 客户端 | 扫描根 | 触发 |\n|---|---|---|\n| DSH | `.dsh/skills/` | 会话中加载；看板卡定时需 task-board 插件（见下） |\n| Claude Code | `.claude/skills/` | `/academic-digest` |\n| Codex | `.agents/skills/` | `/skills` 选择器 |\n\n> DSH 本体不带任务看板与 cron；看板卡来自 DSH Web 的任务看板插件\n> `@linxin666/dsh-client-ui-task-board`（装 `@linxin666/dsh-web-all` 全家桶时已包含）。\n> 侧栏里没有「任务看板」时，按「每天定时跑」里的命令安装后再重启 `dsh web`。\n\n三份副本由 `scripts/sync-skills.sh` 从 `skills/academic-digest/` 生成，除\n`references/scheduling.md` 外逐字节一致；**不要手改副本**，改源目录后重新同步。\n\n想在所有仓库里使用，可以把对应副本软链到用户级扫描根：\n\n```bash\nmkdir -p ~/.dsh/skills ~/.claude/skills ~/.agents/skills\nln -sfn \"$PWD/.dsh/skills/academic-digest\" ~/.dsh/skills/academic-digest\nln -sfn \"$PWD/.claude/skills/academic-digest\" ~/.claude/skills/academic-digest\nln -sfn \"$PWD/.agents/skills/academic-digest\" ~/.agents/skills/academic-digest\n```\n\n运行数据（`config.yaml`、`secrets.env`、`out/`、`state/`）留在执行命令的那个仓库根，不跟着\nskill 走；推荐始终在你克隆的仓库根运行。客户端的发现规则见\n[Claude Code skills](https://code.claude.com/docs/en/skills) 与\n[Codex skills](https://developers.openai.com/codex/skills)。\n\n## 配置\n\n`config.yaml` 从 [`config.example.yaml`](config.example.yaml) 复制，已被 gitignore。\n最常改的几项：\n\n- `timezone`：IANA 时区，默认示例是 `Asia/Shanghai`；\n- `topics`：六组关键词与每组 `max_items`（G2 最多 4 篇，G6 独立成块）；\n- `sources`：PubMed、Europe PMC、arXiv、Research Square、GitHub 默认开；\n  bioRxiv / medRxiv 默认关；\n- `lookback.arxiv`：至少 4 天，否则配置校验失败（周五到周一的公告会合并）；\n- `journal_filter`：可选期刊白名单，默认不限；\n- `push.sendkey_env`：SendKey 所在的**环境变量名**，默认 `SERVERCHAN_SENDKEY`；\n  SendKey 本身不写进配置。\n\n完整字段、默认值与校验规则见 [docs/configuration.md](docs/configuration.md)。\n\n## 每天定时跑\n\n### DSH：看板卡 + task-board 插件\n\nDSH 本体不带任务看板与 cron；看板卡与 cron 来自 DSH Web 的任务看板插件\n`@linxin666/dsh-client-ui-task-board`（装 `@linxin666/dsh-web-all` 全家桶时已包含）。\n如果侧栏已有「任务看板」，跳过安装；没有则安装并重启 `dsh web`：\n\n```bash\ndsh plugin --profile web add @linxin666/dsh-client-ui-task-board@latest\n# 或者一次装全家桶\ndsh plugin --profile web add @linxin666/dsh-web-all@latest\ndsh web\n```\n\n然后在看板建卡：cron `0 8 * * *`、时区 `Asia/Shanghai`；看板起会话加载 skill，不经过\nwrapper。建卡字段与 Prompt 见\n[`references/scheduling/dsh.md`](skills/academic-digest/references/scheduling/dsh.md)。\n\n没有这个插件时，`task_board_*` 工具和看板 cron 都不存在；本版没有为 DSH 提供 headless\nwrapper，定时请改用 Claude Code / Codex 的 `run-daily.sh`，或自行调度。\n\n### Claude Code / Codex：本机定时器 + wrapper\n\n同一个无人值守入口 `skills/academic-digest/scripts/run-daily.sh <claude|codex>`；它加载\n`secrets.env`、加并发锁、写 `out/logs/run-daily.log`、透传退出码。systemd、launchd、\ncrontab 的可粘贴片段分别在\n[`references/scheduling/claude.md`](skills/academic-digest/references/scheduling/claude.md)\n与\n[`references/scheduling/codex.md`](skills/academic-digest/references/scheduling/codex.md)。\n\n错过触发不会补跑；各源自己的 `lookback`（默认 2–4 天）会在下一次运行时补上窗口。\n云端定时与 GitHub Actions 定时不在 V1 范围内。\n\n## 命令与退出码\n\n| 命令 | 用途 |\n|---|---|\n| `collect` | 抓取各源，写出候选池 `out/candidates.json` |\n| `fulltext` | 取单篇 OA 全文，抽取方法 / 结果 / 局限 |\n| `digest check` | 校验模型写的 `selection.json` 与 `digest.md` |\n| `push` | 把校验过的日报推到微信 |\n| `doctor` | 检查配置、源连通性与状态库路径 |\n\n`--fixtures DIR` 只读录制响应、绝不联网；给出时应同时固定 `--now`。完整参数、产物与\n退出码见 [docs/cli.md](docs/cli.md)。\n\n| 退出码 | 含义 |\n|---|---|\n| `0` | 成功（含空日报按配置发送 / 跳过、`push --dry-run`） |\n| `1` | 源、状态库、输出文件、自检、日报校验或推送失败 |\n| `2` | 配置或参数错误、缺少 SendKey（尚未发起网络请求） |\n\n## 失败时会发生什么\n\n- **单个源失败**：其余源继续产出，`collect` 退出 0，日报页脚如实标 `failed`。\n- **全部源失败**：`collect` 退出 1，不推送假日报。\n- **推送失败**：每条消息默认重试 2 次；仍失败则写入 SQLite `pending`，下一次 live run 先补发。\n- **空日报**：默认发一条“今日没有匹配的检索条目”；`push.send_empty: false` 时跳过并退出 0。\n- **完成标准**：只有 `push` 退出 0 且 stdout 出现 `[ok] push:` 才算当天完成。\n\n日报生成步骤需要一个能读候选池、跑命令的模型；采集、全文抽取、`digest check`、`push`\n与 `doctor` 都是确定性脚本。\n\n## 安全与隐私\n\n- `SERVERCHAN_SENDKEY` 与 `GITHUB_TOKEN` 只从环境变量读取，不写进日报、日志、状态库或 git。\n- `secrets.env` 权限应为 `600`；`config.yaml`、`secrets.env`、`out/`、`state/` 都在\n  `.gitignore` 里。\n- 错误信息会先脱敏；候选池不包含 Unpaywall 邮箱。\n- 微信没有个人号 API，V1 只支持 Server酱；额度与限制以 Server酱官网为准。\n- 启用 GitHub 源需要一个免费 token；Unpaywall 邮箱可选，留空只是少一条 OA 全文路径。\n- 除采集请求与 ServerChan 推送外，不额外上传运行数据；本项目没有遥测。\n\n## 项目结构\n\n```text\nskills/academic-digest/        # 源 skill：SKILL.md、references/、scripts/、academic_digest/\n.dsh|.claude|.agents/skills/academic-digest/   # 三份生成副本（勿手改）\ndocs/                          # 命令、配置、开发记录、ADR、调研\ntests/                         # 离线 fixture 与测试\nscripts/                       # check / sync / check-skills / review-patch\nconfig.example.yaml            # 配置模板\n```\n\n运行数据 `config.yaml`、`secrets.env`、`out/`、`state/` 留在仓库根，不跟着 skill 走。\n\n## FAQ 与已知限制\n\n- **Windows？** 用 WSL2；`set -a; . ./secrets.env` 是 bash 语法。\n- **需要 API key 吗？** 采集与推送不需要 LLM key；写 3 + 7 日报需要你已登录的 Claude /\n  Codex 订阅，或 DSH 里已配置的模型。GitHub 源需要一个免费 token。\n- **为什么 bioRxiv / medRxiv 默认关？** 它们按日期区间全量拉取再本地过滤，量大；\n  需要全量覆盖时再打开。\n- **为什么只有 Server酱？** 微信没有个人号 API；V1 只做 ServerChan。\n- **有云端定时或 GitHub Actions 定时吗？** 没有；定时只做本机调度与 DSH 看板卡（后者需 task-board 插件）。\n- **arXiv 偶尔超时？** 单个源失败仍会发日报并在页脚标注；不会为了重试而重跑整次采集。\n- **PDF 解析用什么？** PyMuPDF（AGPL-3.0）；HTML 用 beautifulsoup4 + lxml。再分发前请自行确认许可证兼容性。\n- **V1 没有什么？** Web UI、邮件、公众号、多用户、反馈闭环、动态补窗都不在范围内。\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=tf1993614/academic-digest&type=Date)](https://star-history.com/#tf1993614/academic-digest&Date)\n\n## 开发、致谢与许可\n\n一次跑完全部检查（mypy、pyflakes、文档一致性、pytest）：\n\n```bash\nscripts/check.sh\n```\n\n测试全部离线且固定 `--now`；CLI 是唯一的测试缝。更多约定见\n[CODING_STANDARDS.md](CODING_STANDARDS.md) 与\n[docs/agents/code-review.md](docs/agents/code-review.md)。\n\n感谢 PubMed E-utilities、Europe PMC、arXiv、Research Square、GitHub API、Server酱、\nPyMuPDF、BeautifulSoup 与 DSH 提供的接口和工具。\n\n本项目以 [MIT License](LICENSE) 发布，作者 `tf1993614`。完整文档入口见\n[docs/README.md](docs/README.md)。\n"}