research-scan 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. research_scan-0.5.0/.claude-plugin/plugin.json +5 -0
  2. research_scan-0.5.0/.env.example +23 -0
  3. research_scan-0.5.0/.github/workflows/release.yml +83 -0
  4. research_scan-0.5.0/.gitignore +26 -0
  5. research_scan-0.5.0/.python-version +1 -0
  6. research_scan-0.5.0/AGENTS.md +542 -0
  7. research_scan-0.5.0/CHANGELOG.md +240 -0
  8. research_scan-0.5.0/CITATION.cff +24 -0
  9. research_scan-0.5.0/CODE_OF_CONDUCT.md +84 -0
  10. research_scan-0.5.0/CONTRIBUTING.md +76 -0
  11. research_scan-0.5.0/LICENSE +201 -0
  12. research_scan-0.5.0/PKG-INFO +16 -0
  13. research_scan-0.5.0/README.md +409 -0
  14. research_scan-0.5.0/SECURITY.md +38 -0
  15. research_scan-0.5.0/THIRD_PARTY_LICENSES.md +40 -0
  16. research_scan-0.5.0/docs/measurements.md +938 -0
  17. research_scan-0.5.0/eval/briefs/llm-lit-search.md +51 -0
  18. research_scan-0.5.0/eval/golden/TOPIC3-PLACEHOLDER.yaml +45 -0
  19. research_scan-0.5.0/eval/golden/defaults-savings.yaml +175 -0
  20. research_scan-0.5.0/eval/golden/llm-lit-search.yaml +121 -0
  21. research_scan-0.5.0/eval/judge-prompt.md +103 -0
  22. research_scan-0.5.0/eval/judge.sh +73 -0
  23. research_scan-0.5.0/eval/results/.gitkeep +0 -0
  24. research_scan-0.5.0/eval/results/2026-08-19-defaults-savings.json +100 -0
  25. research_scan-0.5.0/eval/results/2026-08-19-llm-lit-search.json +100 -0
  26. research_scan-0.5.0/pyproject.toml +54 -0
  27. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/README.md +1 -0
  28. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/brief.md +20 -0
  29. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/candidates.json +30621 -0
  30. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/coverage.json +267 -0
  31. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/evidence.bib +124 -0
  32. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/evidence.json +2053 -0
  33. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/evidence.md +256 -0
  34. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/expanded.json +148 -0
  35. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/expansion.log.jsonl +37 -0
  36. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/manifest.json +137 -0
  37. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/queries.json +100 -0
  38. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/ranked.json +1735 -0
  39. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/retrieval.log.jsonl +33 -0
  40. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/01.json +257 -0
  41. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/02.json +257 -0
  42. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/03.json +257 -0
  43. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/04.json +257 -0
  44. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/05.json +257 -0
  45. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/06.json +257 -0
  46. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/07.json +257 -0
  47. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/08.json +257 -0
  48. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/09.json +257 -0
  49. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/10.json +257 -0
  50. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/x01.json +257 -0
  51. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/x02.json +257 -0
  52. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/x03.json +257 -0
  53. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/x04.json +257 -0
  54. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen-batches/x05.json +140 -0
  55. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/screen.json +2525 -0
  56. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/shortlist.json +4085 -0
  57. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-mcp-transport/verify.log.jsonl +50 -0
  58. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/README.md +1 -0
  59. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/brief.md +20 -0
  60. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/candidates.json +48079 -0
  61. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/coverage.json +559 -0
  62. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/evidence.bib +126 -0
  63. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/evidence.json +1934 -0
  64. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/evidence.md +256 -0
  65. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/expanded-round2.json +124 -0
  66. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/expanded.json +148 -0
  67. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/expansion-r2.log.jsonl +17 -0
  68. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/expansion.log.jsonl +37 -0
  69. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/manifest.json +192 -0
  70. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/queries.json +129 -0
  71. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/ranked.json +1811 -0
  72. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/retrieval-r2.log.jsonl +22 -0
  73. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/retrieval.log.jsonl +33 -0
  74. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/01.json +257 -0
  75. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/02.json +257 -0
  76. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/03.json +257 -0
  77. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/04.json +257 -0
  78. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/05.json +257 -0
  79. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/06.json +257 -0
  80. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/07.json +257 -0
  81. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/08.json +257 -0
  82. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/09.json +257 -0
  83. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/10.json +257 -0
  84. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r01.json +257 -0
  85. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r02.json +257 -0
  86. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r03.json +257 -0
  87. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r04.json +257 -0
  88. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r05.json +257 -0
  89. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r06.json +257 -0
  90. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r07.json +257 -0
  91. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/r08.json +77 -0
  92. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/x01.json +257 -0
  93. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/x02.json +257 -0
  94. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/x03.json +257 -0
  95. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/x04.json +257 -0
  96. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/x05.json +140 -0
  97. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/xr01.json +257 -0
  98. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/xr02.json +257 -0
  99. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/xr03.json +257 -0
  100. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen-batches/xr04.json +257 -0
  101. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/screen.json +4446 -0
  102. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/shortlist.json +3995 -0
  103. research_scan-0.5.0/research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/verify.log.jsonl +52 -0
  104. research_scan-0.5.0/research-scan-v1-spec.md +385 -0
  105. research_scan-0.5.0/skills/research-scan/SKILL.md +74 -0
  106. research_scan-0.5.0/skills/research-scan/examples/brief.example.md +63 -0
  107. research_scan-0.5.0/skills/research-scan/examples/brief.research-example.md +68 -0
  108. research_scan-0.5.0/skills/research-scan/examples/queries.example.json +90 -0
  109. research_scan-0.5.0/skills/research-scan/references/plan-rubric.md +268 -0
  110. research_scan-0.5.0/skills/research-scan/references/rerank-rubric.md +162 -0
  111. research_scan-0.5.0/skills/research-scan/references/schemas.md +703 -0
  112. research_scan-0.5.0/skills/research-scan/references/screen-rubric.md +112 -0
  113. research_scan-0.5.0/src/research_scan/__init__.py +20 -0
  114. research_scan-0.5.0/src/research_scan/cli.py +1245 -0
  115. research_scan-0.5.0/src/research_scan/config.py +271 -0
  116. research_scan-0.5.0/src/research_scan/coverage.py +276 -0
  117. research_scan-0.5.0/src/research_scan/dedup.py +317 -0
  118. research_scan-0.5.0/src/research_scan/doctor.py +551 -0
  119. research_scan-0.5.0/src/research_scan/evalrun.py +421 -0
  120. research_scan-0.5.0/src/research_scan/expand.py +388 -0
  121. research_scan-0.5.0/src/research_scan/http.py +494 -0
  122. research_scan-0.5.0/src/research_scan/log.py +131 -0
  123. research_scan-0.5.0/src/research_scan/mcp_server.py +1158 -0
  124. research_scan-0.5.0/src/research_scan/profiles.py +55 -0
  125. research_scan-0.5.0/src/research_scan/render.py +258 -0
  126. research_scan-0.5.0/src/research_scan/retrieve.py +636 -0
  127. research_scan-0.5.0/src/research_scan/run.py +282 -0
  128. research_scan-0.5.0/src/research_scan/schema.py +1297 -0
  129. research_scan-0.5.0/src/research_scan/select.py +406 -0
  130. research_scan-0.5.0/src/research_scan/shortlist.py +108 -0
  131. research_scan-0.5.0/src/research_scan/sources/__init__.py +2 -0
  132. research_scan-0.5.0/src/research_scan/sources/arxiv.py +176 -0
  133. research_scan-0.5.0/src/research_scan/sources/base.py +72 -0
  134. research_scan-0.5.0/src/research_scan/sources/crossref.py +145 -0
  135. research_scan-0.5.0/src/research_scan/sources/openalex.py +281 -0
  136. research_scan-0.5.0/src/research_scan/sources/pubmed.py +2 -0
  137. research_scan-0.5.0/src/research_scan/sources/s2.py +335 -0
  138. research_scan-0.5.0/src/research_scan/verify.py +294 -0
  139. research_scan-0.5.0/tests/conftest.py +210 -0
  140. research_scan-0.5.0/tests/fixtures/arxiv-search.atom.xml +386 -0
  141. research_scan-0.5.0/tests/fixtures/openalex_defaults.json +2550 -0
  142. research_scan-0.5.0/tests/fixtures/openalex_nudge.json +2190 -0
  143. research_scan-0.5.0/tests/fixtures/s2_defaults.json +109 -0
  144. research_scan-0.5.0/tests/fixtures/s2_nudge.json +112 -0
  145. research_scan-0.5.0/tests/skill_triggers.md +89 -0
  146. research_scan-0.5.0/tests/test_cli_completion.py +67 -0
  147. research_scan-0.5.0/tests/test_cli_configure.py +210 -0
  148. research_scan-0.5.0/tests/test_cli_s1.py +627 -0
  149. research_scan-0.5.0/tests/test_cli_s2.py +622 -0
  150. research_scan-0.5.0/tests/test_cli_s4.py +494 -0
  151. research_scan-0.5.0/tests/test_config.py +226 -0
  152. research_scan-0.5.0/tests/test_coverage.py +224 -0
  153. research_scan-0.5.0/tests/test_dedup.py +261 -0
  154. research_scan-0.5.0/tests/test_doctor.py +322 -0
  155. research_scan-0.5.0/tests/test_eval.py +661 -0
  156. research_scan-0.5.0/tests/test_expand.py +663 -0
  157. research_scan-0.5.0/tests/test_http.py +309 -0
  158. research_scan-0.5.0/tests/test_mcp.py +939 -0
  159. research_scan-0.5.0/tests/test_retrieve.py +604 -0
  160. research_scan-0.5.0/tests/test_schema.py +483 -0
  161. research_scan-0.5.0/tests/test_select.py +734 -0
  162. research_scan-0.5.0/tests/test_shortlist.py +143 -0
  163. research_scan-0.5.0/tests/test_sources.py +468 -0
  164. research_scan-0.5.0/tests/test_verify.py +571 -0
  165. research_scan-0.5.0/uv.lock +1742 -0
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "research-scan",
3
+ "version": "0.5.0",
4
+ "description": "Find the 5–10 recent papers with the highest impact on a research question, topic, or project. Multi-query scholarly retrieval (OpenAlex, Semantic Scholar, arXiv), citation-graph expansion, rubric-based screening and reranking, DOI verification."
5
+ }
@@ -0,0 +1,23 @@
1
+ # research-scan credentials.
2
+ #
3
+ # Copy to ~/.config/research-scan/.env (preferred — works from any directory once
4
+ # `uv tool install` has put the CLI on PATH), or to ./.env for repo-local dev.
5
+ #
6
+ # Precedence, highest first: process environment > ~/.config/research-scan/.env > ./.env
7
+ #
8
+ # Only OPENALEX_API_KEY is mandatory (`research-scan doctor` exits 3 without it).
9
+
10
+ # Mandatory. Free key, ~$1/day free allowance: https://openalex.org/
11
+ OPENALEX_API_KEY=
12
+
13
+ # Strongly recommended: raises the OpenAlex rate limit to 5 req/s and puts you in
14
+ # the Crossref polite pool (sent in the User-Agent). Not a secret.
15
+ OPENALEX_MAILTO=
16
+
17
+ # Optional. Free key, 1 req/s: https://www.semanticscholar.org/product/api
18
+ # Without it, Semantic Scholar is throttled to ~0.3 req/s and doctor WARNs.
19
+ S2_API_KEY=
20
+
21
+ # Optional. Raises NCBI E-utilities from 3 req/s to 10 req/s. Only matters once the PubMed
22
+ # source is built — `biomed` routes to it today but it is recorded as unavailable.
23
+ NCBI_API_KEY=
@@ -0,0 +1,83 @@
1
+ name: release
2
+
3
+ # Tags only. Nothing here runs on a push to main or on a pull request, so the
4
+ # publish path cannot be reached except by cutting a tag.
5
+ on:
6
+ push:
7
+ tags:
8
+ - "v*"
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ steps:
16
+ - uses: actions/checkout@v7
17
+
18
+ - uses: astral-sh/setup-uv@v10.0.1
19
+ with:
20
+ enable-cache: true
21
+
22
+ - name: Install the locked dependency set
23
+ run: uv sync --locked
24
+
25
+ - name: Lint
26
+ run: uv run ruff check
27
+
28
+ - name: Test
29
+ run: uv run pytest
30
+
31
+ # The tag is the release's only claim about which version this is, and
32
+ # importlib.metadata reads the version out of the built distribution. If the
33
+ # two disagree, the published artifact would carry a version nobody tagged.
34
+ - name: Tag must match the package version
35
+ run: |
36
+ tag_version="${GITHUB_REF_NAME#v}"
37
+ pyproject_version="$(uv run python -c 'import tomllib,pathlib; print(tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"])')"
38
+ echo "tag: ${GITHUB_REF_NAME} (version ${tag_version})"
39
+ echo "pyproject: ${pyproject_version}"
40
+ if [ "${tag_version}" != "${pyproject_version}" ]; then
41
+ echo "::error title=Version mismatch::tag ${GITHUB_REF_NAME} does not match pyproject.toml version ${pyproject_version}. Bump pyproject.toml or retag; do not publish this build."
42
+ exit 1
43
+ fi
44
+
45
+ - name: Build
46
+ run: uv build
47
+
48
+ # The repo passing its own tests is not evidence the artifact works. Install the
49
+ # wheel somewhere that has none of the source tree on the path and run it.
50
+ - name: Smoke-test the built wheel
51
+ run: |
52
+ python3 -m venv /tmp/smoke
53
+ /tmp/smoke/bin/pip install --quiet --upgrade pip
54
+ /tmp/smoke/bin/pip install --quiet dist/*.whl
55
+ installed_version="$(/tmp/smoke/bin/research-scan --version)"
56
+ echo "wheel reports: ${installed_version}"
57
+ if [ "${installed_version}" != "${GITHUB_REF_NAME#v}" ]; then
58
+ echo "::error title=Wheel version mismatch::installed wheel reports ${installed_version}, expected ${GITHUB_REF_NAME#v}"
59
+ exit 1
60
+ fi
61
+
62
+ - uses: actions/upload-artifact@v7
63
+ with:
64
+ name: dist
65
+ path: dist/
66
+ if-no-files-found: error
67
+
68
+ publish:
69
+ needs: build
70
+ runs-on: ubuntu-latest
71
+ environment: pypi
72
+ permissions:
73
+ # The only credential this job gets. There is no API token anywhere in this
74
+ # workflow or in the repository's secrets: PyPI Trusted Publishing exchanges
75
+ # this short-lived OIDC token for an upload token at publish time.
76
+ id-token: write
77
+ steps:
78
+ - uses: actions/download-artifact@v8
79
+ with:
80
+ name: dist
81
+ path: dist/
82
+
83
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,26 @@
1
+ .env
2
+ .venv/
3
+ __pycache__/
4
+ *.pyc
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ eval/results/*
8
+ !eval/results/.gitkeep
9
+ # The documented V1 acceptance run. Narrow negation on purpose — ad-hoc result files stay out.
10
+ !eval/results/2026-08-19-defaults-savings.json
11
+ !eval/results/2026-08-19-llm-lit-search.json
12
+
13
+ .DS_Store
14
+
15
+ # Scan outputs — runs are local artefacts, not repo content.
16
+ # Excluded per level rather than as `research/`: git will not descend into an excluded directory,
17
+ # so a negation inside one never fires. Narrow, the same way eval/results keeps only its
18
+ # documented acceptance runs — here, the two transport runs behind the v0.4.0 tag.
19
+ research/*
20
+ !research/scans/
21
+ research/scans/*
22
+ !research/scans/2026-08-20-agentic-lit-search-mcp-transport/
23
+ !research/scans/2026-08-20-agentic-lit-search-orientation-mcp-transport/
24
+
25
+ # Built skill package — a build artefact, rebuilt from skills/research-scan/
26
+ dist/
@@ -0,0 +1 @@
1
+ 3.13