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.
- linkml_reference_validator-0.2.1/.github/workflows/claude-code-review.yml +61 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-ontology-review.yml +13 -27
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude.yml +12 -40
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/dragon-ai.yml +1 -1
- linkml_reference_validator-0.2.0/README.md → linkml_reference_validator-0.2.1/PKG-INFO +68 -3
- linkml_reference_validator-0.2.0/PKG-INFO → linkml_reference_validator-0.2.1/README.md +47 -23
- linkml_reference_validator-0.2.1/docs/assets/zotero-find-full-text.png +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/editorial-conventions.md +28 -0
- linkml_reference_validator-0.2.1/docs/how-to/export-cache-to-zotero.md +114 -0
- linkml_reference_validator-0.2.1/docs/how-to/fetch-full-text-and-pdfs.md +287 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/reference/cli.md +63 -0
- linkml_reference_validator-0.2.1/docs/superpowers/plans/2026-06-12-modular-pdf-fulltext-fetching.md +2969 -0
- linkml_reference_validator-0.2.1/docs/superpowers/plans/2026-08-05-private-library-full-text.md +190 -0
- linkml_reference_validator-0.2.1/docs/superpowers/specs/2026-06-12-modular-pdf-fulltext-fetching-design.md +260 -0
- linkml_reference_validator-0.2.1/docs/superpowers/specs/2026-08-05-private-library-full-text-design.md +309 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/mkdocs.yml +2 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/pyproject.toml +1 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/cli/cache.py +373 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/lookup.py +3 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/shared.py +8 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/validate.py +66 -33
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/acquire.py +213 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/csl_export.py +73 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/__init__.py +16 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/base.py +64 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/html.py +46 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/pdf.py +67 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/extract/xml.py +46 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/__init__.py +23 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/base.py +70 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/epmc_preprint.py +142 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/json_api.py +135 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/loader.py +94 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/openalex.py +70 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/pmc.py +124 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/unpaywall.py +69 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/fulltext/zotero.py +252 -0
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/identifiers.py +81 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/reference_fetcher.py +384 -22
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/__init__.py +2 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/doi.py +34 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/pmid.py +111 -33
- linkml_reference_validator-0.2.1/src/linkml_reference_validator/etl/sources/ppr.py +159 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/url.py +43 -12
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/field_detection.py +43 -2
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/models.py +208 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/reference_validation_plugin.py +6 -1
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/supporting_text_validator.py +24 -4
- linkml_reference_validator-0.2.1/tests/data/test_data_deep_nesting_invalid.yaml +17 -0
- linkml_reference_validator-0.2.1/tests/data/test_data_deep_nesting_valid.yaml +23 -0
- linkml_reference_validator-0.2.1/tests/data/test_schema_deep_nesting.yaml +74 -0
- linkml_reference_validator-0.2.1/tests/test_acquire.py +224 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli.py +266 -0
- linkml_reference_validator-0.2.1/tests/test_cli_cache_enrich.py +227 -0
- linkml_reference_validator-0.2.1/tests/test_cli_cache_export.py +246 -0
- linkml_reference_validator-0.2.1/tests/test_deep_nesting.py +401 -0
- linkml_reference_validator-0.2.1/tests/test_doi_preprint.py +103 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_e2e_integration.py +58 -0
- linkml_reference_validator-0.2.1/tests/test_epmc_preprint_provider.py +196 -0
- linkml_reference_validator-0.2.1/tests/test_extractors.py +104 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_field_detection.py +47 -0
- linkml_reference_validator-0.2.1/tests/test_fulltext_loader.py +97 -0
- linkml_reference_validator-0.2.1/tests/test_fulltext_providers.py +175 -0
- linkml_reference_validator-0.2.1/tests/test_identifiers.py +56 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_models.py +54 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_optional_linkml_dependency.py +31 -3
- linkml_reference_validator-0.2.1/tests/test_ppr_source.py +125 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_reference_fetcher.py +542 -32
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_sources.py +191 -28
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_supporting_text_validator.py +65 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_title_validation.py +2 -0
- linkml_reference_validator-0.2.1/tests/test_unknown_slot_traversal.py +131 -0
- linkml_reference_validator-0.2.1/tests/test_validation_config.py +72 -0
- linkml_reference_validator-0.2.1/tests/test_zotero_provider.py +277 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/uv.lock +14 -0
- linkml_reference_validator-0.2.0/.github/workflows/claude-code-review.yml +0 -78
- linkml_reference_validator-0.2.0/src/linkml_reference_validator/cli/cache.py +0 -143
- linkml_reference_validator-0.2.0/tests/test_validation_config.py +0 -38
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.claude/.mcp.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.claude/settings.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.copier-answers.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.devcontainer/devcontainer.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.devcontainer/post_create.sh +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.editorconfig +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-code-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-issue-summarize-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/actions/claude-issue-triage-action/action.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/ai-controllers.json +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/copilot-setup-steps.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/dependabot.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-issue-summarize.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude-issue-triage.yml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/deploy-docs.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/main.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/pypi-publish.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.gitignore +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.goosehints +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.pre-commit-config.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.yamllint.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/AGENTS.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/BUG_GEO_ACCESSION_TO_UID.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/BUG_ZENODO_DOI_AND_URL_HANDLING.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CLAUDE.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CLI-ISSUES.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CODE_OF_CONDUCT.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/CONTRIBUTING.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/FEATURE_REQUEST_REPAIR.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/LICENSE +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/REVIEW2.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/REVIEW3.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/ai.just +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/copilot-instructions.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/about.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/content-types.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/concepts/how-it-works.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/elements/.gitkeep +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/add-reference-source.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/repair-validation-errors.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/skip-unsupported-references.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/use-local-files-and-urls.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-clinical-trials.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-dois.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-entrez.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-obo-files.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-titles.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/how-to/validate-urls.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/index.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/04_obo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/notebooks/05_geo_validation.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/quickstart.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/setup-guide.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/templates-linkml/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/todo.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/troubleshooting.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/docs/tutorials/complete-workflow.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/examples/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/justfile +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/mypy.ini +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/01_getting_started.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/02_advanced_usage.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/03_python_api.ipynb +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/notebooks/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/project/README.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/project.justfile +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/pytest.ini +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/_version.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/cli/repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/base.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/clinicaltrials.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/entrez.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/file.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/json_api.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/loader.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/sources/utils.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/etl/text_extractor.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/REVIEW.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/plugins/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/fuzzy_text_utils.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/src/linkml_reference_validator/validation/repairer.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/__init__.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/conftest.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_data_invalid.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_data_valid.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/data/test_schema.yaml +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/CLINICALTRIALS_NCT00000001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/GEO_GSE12345.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST002.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMC_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST001.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST001.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST002.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST002.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST003.md +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/PMID_TEST003.txt +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/fixtures/sample.obo +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli_lookup.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_cli_repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_clinicaltrials_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_fuzzy_suggestions.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_geo_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_json_api_source.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_plugin_integration.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_pmc_fulltext.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_real_validation.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_repair.py +0 -0
- {linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/tests/test_source_utils.py +0 -0
- {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@
|
|
38
|
+
uses: anthropics/claude-code-action@v1
|
|
39
39
|
with:
|
|
40
40
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
41
41
|
|
|
42
|
-
#
|
|
43
|
-
|
|
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
|
-
#
|
|
46
|
-
|
|
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
|
|
{linkml_reference_validator-0.2.0 → linkml_reference_validator-0.2.1}/.github/workflows/claude.yml
RENAMED
|
@@ -39,52 +39,24 @@ jobs:
|
|
|
39
39
|
|
|
40
40
|
- name: Run Claude Code
|
|
41
41
|
id: claude
|
|
42
|
-
uses: anthropics/claude-code-action@
|
|
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
|
-
#
|
|
70
|
-
# model
|
|
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
|
|
|
@@ -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
|
[]()
|
|
@@ -374,10 +395,36 @@ reference:
|
|
|
374
395
|
- `PMID:12345678`
|
|
375
396
|
- `12345678` (assumes PMID)
|
|
376
397
|
|
|
377
|
-
|
|
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
|
-
|
|
380
|
-
|
|
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
|
[]()
|
|
@@ -394,10 +374,36 @@ reference:
|
|
|
394
374
|
- `PMID:12345678`
|
|
395
375
|
- `12345678` (assumes PMID)
|
|
396
376
|
|
|
397
|
-
|
|
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
|
-
|
|
400
|
-
|
|
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:
|
|
Binary file
|
|
@@ -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
|
+

|
|
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)
|