linkml-reference-validator 0.2.0__tar.gz → 0.2.1__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 (197) hide show
  1. linkml_reference_validator-0.2.1/.github/workflows/claude-code-review.yml +61 -0
  2. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-ontology-review.yml +13 -27
  3. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude.yml +12 -40
  4. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/dragon-ai.yml +1 -1
  5. linkml_reference_validator-0.2.0/README.md → linkml_reference_validator-0.2.1/PKG-INFO +68 -3
  6. linkml_reference_validator-0.2.0/PKG-INFO → linkml_reference_validator-0.2.1/README.md +47 -23
  7. linkml_reference_validator-0.2.1/docs/assets/zotero-find-full-text.png +0 -0
  8. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/editorial-conventions.md +28 -0
  9. linkml_reference_validator-0.2.1/docs/how-to/export-cache-to-zotero.md +114 -0
  10. linkml_reference_validator-0.2.1/docs/how-to/fetch-full-text-and-pdfs.md +287 -0
  11. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/reference/cli.md +63 -0
  12. linkml_reference_validator-0.2.1/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +2969 -0
  13. linkml_reference_validator-0.2.1/docs/superpowers/plans/2026-08-05-private-library-full-text.md +190 -0
  14. linkml_reference_validator-0.2.1/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +260 -0
  15. linkml_reference_validator-0.2.1/docs/superpowers/specs/2026-08-05-private-library-full-text-design.md +309 -0
  16. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/mkdocs.yml +2 -0
  17. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/pyproject.toml +1 -0
  18. linkml_reference_validator-0.2.1/src/linkml_reference_validator/cli/cache.py +373 -0
  19. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/lookup.py +3 -0
  20. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/shared.py +8 -0
  21. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/validate.py +66 -33
  22. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/acquire.py +213 -0
  23. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/csl_export.py +73 -0
  24. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/__init__.py +16 -0
  25. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/base.py +64 -0
  26. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/html.py +46 -0
  27. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/pdf.py +67 -0
  28. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/xml.py +46 -0
  29. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/__init__.py +23 -0
  30. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/base.py +70 -0
  31. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/epmc_preprint.py +142 -0
  32. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/json_api.py +135 -0
  33. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/loader.py +94 -0
  34. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/openalex.py +70 -0
  35. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/pmc.py +124 -0
  36. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/unpaywall.py +69 -0
  37. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/zotero.py +252 -0
  38. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/identifiers.py +81 -0
  39. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/reference_fetcher.py +384 -22
  40. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/__init__.py +2 -0
  41. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/doi.py +34 -0
  42. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/pmid.py +111 -33
  43. linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/sources/ppr.py +159 -0
  44. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/url.py +43 -12
  45. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/field_detection.py +43 -2
  46. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/models.py +208 -0
  47. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +6 -1
  48. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/supporting_text_validator.py +24 -4
  49. linkml_reference_validator-0.2.1/tests/data/test_data_deep_nesting_invalid.yaml +17 -0
  50. linkml_reference_validator-0.2.1/tests/data/test_data_deep_nesting_valid.yaml +23 -0
  51. linkml_reference_validator-0.2.1/tests/data/test_schema_deep_nesting.yaml +74 -0
  52. linkml_reference_validator-0.2.1/tests/test_acquire.py +224 -0
  53. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli.py +266 -0
  54. linkml_reference_validator-0.2.1/tests/test_cli_cache_enrich.py +227 -0
  55. linkml_reference_validator-0.2.1/tests/test_cli_cache_export.py +246 -0
  56. linkml_reference_validator-0.2.1/tests/test_deep_nesting.py +401 -0
  57. linkml_reference_validator-0.2.1/tests/test_doi_preprint.py +103 -0
  58. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_e2e_integration.py +58 -0
  59. linkml_reference_validator-0.2.1/tests/test_epmc_preprint_provider.py +196 -0
  60. linkml_reference_validator-0.2.1/tests/test_extractors.py +104 -0
  61. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_field_detection.py +47 -0
  62. linkml_reference_validator-0.2.1/tests/test_fulltext_loader.py +97 -0
  63. linkml_reference_validator-0.2.1/tests/test_fulltext_providers.py +175 -0
  64. linkml_reference_validator-0.2.1/tests/test_identifiers.py +56 -0
  65. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_models.py +54 -0
  66. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_optional_linkml_dependency.py +31 -3
  67. linkml_reference_validator-0.2.1/tests/test_ppr_source.py +125 -0
  68. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_reference_fetcher.py +542 -32
  69. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_sources.py +191 -28
  70. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_supporting_text_validator.py +65 -0
  71. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_title_validation.py +2 -0
  72. linkml_reference_validator-0.2.1/tests/test_unknown_slot_traversal.py +131 -0
  73. linkml_reference_validator-0.2.1/tests/test_validation_config.py +72 -0
  74. linkml_reference_validator-0.2.1/tests/test_zotero_provider.py +277 -0
  75. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/uv.lock +14 -0
  76. linkml_reference_validator-0.2.0/.github/workflows/claude-code-review.yml +0 -78
  77. linkml_reference_validator-0.2.0/src/linkml_reference_validator/cli/cache.py +0 -143
  78. linkml_reference_validator-0.2.0/tests/test_validation_config.py +0 -38
  79. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.claude/.mcp.json +0 -0
  80. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.claude/settings.json +0 -0
  81. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.copier-answers.yml +0 -0
  82. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.devcontainer/devcontainer.json +0 -0
  83. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.devcontainer/post_create.sh +0 -0
  84. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.editorconfig +0 -0
  85. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-code-action/action.yml +0 -0
  86. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
  87. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-issue-triage-action/action.yml +0 -0
  88. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/ai-controllers.json +0 -0
  89. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/copilot-instructions.md +0 -0
  90. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/copilot-setup-steps.yml +0 -0
  91. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/dependabot.yml +0 -0
  92. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-issue-summarize.yml +0 -0
  93. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-issue-triage.yml +0 -0
  94. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/deploy-docs.yaml +0 -0
  95. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/main.yaml +0 -0
  96. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/pypi-publish.yaml +0 -0
  97. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.gitignore +0 -0
  98. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.goosehints +0 -0
  99. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.pre-commit-config.yaml +0 -0
  100. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.yamllint.yaml +0 -0
  101. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/AGENTS.md +0 -0
  102. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
  103. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
  104. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CLAUDE.md +0 -0
  105. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CLI-ISSUES.md +0 -0
  106. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CODE_OF_CONDUCT.md +0 -0
  107. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CONTRIBUTING.md +0 -0
  108. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/FEATURE_REQUEST_REPAIR.md +0 -0
  109. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/LICENSE +0 -0
  110. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/REVIEW2.md +0 -0
  111. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/REVIEW3.md +0 -0
  112. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/ai.just +0 -0
  113. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/copilot-instructions.md +0 -0
  114. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/about.md +0 -0
  115. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/content-types.md +0 -0
  116. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/how-it-works.md +0 -0
  117. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/elements/.gitkeep +0 -0
  118. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/add-reference-source.md +0 -0
  119. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/repair-validation-errors.md +0 -0
  120. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/skip-unsupported-references.md +0 -0
  121. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/use-local-files-and-urls.md +0 -0
  122. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-clinical-trials.md +0 -0
  123. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-dois.md +0 -0
  124. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-entrez.md +0 -0
  125. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-obo-files.md +0 -0
  126. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-titles.md +0 -0
  127. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-urls.md +0 -0
  128. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/index.md +0 -0
  129. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/01_getting_started.ipynb +0 -0
  130. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/02_advanced_usage.ipynb +0 -0
  131. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/03_python_api.ipynb +0 -0
  132. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/04_obo_validation.ipynb +0 -0
  133. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/05_geo_validation.ipynb +0 -0
  134. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/quickstart.md +0 -0
  135. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/setup-guide.md +0 -0
  136. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/templates-linkml/README.md +0 -0
  137. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/todo.md +0 -0
  138. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/troubleshooting.md +0 -0
  139. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/tutorials/complete-workflow.md +0 -0
  140. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/examples/README.md +0 -0
  141. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/justfile +0 -0
  142. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/mypy.ini +0 -0
  143. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/01_getting_started.ipynb +0 -0
  144. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/02_advanced_usage.ipynb +0 -0
  145. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/03_python_api.ipynb +0 -0
  146. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/README.md +0 -0
  147. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/project/README.md +0 -0
  148. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/project.justfile +0 -0
  149. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/pytest.ini +0 -0
  150. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/__init__.py +0 -0
  151. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/_version.py +0 -0
  152. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/__init__.py +0 -0
  153. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/repair.py +0 -0
  154. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/__init__.py +0 -0
  155. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/base.py +0 -0
  156. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
  157. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
  158. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/file.py +0 -0
  159. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
  160. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
  161. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
  162. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
  163. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
  164. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/__init__.py +0 -0
  165. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/__init__.py +0 -0
  166. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +0 -0
  167. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/repairer.py +0 -0
  168. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/__init__.py +0 -0
  169. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/conftest.py +0 -0
  170. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_data_invalid.yaml +0 -0
  171. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_data_valid.yaml +0 -0
  172. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_schema.yaml +0 -0
  173. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/CLINICALTRIALS_NCT00000001.md +0 -0
  174. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/GEO_GSE12345.md +0 -0
  175. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST001.md +0 -0
  176. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST001.txt +0 -0
  177. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST002.md +0 -0
  178. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST002.txt +0 -0
  179. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST001.md +0 -0
  180. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST001.txt +0 -0
  181. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST002.md +0 -0
  182. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST002.txt +0 -0
  183. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST003.md +0 -0
  184. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST003.txt +0 -0
  185. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/sample.obo +0 -0
  186. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli_lookup.py +0 -0
  187. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli_repair.py +0 -0
  188. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_clinicaltrials_integration.py +0 -0
  189. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_fuzzy_suggestions.py +0 -0
  190. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_geo_integration.py +0 -0
  191. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_json_api_source.py +0 -0
  192. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_plugin_integration.py +0 -0
  193. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_pmc_fulltext.py +0 -0
  194. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_real_validation.py +0 -0
  195. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_repair.py +0 -0
  196. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_source_utils.py +0 -0
  197. {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_text_extractor.py +0 -0
@@ -0,0 +1,61 @@
1
+ name: Claude Code Review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize]
6
+ # Optional: Only run on specific file changes
7
+ # paths:
8
+ # - "src/**/*.ts"
9
+ # - "src/**/*.tsx"
10
+ # - "src/**/*.js"
11
+ # - "src/**/*.jsx"
12
+
13
+ jobs:
14
+ claude-review:
15
+ # Optional: Filter by PR author
16
+ # if: |
17
+ # github.event.pull_request.user.login == 'external-contributor' ||
18
+ # github.event.pull_request.user.login == 'new-developer' ||
19
+ # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
20
+
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+ pull-requests: read
25
+ issues: read
26
+ id-token: write
27
+
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v6
31
+ with:
32
+ fetch-depth: 1
33
+
34
+ - name: Run Claude Code Review
35
+ id: claude-review
36
+ uses: anthropics/claude-code-action@v1
37
+ with:
38
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
39
+
40
+ # In v1, providing a `prompt` runs in automation mode, which does NOT
41
+ # post a comment by default. track_progress restores the v0.x
42
+ # "post the review as a PR comment" behavior and auto-injects PR context.
43
+ track_progress: true
44
+
45
+ # Prompt for the automated review (no @claude mention needed).
46
+ prompt: |
47
+ Please review this pull request and provide feedback on:
48
+ - Code quality and best practices
49
+ - Potential bugs or issues
50
+ - Performance considerations
51
+ - Security concerns
52
+ - Test coverage
53
+
54
+ Be constructive and helpful in your feedback.
55
+
56
+ # Args passed through to the Claude CLI. Use the `opus` alias rather
57
+ # than a dated model id so the workflow tracks the current Opus and
58
+ # won't 404 when a specific version is retired.
59
+ claude_args: |
60
+ --model opus
61
+
@@ -35,15 +35,23 @@ jobs:
35
35
 
36
36
  - name: Run Claude Code Ontology Review
37
37
  id: claude-review
38
- uses: anthropics/claude-code-action@beta
38
+ uses: anthropics/claude-code-action@v1
39
39
  with:
40
40
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
41
41
 
42
- # Optional: Specify model (commenting defaults to Claude Sonnet 4)
43
- model: "claude-opus-4-1-20250805"
42
+ # In v1, providing a `prompt` runs in automation mode, which does NOT
43
+ # post a comment by default. track_progress restores the v0.x
44
+ # "post the review as a PR comment" behavior and auto-injects PR context.
45
+ track_progress: true
44
46
 
45
- # Direct prompt for automated review (no @claude mention needed)
46
- direct_prompt: |
47
+ # Model is passed through to the Claude CLI via claude_args. Use the
48
+ # `opus` alias so the workflow tracks the current Opus and won't 404
49
+ # when a specific dated model id is retired.
50
+ claude_args: |
51
+ --model opus
52
+
53
+ # Prompt for the automated review (no @claude mention needed)
54
+ prompt: |
47
55
  REPO: ${{ github.repository }}
48
56
  PR NUMBER: ${{ github.event.pull_request.number }}
49
57
 
@@ -90,26 +98,4 @@ jobs:
90
98
 
91
99
  # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR
92
100
  use_sticky_comment: true
93
-
94
- # Optional: Customize review based on file types
95
- # direct_prompt: |
96
- # Review this PR focusing on:
97
- # - For TypeScript files: Type safety and proper interface usage
98
- # - For API endpoints: Security, input validation, and error handling
99
- # - For React components: Performance, accessibility, and best practices
100
- # - For tests: Coverage, edge cases, and test quality
101
-
102
- # Optional: Different prompts for different authors
103
- # direct_prompt: |
104
- # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' &&
105
- # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' ||
106
- # 'Please provide a thorough code review focusing on our coding standards and best practices.' }}
107
-
108
- # Optional: Add specific tools for running tests or linting
109
- # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)"
110
-
111
- # Optional: Skip review for certain conditions
112
- # if: |
113
- # !contains(github.event.pull_request.title, '[skip-review]') &&
114
- # !contains(github.event.pull_request.title, '[WIP]')
115
101
 
@@ -39,52 +39,24 @@ jobs:
39
39
 
40
40
  - name: Run Claude Code
41
41
  id: claude
42
- uses: anthropics/claude-code-action@beta
43
-
42
+ uses: anthropics/claude-code-action@v1
43
+
44
44
  with:
45
45
  claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
46
- mcp_config: |
47
- {
48
- "mcpServers": {
49
- "ols": {
50
- "command": "uvx",
51
- "args": [
52
- "ols-mcp"
53
- ]
54
- },
55
- "sequential-thinking": {
56
- "command": "npx",
57
- "args": [
58
- "-y",
59
- "@modelcontextprotocol/server-sequential-thinking"
60
- ]
61
- }
62
- }
63
- }
64
46
 
65
47
  # This is an optional setting that allows Claude to read CI results on PRs
66
48
  additional_permissions: |
67
49
  actions: read
68
-
69
- # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4.1)
70
- # model: "claude-opus-4-1-20250805"
71
-
50
+
51
+ # In v1 the model, MCP servers, and allowed tools are passed through to
52
+ # the Claude CLI via claude_args (the v0.x model / mcp_config /
53
+ # allowed_tools inputs were removed). The `opus` alias tracks the
54
+ # current Opus so this won't 404 when a dated model id is retired.
55
+ claude_args: |
56
+ --model opus
57
+ --mcp-config '{"mcpServers":{"ols":{"command":"uvx","args":["ols-mcp"]},"sequential-thinking":{"command":"npx","args":["-y","@modelcontextprotocol/server-sequential-thinking"]}}}'
58
+ --allowedTools "Bash(*),FileEdit,Edit,MultiEdit,WebSearch,WebFetch,mcp__ols_mcp__search_all_ontologies,mcp__ols_mcp__get_terms_from_ontology"
59
+
72
60
  # Optional: Customize the trigger phrase (default: @claude)
73
61
  # trigger_phrase: "/claude"
74
-
75
- # Optional: Trigger when specific user is assigned to an issue
76
- # assignee_trigger: "claude-bot"
77
-
78
- # Optional: Allow Claude to run specific commands
79
- allowed_tools: "Bash(*),FileEdit,Edit,MultiEdit,WebSearch,WebFetch,mcp__ols_mcp__search_all_ontologies,mcp__ols_mcp__get_terms_from_ontology"
80
-
81
- # Optional: Add custom instructions for Claude to customize its behavior for your project
82
- # custom_instructions: |
83
- # Follow our coding standards
84
- # Ensure all new code has tests
85
- # Use TypeScript for new files
86
-
87
- # Optional: Custom environment variables for Claude
88
- # claude_env: |
89
- # NODE_ENV: test
90
62
 
@@ -29,7 +29,7 @@ jobs:
29
29
 
30
30
  - name: Check for qualifying mention
31
31
  id: check
32
- uses: actions/github-script@v8
32
+ uses: actions/github-script@v9
33
33
  with:
34
34
  github-token: ${{ secrets.PAT_FOR_PR }} # Use PAT instead of default token
35
35
  script: |
@@ -1,3 +1,24 @@
1
+ Metadata-Version: 2.4
2
+ Name: linkml_reference_validator
3
+ Version: 0.2.1
4
+ Summary: Validation of supporting text from references and publications
5
+ Author-email: Chris Mungall <cjmungall@lbl.gov>
6
+ License-Expression: Apache-2.0
7
+ License-File: LICENSE
8
+ Requires-Python: <4.0,>=3.10
9
+ Requires-Dist: beautifulsoup4>=4.9.0
10
+ Requires-Dist: biopython>=1.80
11
+ Requires-Dist: jsonpath-ng>=1.6.0
12
+ Requires-Dist: linkml-runtime>=1.9.4
13
+ Requires-Dist: lxml>=4.9.0
14
+ Requires-Dist: pydantic>=2.0.0
15
+ Requires-Dist: pypdf>=4.0.0
16
+ Requires-Dist: rapidfuzz>=3.14.3
17
+ Requires-Dist: requests>=2.28.0
18
+ Requires-Dist: ruamel-yaml>=0.18.0
19
+ Requires-Dist: typer>=0.9.0
20
+ Description-Content-Type: text/markdown
21
+
1
22
  # linkml-reference-validator
2
23
 
3
24
  [![Tests](https://img.shields.io/badge/tests-91%20passing-brightgreen)]()
@@ -374,10 +395,36 @@ reference:
374
395
  - `PMID:12345678`
375
396
  - `12345678` (assumes PMID)
376
397
 
377
- ### Coming Soon
398
+ #### Preprints
399
+
400
+ Preprints are supported as first-class references:
401
+
402
+ ```yaml
403
+ reference:
404
+ id: DOI:10.1101/2024.01.01.573333 # by DOI
405
+ supporting_text: "the kinase phosphorylates the substrate in vitro"
406
+ ```
378
407
 
379
- - **DOI** - `DOI:10.1038/nature12345`
380
- - **URLs** - Web pages and online documents
408
+ ```yaml
409
+ reference:
410
+ id: PPR:PPR123456 # by Europe PMC preprint id
411
+ supporting_text: "the kinase phosphorylates the substrate in vitro"
412
+ ```
413
+
414
+ **Fetches:**
415
+ - Abstract and metadata (title, authors, server, year, DOI)
416
+ - Full-text body via the Europe PMC `fulltextRepo` PDF route (`epmc_preprint`
417
+ provider), for the Europe-PMC-ingested subset
418
+ - `is_preprint` / `peer_review_status` flags, so downstream KBs can apply
419
+ "not sole support" policies
420
+
421
+ **ID Formats:**
422
+ - `DOI:10.1101/...` (Crossref `posted-content` is detected as a preprint)
423
+ - `PPR:PPR123456` (Europe PMC `SRC:PPR` id)
424
+ - NIH Preprint Pilot preprints carry real PMIDs and resolve via the `PMID:` path
425
+
426
+ See the [full-text guide](docs/how-to/fetch-full-text-and-pdfs.md#preprints) for
427
+ details and coverage caveats.
381
428
 
382
429
  ---
383
430
 
@@ -496,6 +543,24 @@ supporting_text: "protein [X] functions in cell cycle regulation"
496
543
  - `[gene name]` - Clarifications
497
544
  - `[...]` - Omitted content markers
498
545
 
546
+ If your corpus uses square brackets as literal source text, configure patterns
547
+ that should be preserved instead of stripped:
548
+
549
+ ```yaml
550
+ validation:
551
+ literal_bracket_patterns:
552
+ - "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
553
+ - "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
554
+ ```
555
+
556
+ Patterns are matched against the content inside `[...]`. If any pattern matches,
557
+ that bracketed text is preserved (not stripped) before normalization and validation.
558
+
559
+ Keep patterns **specific** to your notation. A pattern broad enough to also match
560
+ ordinary editorial notes will preserve those too — for example `^\S` matches any
561
+ note that doesn't start with a space, so it would keep `[important]` as well as
562
+ `[poly(A)+]`.
563
+
499
564
  ### Omitted Text `...`
500
565
 
501
566
  Use ellipsis for gaps in quoted text:
@@ -1,23 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: linkml_reference_validator
3
- Version: 0.2.0
4
- Summary: Validation of supporting text from references and publications
5
- Author-email: Chris Mungall <cjmungall@lbl.gov>
6
- License-Expression: Apache-2.0
7
- License-File: LICENSE
8
- Requires-Python: <4.0,>=3.10
9
- Requires-Dist: beautifulsoup4>=4.9.0
10
- Requires-Dist: biopython>=1.80
11
- Requires-Dist: jsonpath-ng>=1.6.0
12
- Requires-Dist: linkml-runtime>=1.9.4
13
- Requires-Dist: lxml>=4.9.0
14
- Requires-Dist: pydantic>=2.0.0
15
- Requires-Dist: rapidfuzz>=3.14.3
16
- Requires-Dist: requests>=2.28.0
17
- Requires-Dist: ruamel-yaml>=0.18.0
18
- Requires-Dist: typer>=0.9.0
19
- Description-Content-Type: text/markdown
20
-
21
1
  # linkml-reference-validator
22
2
 
23
3
  [![Tests](https://img.shields.io/badge/tests-91%20passing-brightgreen)]()
@@ -394,10 +374,36 @@ reference:
394
374
  - `PMID:12345678`
395
375
  - `12345678` (assumes PMID)
396
376
 
397
- ### Coming Soon
377
+ #### Preprints
378
+
379
+ Preprints are supported as first-class references:
380
+
381
+ ```yaml
382
+ reference:
383
+ id: DOI:10.1101/2024.01.01.573333 # by DOI
384
+ supporting_text: "the kinase phosphorylates the substrate in vitro"
385
+ ```
398
386
 
399
- - **DOI** - `DOI:10.1038/nature12345`
400
- - **URLs** - Web pages and online documents
387
+ ```yaml
388
+ reference:
389
+ id: PPR:PPR123456 # by Europe PMC preprint id
390
+ supporting_text: "the kinase phosphorylates the substrate in vitro"
391
+ ```
392
+
393
+ **Fetches:**
394
+ - Abstract and metadata (title, authors, server, year, DOI)
395
+ - Full-text body via the Europe PMC `fulltextRepo` PDF route (`epmc_preprint`
396
+ provider), for the Europe-PMC-ingested subset
397
+ - `is_preprint` / `peer_review_status` flags, so downstream KBs can apply
398
+ "not sole support" policies
399
+
400
+ **ID Formats:**
401
+ - `DOI:10.1101/...` (Crossref `posted-content` is detected as a preprint)
402
+ - `PPR:PPR123456` (Europe PMC `SRC:PPR` id)
403
+ - NIH Preprint Pilot preprints carry real PMIDs and resolve via the `PMID:` path
404
+
405
+ See the [full-text guide](docs/how-to/fetch-full-text-and-pdfs.md#preprints) for
406
+ details and coverage caveats.
401
407
 
402
408
  ---
403
409
 
@@ -516,6 +522,24 @@ supporting_text: "protein [X] functions in cell cycle regulation"
516
522
  - `[gene name]` - Clarifications
517
523
  - `[...]` - Omitted content markers
518
524
 
525
+ If your corpus uses square brackets as literal source text, configure patterns
526
+ that should be preserved instead of stripped:
527
+
528
+ ```yaml
529
+ validation:
530
+ literal_bracket_patterns:
531
+ - "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
532
+ - "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
533
+ ```
534
+
535
+ Patterns are matched against the content inside `[...]`. If any pattern matches,
536
+ that bracketed text is preserved (not stripped) before normalization and validation.
537
+
538
+ Keep patterns **specific** to your notation. A pattern broad enough to also match
539
+ ordinary editorial notes will preserve those too — for example `^\S` matches any
540
+ note that doesn't start with a space, so it would keep `[important]` as well as
541
+ `[poly(A)+]`.
542
+
519
543
  ### Omitted Text `...`
520
544
 
521
545
  Use ellipsis for gaps in quoted text:
@@ -70,6 +70,34 @@ Nested brackets are not recommended and may not work as expected:
70
70
  ✅ "MUC1 [mucin 1, a membrane protein] blocks targeting"
71
71
  ```
72
72
 
73
+ ### Literal Brackets in Source Text
74
+
75
+ Some corpora use square brackets as part of the quoted source text itself:
76
+
77
+ ```
78
+ Reference: "polyadenylated [poly(A)+] RNA export"
79
+ Quote: "polyadenylated [poly(A)+] RNA export"
80
+ ```
81
+
82
+ By default, linkml-reference-validator strips all bracketed text for backward
83
+ compatibility. To preserve literal brackets, configure
84
+ `literal_bracket_patterns` in your validation config:
85
+
86
+ ```yaml
87
+ validation:
88
+ literal_bracket_patterns:
89
+ - "\\d" # keep [2Fe-2S], [+21], [30S], [Ca2+]
90
+ - "[()+]" # keep notation with parens/charges, e.g. [poly(A)+]
91
+ ```
92
+
93
+ Each pattern is matched against the content inside `[...]`. If any pattern
94
+ matches, that bracketed text is kept during validation. If none match, the
95
+ content is treated as an editorial insertion and stripped.
96
+
97
+ Keep patterns specific to your notation. A pattern broad enough to also match
98
+ ordinary editorial notes will preserve those too — for example `^\S` (any note
99
+ not starting with a space) would keep `[important]` as well as `[poly(A)+]`.
100
+
73
101
  ## Ellipsis `...`
74
102
 
75
103
  Use ellipsis (three dots) to indicate **omitted text** between parts of a quote.
@@ -0,0 +1,114 @@
1
+ # Export a Reference Cache to Zotero
2
+
3
+ This workflow turns a checked-in public reference cache into a Zotero collection,
4
+ asks Zotero to find available PDFs, and then inventories the resulting attachments
5
+ without putting closed manuscripts into the project repository.
6
+
7
+ The three stores remain separate:
8
+
9
+ | Store | Purpose | Safe to commit? |
10
+ |---|---|---:|
11
+ | Project `references_cache` | Reproducible public validation evidence | Yes |
12
+ | Zotero library | User-managed references and PDF attachments | No |
13
+ | Private research cache | Extracted user-library text for agent context | No |
14
+
15
+ Normal validation reads only the first store.
16
+
17
+ ## 1. Export metadata from the public cache
18
+
19
+ Run the exporter from the `linkml-reference-validator` checkout. For dismech:
20
+
21
+ ```bash
22
+ uv run linkml-reference-validator cache export \
23
+ --cache-dir /Users/cjm/repos/dismech/references_cache \
24
+ --needs-full-text \
25
+ --output /Users/cjm/Downloads/dismech-zotero.json
26
+ ```
27
+
28
+ `--needs-full-text` is the default. It excludes cache entries that already have
29
+ full text, excludes non-publication identifiers, and deduplicates by normalized
30
+ DOI and then PMID. The CSL JSON output uses an explicit metadata allowlist:
31
+
32
+ - title and authors;
33
+ - journal and year;
34
+ - DOI; or
35
+ - PMID and its public PubMed URL.
36
+
37
+ It never contains cached article text, excerpts, provenance, PDFs, local paths,
38
+ or private-cache data. The command refuses to replace an existing output file;
39
+ use `--force` only after checking the destination. Use `--all` if you explicitly
40
+ want eligible references that already contain full text.
41
+
42
+ ## 2. Import the file into Zotero
43
+
44
+ In Zotero:
45
+
46
+ 1. Choose **File → Import**.
47
+ 2. Choose **A file**.
48
+ 3. Select `dismech-zotero.json`.
49
+ 4. Keep the imported records in a project-specific collection such as
50
+ **dismech**.
51
+
52
+ CSL JSON is a standard format supported by Zotero. Importing the file adds only
53
+ bibliographic records; it does not copy anything from the validator's caches.
54
+
55
+ ## 3. Ask Zotero to find PDFs
56
+
57
+ Select one or more top-level journal articles in the center item list,
58
+ right-click the selection, and choose **Find Full Text**. It is a built-in Zotero
59
+ command, not a plugin.
60
+
61
+ ![Zotero Find Full Text processing a batch of imported references](../assets/zotero-find-full-text.png)
62
+
63
+ The command appears for an eligible parent item that has a DOI and does not
64
+ already have a file attachment. It may also be unavailable in a group library
65
+ where files cannot be added. If it is absent, first test a single article in
66
+ your personal library and confirm that its DOI field is populated.
67
+
68
+ For a large import, start with a modest batch rather than all records at once.
69
+ Publishers can temporarily rate-limit repeated requests, and a later retry may
70
+ find additional files. Zotero reports **Full Text PDF** or **No file found** for
71
+ each attempted item.
72
+
73
+ ## 4. Inventory the enriched Zotero library
74
+
75
+ Once Zotero finishes, scan the project cache again:
76
+
77
+ ```bash
78
+ uv run linkml-reference-validator cache enrich \
79
+ --provider zotero \
80
+ --cache-dir /Users/cjm/repos/dismech/references_cache \
81
+ --dry-run
82
+ ```
83
+
84
+ This read-only scan matches exact DOI, PMID, or PMCID identifiers and reports
85
+ which cached references now have usable Zotero text or PDF attachments. It does
86
+ not invoke **Find Full Text** and does not modify Zotero.
87
+
88
+ After reviewing the matches, materialize them into the separate private research
89
+ cache:
90
+
91
+ ```bash
92
+ uv run linkml-reference-validator cache enrich \
93
+ --provider zotero \
94
+ --cache-dir /Users/cjm/repos/dismech/references_cache \
95
+ --apply
96
+ ```
97
+
98
+ Apply mode leaves `references_cache` unchanged. Private content goes to
99
+ `~/.cache/linkml-reference-validator/private` by default with owner-only
100
+ permissions. Agents may inspect it for context, but validation cannot use it as
101
+ evidence.
102
+
103
+ ## 5. Validate reproducibly
104
+
105
+ Run validation normally. Results remain reproducible because the validator
106
+ reads the public project cache and accepts only public full-text provider results.
107
+ Neither the contents of Zotero nor the machine-specific private cache affect
108
+ validation.
109
+
110
+ ## See also
111
+
112
+ - [Fetching Full Text and PDFs](fetch-full-text-and-pdfs.md)
113
+ - [Zotero: importing standardized formats](https://www.zotero.org/support/kb/importing_standardized_formats)
114
+ - [Zotero: adding files to a library](https://www.zotero.org/support/attaching_files)