medsci-skills 5.0.0 → 5.2.0
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.
- package/metadata/distribution_files.json +82 -22
- package/metadata/distribution_manifest.json +1 -1
- package/package.json +1 -1
- package/skills/fulltext-retrieval/SKILL.md +52 -5
- package/skills/fulltext-retrieval/fetch_oa.py +293 -74
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/expected/projection.json +14 -0
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/extracted_text.json +4 -0
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/results.json +6 -0
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/run_challenge.py +86 -0
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/verify.sh +6 -0
- package/skills/fulltext-retrieval/fetch_oa_report_challenge/worklist.tsv +5 -0
- package/skills/fulltext-retrieval/references/find_available_pdf.js +82 -0
- package/skills/fulltext-retrieval/skill.yml +7 -2
- package/skills/lit-sync/SKILL.md +86 -6
- package/skills/lit-sync/skill.yml +3 -1
- package/skills/mllm-eval/SKILL.md +8 -0
- package/skills/mllm-eval/references/evaluation_axes.md +161 -0
- package/skills/model-evaluation/SKILL.md +12 -0
- package/skills/model-evaluation/references/metric_selection_grounding.md +139 -0
- package/skills/model-evaluation/scripts/check_metric_reporting.py +1 -1
- package/skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_good_wrapped.md +5 -0
- package/skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_no_iou.md +4 -0
- package/skills/model-evaluation/scripts/metric_reporting_challenge/verify.sh +6 -1
- package/skills/model-validation/SKILL.md +6 -0
- package/skills/model-validation/references/validation_design.md +150 -0
- package/skills/search-lit/SKILL.md +22 -67
|
@@ -1488,23 +1488,58 @@
|
|
|
1488
1488
|
},
|
|
1489
1489
|
{
|
|
1490
1490
|
"path": "skills/fulltext-retrieval/SKILL.md",
|
|
1491
|
-
"size":
|
|
1492
|
-
"sha256": "
|
|
1491
|
+
"size": 8248,
|
|
1492
|
+
"sha256": "d97c19a64d92f66e3c8a1445d893c0f55364f21dc99404fb6f012a3566556e73"
|
|
1493
1493
|
},
|
|
1494
1494
|
{
|
|
1495
1495
|
"path": "skills/fulltext-retrieval/fetch_oa.py",
|
|
1496
|
-
"size":
|
|
1497
|
-
"sha256": "
|
|
1496
|
+
"size": 24503,
|
|
1497
|
+
"sha256": "768f95a30737e67b7f9edee72fe8815a795c9f83451b46551bbe25fc36094f4b"
|
|
1498
|
+
},
|
|
1499
|
+
{
|
|
1500
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/expected/projection.json",
|
|
1501
|
+
"size": 522,
|
|
1502
|
+
"sha256": "f24bdb507f66932c0429acefc171abf5221bd644cacdeba5cd7b5c07670b04aa"
|
|
1503
|
+
},
|
|
1504
|
+
{
|
|
1505
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/extracted_text.json",
|
|
1506
|
+
"size": 351,
|
|
1507
|
+
"sha256": "9b512bbea3780727e79355dd4b3689be182f086d4afb4184737524449fc44e4d"
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/results.json",
|
|
1511
|
+
"size": 175,
|
|
1512
|
+
"sha256": "e46d52e6a9c038ebd5cb8ce89a5961f32c8365e80d189d3ee80bed021a60296a"
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/run_challenge.py",
|
|
1516
|
+
"size": 3138,
|
|
1517
|
+
"sha256": "a3c194bb31f319bdd011d4436e5de22cfcc79b7979fbcba4883ed370e4acbeb4"
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/verify.sh",
|
|
1521
|
+
"size": 286,
|
|
1522
|
+
"sha256": "f96687fa9d1b213734810dcdfa8126a2efd1af106f5d1cdeb43d58b431ab915b"
|
|
1523
|
+
},
|
|
1524
|
+
{
|
|
1525
|
+
"path": "skills/fulltext-retrieval/fetch_oa_report_challenge/worklist.tsv",
|
|
1526
|
+
"size": 326,
|
|
1527
|
+
"sha256": "d1c4c906052be198275155ee3e9ecf29b04ec8bdfeef97816ca15aa8cefa61fa"
|
|
1498
1528
|
},
|
|
1499
1529
|
{
|
|
1500
1530
|
"path": "skills/fulltext-retrieval/pdf_to_md.py",
|
|
1501
1531
|
"size": 5398,
|
|
1502
1532
|
"sha256": "16ba8c61db254b4b356d85686946351daa5ea650d70dca2fd0d5677851c6df4d"
|
|
1503
1533
|
},
|
|
1534
|
+
{
|
|
1535
|
+
"path": "skills/fulltext-retrieval/references/find_available_pdf.js",
|
|
1536
|
+
"size": 3057,
|
|
1537
|
+
"sha256": "04dc6d13d0bb7c43679e5386f1788edee6b187b2503cd9e250ae4ea63e11cec0"
|
|
1538
|
+
},
|
|
1504
1539
|
{
|
|
1505
1540
|
"path": "skills/fulltext-retrieval/skill.yml",
|
|
1506
|
-
"size":
|
|
1507
|
-
"sha256": "
|
|
1541
|
+
"size": 2420,
|
|
1542
|
+
"sha256": "7a457e5f5fde09f57a8ef9d2207dbaab241e56a9bca59ba577d26351bf225346"
|
|
1508
1543
|
},
|
|
1509
1544
|
{
|
|
1510
1545
|
"path": "skills/generate-codebook/SKILL.md",
|
|
@@ -1563,8 +1598,8 @@
|
|
|
1563
1598
|
},
|
|
1564
1599
|
{
|
|
1565
1600
|
"path": "skills/lit-sync/SKILL.md",
|
|
1566
|
-
"size":
|
|
1567
|
-
"sha256": "
|
|
1601
|
+
"size": 21126,
|
|
1602
|
+
"sha256": "4ba2d2b6dd4704803c0922993401b837d4135ac1d655d6064229315537a8e818"
|
|
1568
1603
|
},
|
|
1569
1604
|
{
|
|
1570
1605
|
"path": "skills/lit-sync/references/locale/ko/note_templates.md",
|
|
@@ -1573,8 +1608,8 @@
|
|
|
1573
1608
|
},
|
|
1574
1609
|
{
|
|
1575
1610
|
"path": "skills/lit-sync/skill.yml",
|
|
1576
|
-
"size":
|
|
1577
|
-
"sha256": "
|
|
1611
|
+
"size": 2780,
|
|
1612
|
+
"sha256": "a04d160e9fc6382c783940b737c9d9348db45e34ea80c69ef905be0a3c357e34"
|
|
1578
1613
|
},
|
|
1579
1614
|
{
|
|
1580
1615
|
"path": "skills/ma-scout/SKILL.md",
|
|
@@ -2498,8 +2533,13 @@
|
|
|
2498
2533
|
},
|
|
2499
2534
|
{
|
|
2500
2535
|
"path": "skills/mllm-eval/SKILL.md",
|
|
2501
|
-
"size":
|
|
2502
|
-
"sha256": "
|
|
2536
|
+
"size": 6720,
|
|
2537
|
+
"sha256": "afdc167bfccb6bad8a4019e0af5bd7c955129220d360511a89962ecd321bc44d"
|
|
2538
|
+
},
|
|
2539
|
+
{
|
|
2540
|
+
"path": "skills/mllm-eval/references/evaluation_axes.md",
|
|
2541
|
+
"size": 10857,
|
|
2542
|
+
"sha256": "49d77ab63feae5dba5cdae7e47d9de6ea97ee3b9eea4b9cba39ec8b0e185be72"
|
|
2503
2543
|
},
|
|
2504
2544
|
{
|
|
2505
2545
|
"path": "skills/mllm-eval/scripts/check_mllm_eval_completeness.py",
|
|
@@ -2588,18 +2628,23 @@
|
|
|
2588
2628
|
},
|
|
2589
2629
|
{
|
|
2590
2630
|
"path": "skills/model-evaluation/SKILL.md",
|
|
2591
|
-
"size":
|
|
2592
|
-
"sha256": "
|
|
2631
|
+
"size": 5780,
|
|
2632
|
+
"sha256": "334b4ca87a2f672446563f3fb6d78c0585386fac12aee29e10dc09465e892193"
|
|
2593
2633
|
},
|
|
2594
2634
|
{
|
|
2595
2635
|
"path": "skills/model-evaluation/references/metric_guide.md",
|
|
2596
2636
|
"size": 2454,
|
|
2597
2637
|
"sha256": "8d09ca7ce9fb9f66ee4942689294d9b12ae1d892ac67769cd68fdc38a4e220ee"
|
|
2598
2638
|
},
|
|
2639
|
+
{
|
|
2640
|
+
"path": "skills/model-evaluation/references/metric_selection_grounding.md",
|
|
2641
|
+
"size": 9588,
|
|
2642
|
+
"sha256": "56723e73b2b74299140d353921d1dba471bedf9aea0b8e769fc69995c4733995"
|
|
2643
|
+
},
|
|
2599
2644
|
{
|
|
2600
2645
|
"path": "skills/model-evaluation/scripts/check_metric_reporting.py",
|
|
2601
|
-
"size":
|
|
2602
|
-
"sha256": "
|
|
2646
|
+
"size": 9562,
|
|
2647
|
+
"sha256": "fd6c0205f652651a5a43910cb415ed8442100fc553ce04aa5d5905d97743a0bf"
|
|
2603
2648
|
},
|
|
2604
2649
|
{
|
|
2605
2650
|
"path": "skills/model-evaluation/scripts/metric_reporting_challenge/fixture/clf_bad.md",
|
|
@@ -2611,6 +2656,16 @@
|
|
|
2611
2656
|
"size": 186,
|
|
2612
2657
|
"sha256": "ba44a3b38b4128fa713555c8b332f211e9087e6bc016d80af4c3074c3ca6ef8e"
|
|
2613
2658
|
},
|
|
2659
|
+
{
|
|
2660
|
+
"path": "skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_good_wrapped.md",
|
|
2661
|
+
"size": 285,
|
|
2662
|
+
"sha256": "0c1f5ed5167969870602106e7a7c9a2ae53e3a3ddea5fa280c3beb6bf470c454"
|
|
2663
|
+
},
|
|
2664
|
+
{
|
|
2665
|
+
"path": "skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_no_iou.md",
|
|
2666
|
+
"size": 224,
|
|
2667
|
+
"sha256": "08227fbe46829b8eecdfe15680e1bb32087f1e6c5a353b3df6055c67d8300fc0"
|
|
2668
|
+
},
|
|
2614
2669
|
{
|
|
2615
2670
|
"path": "skills/model-evaluation/scripts/metric_reporting_challenge/fixture/seg_bad.md",
|
|
2616
2671
|
"size": 119,
|
|
@@ -2628,8 +2683,8 @@
|
|
|
2628
2683
|
},
|
|
2629
2684
|
{
|
|
2630
2685
|
"path": "skills/model-evaluation/scripts/metric_reporting_challenge/verify.sh",
|
|
2631
|
-
"size":
|
|
2632
|
-
"sha256": "
|
|
2686
|
+
"size": 1663,
|
|
2687
|
+
"sha256": "4aa6db49d3552f01a54ddb70484df5d214806d805b836b24beda81d9aca32bd6"
|
|
2633
2688
|
},
|
|
2634
2689
|
{
|
|
2635
2690
|
"path": "skills/model-evaluation/skill.yml",
|
|
@@ -2683,8 +2738,13 @@
|
|
|
2683
2738
|
},
|
|
2684
2739
|
{
|
|
2685
2740
|
"path": "skills/model-validation/SKILL.md",
|
|
2686
|
-
"size":
|
|
2687
|
-
"sha256": "
|
|
2741
|
+
"size": 9810,
|
|
2742
|
+
"sha256": "1a75a5a1f21f5a8778d0b77db2e99574bf37edda2a291d8dde6aafea4a207ff0"
|
|
2743
|
+
},
|
|
2744
|
+
{
|
|
2745
|
+
"path": "skills/model-validation/references/validation_design.md",
|
|
2746
|
+
"size": 11427,
|
|
2747
|
+
"sha256": "16d43b688ea63745174c7ca8fafd78a7342b26c34ad1e10e1fdbc117cceafb2e"
|
|
2688
2748
|
},
|
|
2689
2749
|
{
|
|
2690
2750
|
"path": "skills/model-validation/scripts/check_split_leakage.py",
|
|
@@ -3238,8 +3298,8 @@
|
|
|
3238
3298
|
},
|
|
3239
3299
|
{
|
|
3240
3300
|
"path": "skills/search-lit/SKILL.md",
|
|
3241
|
-
"size":
|
|
3242
|
-
"sha256": "
|
|
3301
|
+
"size": 20281,
|
|
3302
|
+
"sha256": "608644e83ffc357f3b43b65cf7c439c9381f5948c51798672929f7a38aea5024"
|
|
3243
3303
|
},
|
|
3244
3304
|
{
|
|
3245
3305
|
"path": "skills/search-lit/references/parse_pubmed.py",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "medsci-skills",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0",
|
|
4
4
|
"description": "MedSci Skills — a medical/scientific research skill suite for AI coding agents (Claude Code, Codex, Cursor, Copilot). The npm package is a terminal-friendly installer shortcut; the canonical distribution remains the GitHub repository and the Claude Code plugin marketplace.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://github.com/Aperivue/medsci-skills#readme",
|
|
@@ -13,10 +13,10 @@ Batch download open-access full-text PDFs from a DOI list using legitimate OA AP
|
|
|
13
13
|
## Pipeline
|
|
14
14
|
|
|
15
15
|
```
|
|
16
|
-
DOI
|
|
16
|
+
DOI → arXiv (10.48550/arXiv.* DOIs) → Unpaywall → PMC (Europe PMC / OA FTP / web) → OpenAlex → Crossref → landing page
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
Each DOI goes through these sources in order until a valid PDF (≥10 KB, `%PDF-` header) is found.
|
|
19
|
+
Each DOI goes through these sources in order until a valid PDF (≥10 KB, `%PDF-` header) is found. arXiv DOIs (`10.48550/arXiv.2401.01234`, version suffixes, old-style `hep-th/9901001`, or a bare `arXiv:` id) resolve directly to the arXiv PDF first.
|
|
20
20
|
|
|
21
21
|
## Quick Start
|
|
22
22
|
|
|
@@ -43,13 +43,20 @@ python fetch_oa.py dois.txt -o pdfs/ -e your@email.com --verbose
|
|
|
43
43
|
10.1002/mp.12524
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
**TSV with header** — must contain a `DOI` column
|
|
46
|
+
**TSV / CSV with header** — must contain a `DOI` column; optional `PMID` and `Title` columns:
|
|
47
47
|
```tsv
|
|
48
48
|
ID Title DOI PMID Year
|
|
49
49
|
1 Some paper 10.1007/s00330-010-1783-x 20628747 2010
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
**Markdown table** — a pipe table with a `DOI` column also works:
|
|
53
|
+
```markdown
|
|
54
|
+
| DOI | PMID | Title |
|
|
55
|
+
|-----|------|-------|
|
|
56
|
+
| 10.1007/s00330-010-1783-x | 20628747 | Some paper |
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
When a PMID is available, the PMC lookup is more reliable (PMID → PMCID conversion). When a `Title` column is present, downloaded PDFs get a best-effort title cross-check (see *Retrieval report* below).
|
|
53
60
|
|
|
54
61
|
## PMC Download (JS-Challenge Resistant)
|
|
55
62
|
|
|
@@ -82,8 +89,48 @@ curl -s "https://www.ncbi.nlm.nih.gov/pmc/utils/idconv/v1.0/?ids=${DOI}&format=j
|
|
|
82
89
|
## Output
|
|
83
90
|
|
|
84
91
|
- PDFs saved as `{DOI_safe}.pdf` (slashes replaced with underscores)
|
|
92
|
+
- `pdfs/retrieval_report.json` — structured per-DOI report (see below)
|
|
85
93
|
- `manual_needed.txt` — DOIs that could not be retrieved via OA
|
|
86
|
-
- Summary with OA/PMC/fail/skip counts
|
|
94
|
+
- Summary with arXiv/OA/PMC/fail/skip counts
|
|
95
|
+
|
|
96
|
+
## Retrieval report (`--report`)
|
|
97
|
+
|
|
98
|
+
Every run writes a structured report (default `<output>/retrieval_report.json`,
|
|
99
|
+
override with `--report PATH`):
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"schema_version": 1,
|
|
104
|
+
"generated_by": "fetch_oa.py",
|
|
105
|
+
"counts": {"total": 10, "retrieved": 6, "not_retrieved": 4, "title_mismatch": 1},
|
|
106
|
+
"items": [
|
|
107
|
+
{"doi": "10.1007/...", "pmid": "20628747", "title": "...",
|
|
108
|
+
"status": "oa", "source": "unpaywall", "file": "10.1007_....pdf",
|
|
109
|
+
"size_bytes": 482113, "title_match": "match"}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- `status` ∈ `arxiv | oa | pmc | skip | fail`; `source` names the resolver that succeeded.
|
|
115
|
+
- `title_match` ∈ `match | mismatch | unavailable` (tri-state). It is **best-effort**:
|
|
116
|
+
it needs a `Title` column **and** `pdftotext` (poppler). When either is missing it is
|
|
117
|
+
`unavailable`; a `mismatch` is **flagged** for review and **never** auto-rejects a PDF
|
|
118
|
+
(guards against a publisher serving a wrong/redirect PDF that still passes the `%PDF-` check).
|
|
119
|
+
|
|
120
|
+
## Attach PDFs into Zotero ("Find Available PDF")
|
|
121
|
+
|
|
122
|
+
OA-only resolvers miss paywalled-but-licensed papers. To attach full text **inside
|
|
123
|
+
Zotero** at a much higher yield, use `references/find_available_pdf.js` — a user-run
|
|
124
|
+
snippet for Zotero's *Tools → Developer → Run JavaScript*. It triggers Zotero's own
|
|
125
|
+
`addAvailablePDF` / `addAvailablePDFs` and therefore reuses **your** OpenURL resolver /
|
|
126
|
+
institutional proxy config; **no credentials, proxy hosts, or institutional identifiers
|
|
127
|
+
are hard-coded or leave your Zotero client**. The no-code equivalent is right-click →
|
|
128
|
+
"Find Available PDF".
|
|
129
|
+
|
|
130
|
+
This path is **user-initiated** and depends on your live Zotero session, so its results
|
|
131
|
+
are recorded manually (not reproducible CI evidence). `/lit-sync` Phase 2.7 orchestrates
|
|
132
|
+
both routes (disk OA via this script + in-library via the snippet) and reconciles them in
|
|
133
|
+
a report.
|
|
87
134
|
|
|
88
135
|
## Requirements
|
|
89
136
|
|