merge: dev → master (README restructure + security hardening)#233
Conversation
* feat(push): implement Epic #179 — daily push optimization Multi-channel push infrastructure with structured digest cards: - #187: Integrate HF upvotes into Judge scoring prompt - #180: Add digest_card extraction (highlight/method/finding/tags) with new LLM prompt, email template rendering, markdown output - #181: MinerU Cloud API client for PDF figure extraction - #182: Apprise multi-channel push layer with YAML config - #183-185: Channel formatters (Telegram MarkdownV2, Discord Rich Embed, WeCom markdown+news, Feishu/Lark interactive card) - #186: RSS 2.0 + Atom feed endpoints (/api/feed/daily.xml, .atom) Also creates follow-up issues #190 (Push Channel Settings UI) and #191 (Dashboard Digest Card Enhancement). 56 new tests, all passing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: integrate MinerU figure extraction into CLI and ARQ worker daily-paper workflow Refs #179 * fix(daily-push): enable MinerU flags in ARQ cron payload (refs #181) * feat(push): wire channel formatters into apprise digest delivery (refs #182 #183 #184 #185) * feat(feed): add keyword RSS, feed cache, and figure enclosure support (refs #186) * feat(mineru): add extraction result cache for daily push figure pipeline (refs #181) * feat(push): add telegram bot command subscription endpoint (refs #191) * fix(push): add retry/backoff for channel delivery failures (refs #191) * feat(hf): add trending modes, cache, and arxiv identity dedupe (refs #193) * feat(push): add idempotency and error-code mapping for channel delivery (refs #191) * test(push): add mock channel e2e and failure-injection coverage (refs #191) * docs(push): add audit script and ops runbook for acceptance closure (refs #192) * docs: update README for AgentSwarm execution transition * docs: archive stale docs and rename AgentSwarm todo * docs: add AgentSwarm design proposal + web Playwright e2e setup - Add docs/proposals/agentswarm-design.md covering multi-agent orchestration architecture, adapter pattern, session management, skills ecosystem, and OpenCode/OpenClaw/oMo integration (refs #197, #214) - Add Playwright e2e test scaffolding for web dashboard (smoke, papers, research specs) - Update web/.gitignore for Playwright artifacts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…LI chat errors (#223) * fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors - 支持内联标题/摘要,以绕过 PaperInputRouter 获取 studio 论文 ID - 使上下文包生成 SSE 流期间的数据库持久化操作不再致命 - 从库中导入重复论文时显示错误消息 - 将左侧文件面板宽度缩小至约 18%(默认宽度);移除默认模板文件 - 为 Claude CLI 添加 --verbose 标志,以兼容 stream-json 输出 Related to #222 * fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors - 修改Gemini AI review代码问题 * fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors - 修改Gemini AI review代码问题 --------- Co-authored-by: Jerry Zhang <1772030600@qq.com>
* fix(mineru): support v4 async task extraction flow * refactor(mineru): standardize on v4 task API for daily push (#179)
- Add centered hero header with badges (CI, Roadmap, License, Python, Next.js) - Replace verbose 18-row feature table with categorized bullet lists - Move Roadmap Phase 1-6 content to pinned issue #232 - Move module maturity matrix to Roadmap #232 - Consolidate screenshots into collapsible sections - Remove inline API endpoint table (40+ rows) and directory tree - Add Contributing section with Roadmap link - Streamline Getting Started with collapsible config details - Add repo topics for GitHub discoverability References: vLLM, Docling, PaperQA2, R2R README patterns Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- docs(readme): restructure README for professional presentation - fix(codeql): harden studio chat project_dir normalization - fix(review): resolve security and reliability findings - fix(security): harden runbook allowed-dir path validation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughRewrote README.md from Chinese-centric, ASCII diagram-heavy format to English-centric, web-friendly structure. Reorganized content into standard sections (About, Getting Started, Features, Knowledge Management, etc.), updated product descriptions, and replaced bulky diagrams with simplified narratives and structured lists. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request streamlines the project's public-facing documentation and enhances its security posture. The Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
| # Scholar tracking | ||
| python main.py track --summary | ||
|
|
||
| # Paper2Code | ||
| python main.py gen-code --title "..." --abstract "..." --output-dir ./output | ||
|
|
||
| # 主题检索 | ||
| python -m paperbot.presentation.cli.main topic-search \ | ||
| -q "ICL压缩" -q "KV Cache加速" \ | ||
| --source papers_cool --source arxiv_api --source hf_daily --branch arxiv --branch venue | ||
|
|
||
| # DailyPaper(含 LLM + Judge + 推送) | ||
| python -m paperbot.presentation.cli.main daily-paper \ | ||
| -q "ICL压缩" -q "KV Cache加速" \ | ||
| --with-llm --llm-feature summary --llm-feature trends --llm-feature insight \ | ||
| --with-judge --judge-runs 2 --judge-max-items 5 \ | ||
| --save --notify --notify-channel email | ||
| ``` | ||
|
|
||
| ## 目录结构 | ||
|
|
||
| ```text | ||
| PaperBot/ | ||
| ├── src/paperbot/ | ||
| │ ├── agents/ # Agents(研究/代码/评审/验证/追踪) | ||
| │ ├── api/ # FastAPI 后端(SSE 流式) | ||
| │ │ ├── routes/ # 业务路由(track/analyze/paperscool/model_endpoints/...) | ||
| │ │ └── streaming.py # SSE 流式 envelope | ||
| │ ├── application/ | ||
| │ │ ├── ports/ # 端口接口(PaperSearchPort/EnrichmentPort/FeedbackPort/...) | ||
| │ │ ├── services/ # 应用服务(LLM/PaperSearch/Enrichment/Identity/Provider) | ||
| │ │ └── workflows/ | ||
| │ │ ├── unified_topic_search.py # 统一主题检索(多源聚合 + min_score) | ||
| │ │ ├── dailypaper.py # 日报生成、LLM 增强、Judge 评分 | ||
| │ │ └── analysis/ # Judge / Trend / Summarizer / Relevance | ||
| │ ├── core/ # 核心抽象(pipeline/errors/DI) | ||
| │ ├── domain/ # 领域模型(Paper/Scholar/Track/Feedback/Enrichment/Identity) | ||
| │ ├── infrastructure/ | ||
| │ │ ├── adapters/ # 搜索适配器(arXiv/S2/OpenAlex/papers.cool/HF Daily) | ||
| │ │ ├── connectors/ # 数据源连接器(arXiv/OpenAlex/HF/Reddit/X/Zotero/papers.cool) | ||
| │ │ ├── harvesters/ # 批量收割器(arXiv/OpenAlex/S2) | ||
| │ │ ├── crawling/ # HTTP 下载器、请求层、解析器 | ||
| │ │ ├── llm/ # ModelRouter(多提供商路由) | ||
| │ │ ├── stores/ # SQLAlchemy 存储(Paper/Research/ModelEndpoint/LLMUsage/Keychain/...) | ||
| │ │ └── queue/ # ARQ Worker(定时任务 + DailyPaper Cron) | ||
| │ ├── memory/ # 记忆中间件(导入/抽取/检索) | ||
| │ ├── context_engine/ # Context Engine(Track Router / 推荐) | ||
| │ ├── presentation/ # CLI 入口与 Markdown 报告渲染 | ||
| │ ├── utils/ # 工具(secret 加密、文本处理) | ||
| │ └── repro/ # Paper2Code(Blueprint/CodeMemory/RAG/Debugger) | ||
| ├── web/ # Next.js Web Dashboard | ||
| ├── cli/ # Ink/React Terminal UI | ||
| ├── alembic/ # DB 迁移脚本 | ||
| ├── docs/ # 项目文档 | ||
| ├── config/ # 配置(models/venues/subscriptions) | ||
| ├── tests/ # 测试 | ||
| ├── asset/ # 截图 + 架构图(drawio / excalidraw) | ||
| ├── pyproject.toml # Python 项目配置 | ||
| └── env.example # 环境变量模板 | ||
| # Deep review | ||
| python main.py review --title "..." --abstract "..." |
There was a problem hiding this comment.
为了保持 CLI 命令的一致性,建议将 python main.py ... 的调用方式统一为 python -m paperbot.presentation.cli.main ...。这与文件中前面的 daily-paper 和 topic-search 命令的调用方式一致,可以为用户提供更统一的体验。
这可能需要将旧的 main.py 中的命令逻辑迁移到 src/paperbot/presentation/cli/main.py 中,并将其作为唯一的 CLI 入口点。
| # Scholar tracking | |
| python main.py track --summary | |
| # Paper2Code | |
| python main.py gen-code --title "..." --abstract "..." --output-dir ./output | |
| # 主题检索 | |
| python -m paperbot.presentation.cli.main topic-search \ | |
| -q "ICL压缩" -q "KV Cache加速" \ | |
| --source papers_cool --source arxiv_api --source hf_daily --branch arxiv --branch venue | |
| # DailyPaper(含 LLM + Judge + 推送) | |
| python -m paperbot.presentation.cli.main daily-paper \ | |
| -q "ICL压缩" -q "KV Cache加速" \ | |
| --with-llm --llm-feature summary --llm-feature trends --llm-feature insight \ | |
| --with-judge --judge-runs 2 --judge-max-items 5 \ | |
| --save --notify --notify-channel email | |
| ``` | |
| ## 目录结构 | |
| ```text | |
| PaperBot/ | |
| ├── src/paperbot/ | |
| │ ├── agents/ # Agents(研究/代码/评审/验证/追踪) | |
| │ ├── api/ # FastAPI 后端(SSE 流式) | |
| │ │ ├── routes/ # 业务路由(track/analyze/paperscool/model_endpoints/...) | |
| │ │ └── streaming.py # SSE 流式 envelope | |
| │ ├── application/ | |
| │ │ ├── ports/ # 端口接口(PaperSearchPort/EnrichmentPort/FeedbackPort/...) | |
| │ │ ├── services/ # 应用服务(LLM/PaperSearch/Enrichment/Identity/Provider) | |
| │ │ └── workflows/ | |
| │ │ ├── unified_topic_search.py # 统一主题检索(多源聚合 + min_score) | |
| │ │ ├── dailypaper.py # 日报生成、LLM 增强、Judge 评分 | |
| │ │ └── analysis/ # Judge / Trend / Summarizer / Relevance | |
| │ ├── core/ # 核心抽象(pipeline/errors/DI) | |
| │ ├── domain/ # 领域模型(Paper/Scholar/Track/Feedback/Enrichment/Identity) | |
| │ ├── infrastructure/ | |
| │ │ ├── adapters/ # 搜索适配器(arXiv/S2/OpenAlex/papers.cool/HF Daily) | |
| │ │ ├── connectors/ # 数据源连接器(arXiv/OpenAlex/HF/Reddit/X/Zotero/papers.cool) | |
| │ │ ├── harvesters/ # 批量收割器(arXiv/OpenAlex/S2) | |
| │ │ ├── crawling/ # HTTP 下载器、请求层、解析器 | |
| │ │ ├── llm/ # ModelRouter(多提供商路由) | |
| │ │ ├── stores/ # SQLAlchemy 存储(Paper/Research/ModelEndpoint/LLMUsage/Keychain/...) | |
| │ │ └── queue/ # ARQ Worker(定时任务 + DailyPaper Cron) | |
| │ ├── memory/ # 记忆中间件(导入/抽取/检索) | |
| │ ├── context_engine/ # Context Engine(Track Router / 推荐) | |
| │ ├── presentation/ # CLI 入口与 Markdown 报告渲染 | |
| │ ├── utils/ # 工具(secret 加密、文本处理) | |
| │ └── repro/ # Paper2Code(Blueprint/CodeMemory/RAG/Debugger) | |
| ├── web/ # Next.js Web Dashboard | |
| ├── cli/ # Ink/React Terminal UI | |
| ├── alembic/ # DB 迁移脚本 | |
| ├── docs/ # 项目文档 | |
| ├── config/ # 配置(models/venues/subscriptions) | |
| ├── tests/ # 测试 | |
| ├── asset/ # 截图 + 架构图(drawio / excalidraw) | |
| ├── pyproject.toml # Python 项目配置 | |
| └── env.example # 环境变量模板 | |
| # Deep review | |
| python main.py review --title "..." --abstract "..." | |
| # Scholar tracking | |
| python -m paperbot.presentation.cli.main track --summary | |
| # Paper2Code | |
| python -m paperbot.presentation.cli.main gen-code --title "..." --abstract "..." --output-dir ./output | |
| # Deep review | |
| python -m paperbot.presentation.cli.main review --title "..." --abstract "..." |
There was a problem hiding this comment.
Pull request overview
This PR updates the project’s top-level documentation to present PaperBot more clearly (hero + badges + structured feature list + collapsible screenshots) and streamlines the onboarding/contributing sections.
Changes:
- Major README restructure (shorter, more scannable layout with sections for Features, Getting Started, Architecture, Roadmap).
- Updated CLI examples and configuration snippets (LLM routing + push notifications).
- Added/updated contribution guidance and documentation links.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
| **Environment variables:** | ||
| ```bash | ||
| # 总开关 | ||
| PAPERBOT_NOTIFY_ENABLED=true # 是否启用推送(必须为 true 才能发送) | ||
| PAPERBOT_NOTIFY_CHANNELS=email,slack # 启用的推送渠道(逗号分隔) | ||
|
|
||
| # Email (SMTP) — 必须配置才能发送邮件 | ||
| PAPERBOT_NOTIFY_SMTP_HOST=smtp.qq.com # SMTP 服务器地址 | ||
| PAPERBOT_NOTIFY_SMTP_PORT=587 # SMTP 端口(587=STARTTLS, 465=SSL) | ||
| PAPERBOT_NOTIFY_SMTP_USERNAME=your@qq.com # SMTP 登录用户名 | ||
| PAPERBOT_NOTIFY_SMTP_PASSWORD=your-auth-code # SMTP 密码或授权码 | ||
| PAPERBOT_NOTIFY_SMTP_USE_TLS=true # 是否使用 STARTTLS(端口 587 时为 true) | ||
| PAPERBOT_NOTIFY_SMTP_USE_SSL=false # 是否使用 SSL(端口 465 时为 true) | ||
| PAPERBOT_NOTIFY_EMAIL_FROM=your@qq.com # 发件人地址 | ||
| PAPERBOT_NOTIFY_EMAIL_TO=recipient@example.com # 默认收件人(可被 UI 覆盖) | ||
|
|
||
| # Slack | ||
| PAPERBOT_NOTIFY_SLACK_WEBHOOK_URL=https://hooks.slack.com/... | ||
|
|
||
| # 钉钉(支持签名验证) | ||
| PAPERBOT_NOTIFY_DINGTALK_WEBHOOK_URL=https://oapi.dingtalk.com/robot/send?access_token=... | ||
| PAPERBOT_NOTIFY_DINGTALK_SECRET=SEC... | ||
|
|
||
| # DailyPaper 定时任务(ARQ Worker) | ||
| PAPERBOT_DAILYPAPER_ENABLED=true | ||
| PAPERBOT_DAILYPAPER_CRON_HOUR=8 | ||
| PAPERBOT_DAILYPAPER_CRON_MINUTE=30 | ||
| PAPERBOT_DAILYPAPER_NOTIFY_ENABLED=true | ||
| PAPERBOT_DAILYPAPER_NOTIFY_CHANNELS=email,slack | ||
| PAPERBOT_NOTIFY_ENABLED=true | ||
| PAPERBOT_NOTIFY_CHANNELS=email,slack | ||
| PAPERBOT_NOTIFY_SMTP_HOST=smtp.qq.com | ||
| PAPERBOT_NOTIFY_SMTP_PORT=587 | ||
| PAPERBOT_NOTIFY_SMTP_USERNAME=your@qq.com | ||
| PAPERBOT_NOTIFY_SMTP_PASSWORD=your-auth-code | ||
| PAPERBOT_NOTIFY_EMAIL_FROM=your@qq.com | ||
| PAPERBOT_NOTIFY_EMAIL_TO=recipient@example.com | ||
| ``` |
There was a problem hiding this comment.
The push notification env var snippet omits several supported settings that DailyPushService.from_env() reads (e.g., PAPERBOT_NOTIFY_SMTP_USE_TLS, PAPERBOT_NOTIFY_SMTP_USE_SSL, PAPERBOT_NOTIFY_SLACK_WEBHOOK_URL, PAPERBOT_NOTIFY_DINGTALK_*). Since the README suggests configuring push via env vars, this example is likely incomplete/misleading. Consider adding the missing variables (or explicitly stating they’re optional and what defaults are used).
| ```bash | ||
| # Run tests | ||
| pytest -q | ||
|
|
||
| # Format | ||
| python -m black . && python -m isort . | ||
| ``` |
There was a problem hiding this comment.
The contributing section shows running pytest, black, and isort, but the earlier install instructions don’t mention installing dev tools (e.g., pip install -e ".[dev]"). As written, contributors following the README may not have these commands available. Please add a short note on installing dev dependencies before running tests/formatters.
|
|
||
| ```bash | ||
| python -m venv .venv && source .venv/bin/activate | ||
| pip install -e . |
There was a problem hiding this comment.
The install instructions use pip install -e ., but the package metadata in pyproject.toml does not include core runtime deps like fastapi/uvicorn (they’re only in requirements.txt). Following these steps will fail at python -m uvicorn ... due to missing dependencies. Please either (a) change the README to install from requirements.txt (or pip install -r requirements.txt after the editable install), or (b) add the missing runtime dependencies to pyproject.toml so pip install -e . is sufficient.
| pip install -e . | |
| pip install -e . | |
| pip install -r requirements.txt |
| <img src="https://img.shields.io/badge/python-3.10%2B-blue" alt="Python 3.10+"> | ||
| <img src="https://img.shields.io/badge/Next.js-16-black" alt="Next.js 16"> |
There was a problem hiding this comment.
The README badge advertises Python 3.10+, but pyproject.toml currently declares requires-python = ">=3.8". Please align the README with the actual supported Python version (either update the badge/text or update the project’s declared minimum version) to avoid confusing users.
Summary
project_dir+ runbook allowed-dir)Changes
README.mdTest plan
🤖 Generated with Claude Code
Summary by CodeRabbit