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.
Files changed (26) hide show
  1. package/metadata/distribution_files.json +82 -22
  2. package/metadata/distribution_manifest.json +1 -1
  3. package/package.json +1 -1
  4. package/skills/fulltext-retrieval/SKILL.md +52 -5
  5. package/skills/fulltext-retrieval/fetch_oa.py +293 -74
  6. package/skills/fulltext-retrieval/fetch_oa_report_challenge/expected/projection.json +14 -0
  7. package/skills/fulltext-retrieval/fetch_oa_report_challenge/extracted_text.json +4 -0
  8. package/skills/fulltext-retrieval/fetch_oa_report_challenge/results.json +6 -0
  9. package/skills/fulltext-retrieval/fetch_oa_report_challenge/run_challenge.py +86 -0
  10. package/skills/fulltext-retrieval/fetch_oa_report_challenge/verify.sh +6 -0
  11. package/skills/fulltext-retrieval/fetch_oa_report_challenge/worklist.tsv +5 -0
  12. package/skills/fulltext-retrieval/references/find_available_pdf.js +82 -0
  13. package/skills/fulltext-retrieval/skill.yml +7 -2
  14. package/skills/lit-sync/SKILL.md +86 -6
  15. package/skills/lit-sync/skill.yml +3 -1
  16. package/skills/mllm-eval/SKILL.md +8 -0
  17. package/skills/mllm-eval/references/evaluation_axes.md +161 -0
  18. package/skills/model-evaluation/SKILL.md +12 -0
  19. package/skills/model-evaluation/references/metric_selection_grounding.md +139 -0
  20. package/skills/model-evaluation/scripts/check_metric_reporting.py +1 -1
  21. package/skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_good_wrapped.md +5 -0
  22. package/skills/model-evaluation/scripts/metric_reporting_challenge/fixture/det_no_iou.md +4 -0
  23. package/skills/model-evaluation/scripts/metric_reporting_challenge/verify.sh +6 -1
  24. package/skills/model-validation/SKILL.md +6 -0
  25. package/skills/model-validation/references/validation_design.md +150 -0
  26. 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": 5830,
1492
- "sha256": "0bdf94398af3d9f144b0b58fbce643d05f5486329472681a39090f135d3ec63f"
1491
+ "size": 8248,
1492
+ "sha256": "d97c19a64d92f66e3c8a1445d893c0f55364f21dc99404fb6f012a3566556e73"
1493
1493
  },
1494
1494
  {
1495
1495
  "path": "skills/fulltext-retrieval/fetch_oa.py",
1496
- "size": 15882,
1497
- "sha256": "b33feb91c7258d1986fbb6168a044b2abe21f3ba1cacadd3a52a38689477f86c"
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": 1712,
1507
- "sha256": "43f84eeeeedb4676fb80fdca2ac0a84f6a90901b1d4e1d88359a532bb4ead835"
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": 16378,
1567
- "sha256": "e59b10d8dfdb52318a212e42d403a4372435697880e45643d3864f1374c7e82a"
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": 2522,
1577
- "sha256": "5f656fae91ba46d54f9d619785607bfb57773abc6a872207435ecf7a7315816b"
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": 6288,
2502
- "sha256": "ccf3da2f70b356d432b3d33500f667f9d7858500a9ff325631a9a16f5f300a8b"
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": 5031,
2592
- "sha256": "17ffde905359e4cffdf747422b7d41c214d2abfcc71e50e1b1e4a689d87fa695"
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": 9564,
2602
- "sha256": "c33f52ee62ae93417027d0bb0b6cf2a95f5747d52403ab99c075bc64a5e2c593"
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": 1235,
2632
- "sha256": "f819d1333a7206db6383ccbd41c6eadae015004e61ae335e67a3334936c58cc8"
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": 9347,
2687
- "sha256": "ecd48672a03923bf1ace63528fd2dbcf138cd880103cc8c40345b3857d66ad1c"
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": 21637,
3242
- "sha256": "35809486f31f1a26288a27ee0b1383760cf97e0287916ace2e9097eef88182e4"
3301
+ "size": 20281,
3302
+ "sha256": "608644e83ffc357f3b43b65cf7c439c9381f5948c51798672929f7a38aea5024"
3243
3303
  },
3244
3304
  {
3245
3305
  "path": "skills/search-lit/references/parse_pubmed.py",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "version": "5.0.0",
3
+ "version": "5.2.0",
4
4
  "owned_skills": [
5
5
  "academic-aio",
6
6
  "add-journal",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medsci-skills",
3
- "version": "5.0.0",
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 list → Unpaywall → PMC (Europe PMC / OA FTP / web) → OpenAlex → Crossref → landing page
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, optional `PMID` 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
- When a PMID is available, the PMC lookup is more reliable (PMID → PMCID conversion).
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