Releases: O0000-code/paper-search-pro
Release list
v2.3.0
v2.3.0
Native-Chinese literature search, routing by judgment instead of keywords, and an agent-mode rebuild — while an English run that doesn't use the new features renders byte-for-byte as before, with still no new hard dependencies.
🇨🇳 Native-Chinese search (the headline)
Chinese queries now retrieve Chinese literature directly, not a translated-to-English approximation.
- Two new self-contained sources — pure HTTP, no login, no scraping of closed databases:
- NSSD (国家哲学社会科学文献中心) for social sciences & humanities — including CSSCI flagships like 《经济研究》 that the international open sources index zero of.
- yiigle (中华医学期刊全文数据库) for medicine — native-Chinese titles + abstracts + DOIs largely absent from OpenAlex / CrossRef / PubMed.
- One control:
search_language: auto | en | zh | both. A Chinese query is no longer force-translated to English; the skill asks once (and can remember your default). NSSD/yiigle route automatically by discipline; OpenAlex stays the multilingual baseline (it's not "the English source"). - Honest boundary: closed databases (CNKI / 万方 / 维普) are deliberately not scraped, for compliance — so the skill tells you when a topic (e.g. CNKI-exclusive psychology journals like 《心理学报》) needs a manual CNKI follow-up, rather than pretending full coverage.
🧭 Routing by judgment, not keywords
- Source routing is reframed from "keyword X → enable source Y" to the agent judging the query's domain — keyword lists are now calibration examples, not triggers.
- AI / CS queries default to Semantic Scholar as the primary engine (measured: OpenAlex has no clean record for landmark papers like Attention Is All You Need, and undercounts 2025 citations by 20–250×). Transient
--primary-sourcefor headless callers; needs an SS key, else it stays on OpenAlex.
🤖 Agent mode: a recipe, not a black box
agent_mode.md is rebuilt around one principle: the deterministic heuristic is a floor, not a ceiling. The calling agent — being an LLM — is guided to do relevance / domain / language judgment inline to reach the same quality as the human 14-step path (the RCS rubric is handed over; saturation-iteration and citation-chasing are spelled out). New flags: --lang, --with-nssd / --with-yiigle, --primary-source, plus a structured meta.language block.
🛠 Under the hood
- Fixed a latent journal-rank bug: the federated resolver dropped
issn, so the CAS/JCR/SJR ISSN-join was annotating ~0 papers — now merged and serialized (all sources benefit). - Chinese-native title / authors are preserved when a record collides on DOI with an English OpenAlex record.
- CJK 2-gram coverage so the headless relevance floor is query-grounded for Chinese too.
✅ Quality
A 4-dimension expert review + an independent Codex code review surfaced 6 P1s — all fixed and re-reviewed to a clean pass — then a blind end-to-end test on four real research tasks confirmed NSSD returns 《经济研究》, yiigle returns 中华系列 medicine, routing is correct, and the honest coverage disclosure emerges on its own.
Compatibility
- No behavior change to an English run that doesn't use the new features — byte-for-byte identical.
- No new hard dependencies; Chinese partition/source data is never bundled.
Full changelog: v2.2.0...v2.3.0
v2.2.0
v2.2.0
The biggest feature drop since v2.1 — journal partitions in the report, a switchable primary source, a headless mode for agent-to-agent use, plus two reliability fixes. The human 14-step workflow is unchanged when the new capabilities aren't used, and there are no new hard dependencies.
✨ Journal partitions — 中科院 / JCR / SJR
Every paper is now tagged with its journal tier across three systems:
- On each card / row — a quiet single badge (your preferred platform).
- In the detail panel — the full three-platform breakdown (中科院 tier + Top, JCR quartile + impact factor, SJR quartile) with source attribution.
- In the toolbar — a zone filter to keep only
Q1 / ≥Q2 / ≥Q3(or一区 / ≥二区for 中科院). Ask in natural language ("只要一区二区的", "Q1 only") and the request is parsed as a filter, not a search term.
Partition tables are fetched at runtime from public mirrors — never bundled — and attributed; only JCR's figure is labelled an impact factor.
🔀 Primary source — by preference, and by fallback
Two independent capabilities from one setting:
- Pick your primary. OpenAlex is the default; set Semantic Scholar as the primary source instead when its corpus or field coverage suits your topic better.
- Automatic quota fallback. When the active primary runs low on its daily quota (or starts erroring), the run continues on the other source rather than stopping — a depleted key degrades gracefully instead of halting the search.
🤖 Headless mode for agents
When the consumer is another agent rather than a person, scripts/agent_search.py runs the deterministic core in a single command and returns one structured JSON envelope — deduped, relevance-scored, saturation-checked, partition-annotated — with no HTML and no classification SubAgents. Same search discipline, machine-readable output.
🛠 Reliability
prisma_s_loggerno longer crashes on the documented single-dictcurve.json(it silently dropped the snapshot and left coverage at 0). — thanks to @MatrixA (#2)rcs_parsernow applies RCS scores from batches keyed by canonical_key, not justentity.paper_id— previously those scores were silently discarded. — @MatrixA (#2), extended here to the raw-response path.- Regression tests added for both.
Compatibility
- No behavior change to a run that doesn't use partitions / source-switching / headless mode — the report renders byte-for-byte as before.
- No new hard dependencies.
Full changelog: v2.1.2...v2.2.0
v2.1.2 — Cross-agent install + OpenAlex API key requirement
Patch release — cross-agent install + OpenAlex API key requirement
Three changes since v2.1.1. The OpenAlex item is the one that may require action on existing setups; the rest are additive or behavior fixes. The search pipeline, helper scripts, RCS rubric, and output structure are unchanged — Claude Code users see no difference in behavior.
1. ⚠️ OpenAlex now requires a free API key (action may be needed)
OpenAlex deprecated the mailto= polite pool on 2026-02-13; all API calls now require a free API key. A config that only set openalex_email will stop working against live OpenAlex.
What to do: grab a free key at https://openalex.org/settings/api (instant, no approval) and set openalex_api_key in ~/.paper-search-pro/config.yaml. The free tier is $1/day ≈ 10k list calls / 1k searches — a Standard-tier run uses ~200 calls, so this is plenty. Setup docs, config template, verification scripts, and READMEs all updated to reflect the new requirement; openalex_email is kept as a deprecated/ignored field for backward-compatible configs.
2. Cross-agent install support via $PSP_HOME
The Skill claimed to work on "Claude Code, Codex, any SKILL.md agent," but 22 hardcoded ~/.claude/skills/paper-search-pro paths meant it only really ran under Claude Code. Every invocation now uses $PSP_HOME, resolved once in STEP 0 via a three-layer chain:
- Explicit injection — the agent substitutes the SKILL.md directory it was given
- Env var —
CLAUDE_SKILL_DIR/CODEBUDDY_SKILL_DIR - Filesystem fallback — walks known install locations:
~/.claude/skills,~/.codex/skills,~/.agents/skills,~/.config/opencode/skills,~/.codeium/windsurf/skills,~/.config/goose/skills,~/.cline/skills,~/.roo/skills,~/.copilot/skills, plus project-local equivalents
Classifier SubAgent prompts (STEP 6) now pass the expanded absolute rubric path, since each SubAgent runs in its own shell where $PSP_HOME isn't exported. READMEs list the per-agent install paths up front.
3. Japanese / Korean queries route to the English UI (not Chinese)
The old detector sent every CJK character to the Chinese UI — so a Japanese or Korean query produced a Chinese interface, friendly to neither audience. New logic checks hiragana/katakana (U+3041–U+30FF) first → English; then CJK Unified Ideographs → Chinese; Korean Hangul and everything else → English (the international default). Paper titles / abstracts / authors are never translated regardless — only the report UI chrome.
Verification
Both changes were checked by two read-only subagent test passes: the $PSP_HOME resolver behaves correctly across all four scenarios (explicit / env var / fallback / not-found), the language regex routes six representative queries correctly (including the previously-misrouted kanji+hiragana mix 東京大学の最新研究 → EN), all 25 bash blocks pass bash -n, and no hardcoded install paths remain outside legitimate fallback lists and prose examples.
What's NOT changed
- Search pipeline, tier logic, saturation curve, citation chasing — untouched
- Python helper behavior, RCS rubric content, PRISMA-S logger — untouched
- Output file structure (HTML / MD / BibTeX / RIS / CSV / PRISMA-S log) — unchanged
- Claude Code user experience —
$PSP_HOMEauto-resolves to~/.claude/skills/paper-search-proexactly as before
v2.1.1 — Safari print compatibility fixes
Patch release — Safari print rendering fixes
This release improves print fidelity, especially for Safari users, with three coordinated @media print improvements. Screen view is byte-identical to v2.1.0 across all changes — every rule lives inside @media print.
1. Safari-only hero zoom compensation
Safari WebKit silently ignores @page { size: 1240px 1754px } (WebKit Bug #250685, MDN BCD #28626) and falls back to A4 default. The SwissTop hero (designed at maxWidth: 1240) was printing 1.57x larger physically than Chrome's equivalent.
Fix: A new safari-detect.ts module UA-tags <html> with .is-safari at load. A scoped print rule then uses width: 1240px !important; zoom: 0.64 to force layout at design width and visually scale down — restoring physical parity with Chrome without touching any font, padding, or grid primitive in SwissTop.
2. Paper list left-edge alignment in print
Section names (FOUNDATIONAL / HIGH / ...) and #NN rank prefixes now sit flush at the container left edge, aligned vertically with FINDINGS / FILTER tabs above. Uses :has() (Safari 15.4+, Chrome 105+, Firefox 121+). The TierDot color bullet is hidden in print only; on-screen it remains as a visual hierarchy marker.
3. Browser-injected URL / title / date / page-number suppression
Added CSS Paged Media Module Level 3 §6 @top-* / @bottom-* margin-box content overrides. Result:
| Browser | Status |
|---|---|
| Chrome 105+ / Edge 105+ / Firefox 99+ | 🟢 Auto-suppressed (zero user action) |
| Safari (all versions) | 🟡 Untick "Print headers and footers" once in print dialog — Safari remembers per-host indefinitely |
Safari WebKit doesn't honor margin-box content override yet, but its per-host setting persistence makes the one-time user action negligible.
Other
- Pre-existing responsive
@media (max-width: 860px)/(max-width: 480px)blocks now scoped toscreen and ...so they don't accidentally fire in Chrome's narrower print viewport.
What's NOT changed
- Search pipeline, helper scripts, RCS rubric, PRISMA-S logger, classifier prompt — all untouched
- React component tree — only
main.tsxadds a singledetectSafari()call - Screen layout — byte-identical to v2.1.0 on every browser
- Skill API, CLI flags, output file structure — all backwards-compatible
Upgrade
Re-install the Skill (or git pull if local clone) — no migration steps required.
Full Changelog: v2.1.0...v2.1.1
v2.1.0 — Initial release
Multi-source academic literature discovery as a Skill — for Claude Code, Codex, and any agent that loads the SKILL.md format.
Highlights
- 14-step recipe in
SKILL.mddrives every run - Five sources with smart routing: OpenAlex (primary) · PubMed (medical / MeSH) · arXiv (preprint freshness) · Semantic Scholar (influential citations) · CrossRef (funder · license · CT#)
- Four tiers: Quick (5–8 min) · Standard (10–17 min) · Deep (30–45 min) · Audit (2–3 hr)
- Single-file HTML report — Shadcn aesthetic, three tabs (Findings · Methods · Audit), three hero layouts (Swiss · Editorial · Document), two list densities (Catalog · Index), responsive at 860 px, bilingual UI (EN / 中文 auto-selected from query language), Noto Sans SC inlined, fully offline
- PRISMA-S 16-item disclosure log for reproducibility
- No third-party LLM keys — your agent is the LLM; classification via parallel Inline SubAgents (up to 5 per round)
- Exports:
report.html·report.md·papers.csv·papers.bib(BibTeX) ·papers.ris·papers.json·execution_log.json·summary.md
Live demo
→ https://o0000-code.github.io/paper-search-pro/
Install
git clone https://github.com/O0000-code/paper-search-pro.git \
~/.claude/skills/paper-search-pro
python3 -m pip install -r ~/.claude/skills/paper-search-pro/scripts/requirements.txtFive free API keys (~15 min total) — see references/setup.md.
License
Apache License 2.0 — see LICENSE.txt · NOTICE.md · THIRD_PARTY.md.
Vendored from futurehouse/paper-qa (Apache 2.0).