sciwrite-lint 0.5.0__tar.gz → 0.5.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 (162) hide show
  1. {sciwrite_lint-0.5.0/sciwrite_lint.egg-info → sciwrite_lint-0.5.1}/PKG-INFO +21 -5
  2. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/README.md +20 -4
  3. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/pyproject.toml +1 -1
  4. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/__init__.py +1 -1
  5. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/manuscript_store.py +6 -1
  6. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/tex_parser.py +74 -0
  7. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1/sciwrite_lint.egg-info}/PKG-INFO +21 -5
  8. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/LICENSE +0 -0
  9. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/__main__.py +0 -0
  10. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/_network.py +0 -0
  11. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/api.py +0 -0
  12. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/api_keys.py +0 -0
  13. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/__init__.py +0 -0
  14. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/_diagnostics.py +0 -0
  15. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/_section_utils.py +0 -0
  16. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/cite_purpose.py +0 -0
  17. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/claim_support.py +0 -0
  18. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/cross_section_consistency.py +0 -0
  19. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/dangling_cite.py +0 -0
  20. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/dangling_ref.py +0 -0
  21. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/full_paper_consistency.py +0 -0
  22. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/internal_consistency_pairs.py +0 -0
  23. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/prose_quality.py +0 -0
  24. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/ref_internal_checks.py +0 -0
  25. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/reference_accuracy.py +0 -0
  26. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/reference_exists.py +0 -0
  27. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/reference_unreliable.py +0 -0
  28. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/registry.py +0 -0
  29. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/retracted_cite.py +0 -0
  30. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/structure_promises.py +0 -0
  31. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/checks/unreferenced_figure.py +0 -0
  32. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/claims.py +0 -0
  33. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/claude_cli.py +0 -0
  34. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/__init__.py +0 -0
  35. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/_common.py +0 -0
  36. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/check.py +0 -0
  37. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/config.py +0 -0
  38. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/fetch.py +0 -0
  39. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/__init__.py +0 -0
  40. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/_monitor.py +0 -0
  41. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/containers.py +0 -0
  42. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/dismiss_claim.py +0 -0
  43. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/grobid.py +0 -0
  44. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/init.py +0 -0
  45. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/override.py +0 -0
  46. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/parse.py +0 -0
  47. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/vision.py +0 -0
  48. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/misc/vllm.py +0 -0
  49. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/rank.py +0 -0
  50. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cli/verify.py +0 -0
  51. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/config.py +0 -0
  52. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/cross_paper.py +0 -0
  53. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/eval_claims.py +0 -0
  54. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/exceptions.py +0 -0
  55. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/footnote_urls.py +0 -0
  56. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/__init__.py +0 -0
  57. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/_common.py +0 -0
  58. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/_download.py +0 -0
  59. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/_orchestrator.py +0 -0
  60. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/_search.py +0 -0
  61. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/_validation.py +0 -0
  62. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/arxiv.py +0 -0
  63. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/biorxiv.py +0 -0
  64. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/core.py +0 -0
  65. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/eric.py +0 -0
  66. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/europepmc.py +0 -0
  67. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/hal.py +0 -0
  68. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/ideas.py +0 -0
  69. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/nasa_ads.py +0 -0
  70. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/nber.py +0 -0
  71. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/osf.py +0 -0
  72. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/pmc.py +0 -0
  73. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/s2.py +0 -0
  74. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/fulltext/unpaywall.py +0 -0
  75. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/latex_to_markdown.py +0 -0
  76. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/__init__.py +0 -0
  77. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/__init__.py +0 -0
  78. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/compute_cap.py +0 -0
  79. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/controller.py +0 -0
  80. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/decide.py +0 -0
  81. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/host_metrics.py +0 -0
  82. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/metrics_probe.py +0 -0
  83. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/registry.py +0 -0
  84. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/telemetry.py +0 -0
  85. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/vllm_metrics.py +0 -0
  86. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/concurrency_optimizer/wiring.py +0 -0
  87. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm/manuscript_cache.py +0 -0
  88. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/llm_utils.py +0 -0
  89. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/local_sources.py +0 -0
  90. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/mhtml.py +0 -0
  91. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/models.py +0 -0
  92. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/oa/__init__.py +0 -0
  93. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/oa/_models.py +0 -0
  94. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/oa/_pdf.py +0 -0
  95. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/oa/_search.py +0 -0
  96. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/oa/_web.py +0 -0
  97. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pdf/__init__.py +0 -0
  98. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pdf/grobid.py +0 -0
  99. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pdf/pdf_download.py +0 -0
  100. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/__init__.py +0 -0
  101. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/checks.py +0 -0
  102. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/claims.py +0 -0
  103. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/embeddings.py +0 -0
  104. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/fetch.py +0 -0
  105. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/orchestration.py +0 -0
  106. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/parse.py +0 -0
  107. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/pdf_context.py +0 -0
  108. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/ref_internal.py +0 -0
  109. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/runners.py +0 -0
  110. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/staged.py +0 -0
  111. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/swap.py +0 -0
  112. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/tracking.py +0 -0
  113. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/unreliable.py +0 -0
  114. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/verify.py +0 -0
  115. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/pipeline/vision.py +0 -0
  116. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/prompt_safety.py +0 -0
  117. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/py.typed +0 -0
  118. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/rate_limiter.py +0 -0
  119. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/__init__.py +0 -0
  120. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/_embed_timing.py +0 -0
  121. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/chain.py +0 -0
  122. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/citations.py +0 -0
  123. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/crossref.py +0 -0
  124. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/embedding_store.py +0 -0
  125. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/matching.py +0 -0
  126. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/metadata.py +0 -0
  127. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/reference_store.py +0 -0
  128. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/retraction_watch.py +0 -0
  129. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/__init__.py +0 -0
  130. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/_core.py +0 -0
  131. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/bib_checks.py +0 -0
  132. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/citation_metadata.py +0 -0
  133. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/claim_results.py +0 -0
  134. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/manuscript_check_cache.py +0 -0
  135. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/manuscript_citations.py +0 -0
  136. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/parse_cache.py +0 -0
  137. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/pipeline_stage.py +0 -0
  138. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/query_vectors.py +0 -0
  139. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/ref_internal.py +0 -0
  140. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/registry.py +0 -0
  141. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/references/workspace_db/vision_cache.py +0 -0
  142. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/report.py +0 -0
  143. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/schemas.py +0 -0
  144. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/scoring/__init__.py +0 -0
  145. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/scoring/contribution.py +0 -0
  146. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/scoring/scilint_score.py +0 -0
  147. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/usage.py +0 -0
  148. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vision/__init__.py +0 -0
  149. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vision/cache.py +0 -0
  150. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vision/describe.py +0 -0
  151. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vision/image_extraction.py +0 -0
  152. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vision/pipeline.py +0 -0
  153. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vllm/__init__.py +0 -0
  154. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vllm/metrics.py +0 -0
  155. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/vllm/vllm_server.py +0 -0
  156. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint/web.py +0 -0
  157. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint.egg-info/SOURCES.txt +0 -0
  158. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint.egg-info/dependency_links.txt +0 -0
  159. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint.egg-info/entry_points.txt +0 -0
  160. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint.egg-info/requires.txt +0 -0
  161. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/sciwrite_lint.egg-info/top_level.txt +0 -0
  162. {sciwrite_lint-0.5.0 → sciwrite_lint-0.5.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sciwrite-lint
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A linter for scientific manuscripts — reference verification, consistency checking, and structural validation.
5
5
  Author: Sergey Samsonau
6
6
  Maintainer-email: Authentic Research Partners LLC <info@arpconnect.com>
@@ -158,11 +158,11 @@ Three models — a vision model (Qwen3-VL-2B default, or 8B FP8 via `--vision-ba
158
158
  - **14-source full-text cascade** — early exit on first successful download across arXiv, Semantic Scholar, OpenAlex, PubMed Central, Europe PMC, Unpaywall, bioRxiv, NBER, RePEc/IDEAS, HAL, ERIC, NASA ADS, OSF Preprints, CORE
159
159
  - **Live monitoring** *(advanced)* — `sciwrite-lint containers monitor` shows service health, VRAM usage, and KV cache utilization in a terminal dashboard
160
160
 
161
- Full pipeline on a 50-reference paper: ~30 minutes initial (dominated by downloads and claim verification), minutes on cached reruns. The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU) — same code path on WSL2 and native Linux.
161
+ The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU).
162
162
 
163
163
  ## Install
164
164
 
165
- **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux is likely to work with GPU memory allocation tuning (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)). Not tested on macOS.
165
+ **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux uses the same GPU-sequencing code path with no extra configuration (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)), though it isn't actively tested. Not tested on macOS.
166
166
 
167
167
  Requires [uv](https://docs.astral.sh/uv/getting-started/installation/), a container runtime (podman or docker), CUDA drivers, and [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html).
168
168
 
@@ -207,6 +207,8 @@ sciwrite-lint containers start # start GROBID + vLLM (needs GPU for vLLM
207
207
  sciwrite-lint containers monitor # live dashboard: service health, VRAM, KV cache
208
208
  ```
209
209
 
210
+ `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
211
+
210
212
  ### WSL2: disable CUDA Sysmem Fallback (recommended)
211
213
 
212
214
  By default Windows silently spills GPU overflow into system RAM via PCIe (30–100× slower than VRAM); you'll see this as a sudden throughput collapse during the heaviest pipeline stages with no error in the logs. Tell the NVIDIA driver to fail loudly instead:
@@ -217,8 +219,6 @@ Driver 546.01+. After this, WSL2 behaves like native Linux on overflow (CUDA OOM
217
219
 
218
220
  ![Monitor dashboard](https://github.com/authentic-research-partners/sciwrite-lint/raw/main/docs/monitor.png)
219
221
 
220
- `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
221
-
222
222
  **Providing references manually — two drop folders.** sciwrite-lint reads two local directories before going to the open-access waterfall, kept separate because the folder itself signals how much to trust the source:
223
223
 
224
224
  - `local_pdfs/` — **academic sources**. Accepts `.pdf` (primary) and `.md` summaries you've written yourself. Use this for paywalled papers, for OA papers whose publisher requires a browser (Cloudflare/JS walls, Cell, Springer, some PMC pages), and for anything you'd cite as peer-reviewed evidence.
@@ -280,6 +280,22 @@ sciwrite-lint contributions --paper my_paper # add contribution axes to SciLi
280
280
  sciwrite-lint contributions paper.pdf # standalone file scoring
281
281
  ```
282
282
 
283
+ **Supported inputs.**
284
+
285
+ *The manuscript you check:*
286
+
287
+ | Format | Notes |
288
+ |---|---|
289
+ | `.tex` | LaTeX — hand-written, or pandoc-generated (e.g. from Markdown); pandoc's heading anchors are unwrapped automatically. |
290
+ | `.pdf` | Parsed via GROBID (container required). |
291
+
292
+ *Cited sources you optionally supply (drop folders — see [Setup](#setup)):*
293
+
294
+ | Folder | Accepts | Trust level |
295
+ |---|---|---|
296
+ | `local_pdfs/` | `.pdf`, `.md` (your own summaries) | academic |
297
+ | `local_web/` | `.mhtml` / `.mht`, `.md` | web capture |
298
+
283
299
  `check` runs the full pipeline in one command: text checks → figure analysis → LLM consistency → reference verification via APIs → download and parse cited papers → claim verification → consistency checks on cited papers → bibliography verification → aggregate reliability scores → SciLint Score. An initial run on a 50-reference paper takes up to 30 minutes (dominated by downloads and claim verification); subsequent cached runs complete in minutes.
284
300
 
285
301
  ### Iterative editing — no `--fresh` needed
@@ -92,11 +92,11 @@ Three models — a vision model (Qwen3-VL-2B default, or 8B FP8 via `--vision-ba
92
92
  - **14-source full-text cascade** — early exit on first successful download across arXiv, Semantic Scholar, OpenAlex, PubMed Central, Europe PMC, Unpaywall, bioRxiv, NBER, RePEc/IDEAS, HAL, ERIC, NASA ADS, OSF Preprints, CORE
93
93
  - **Live monitoring** *(advanced)* — `sciwrite-lint containers monitor` shows service health, VRAM usage, and KV cache utilization in a terminal dashboard
94
94
 
95
- Full pipeline on a 50-reference paper: ~30 minutes initial (dominated by downloads and claim verification), minutes on cached reruns. The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU) — same code path on WSL2 and native Linux.
95
+ The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU).
96
96
 
97
97
  ## Install
98
98
 
99
- **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux is likely to work with GPU memory allocation tuning (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)). Not tested on macOS.
99
+ **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux uses the same GPU-sequencing code path with no extra configuration (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)), though it isn't actively tested. Not tested on macOS.
100
100
 
101
101
  Requires [uv](https://docs.astral.sh/uv/getting-started/installation/), a container runtime (podman or docker), CUDA drivers, and [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html).
102
102
 
@@ -141,6 +141,8 @@ sciwrite-lint containers start # start GROBID + vLLM (needs GPU for vLLM
141
141
  sciwrite-lint containers monitor # live dashboard: service health, VRAM, KV cache
142
142
  ```
143
143
 
144
+ `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
145
+
144
146
  ### WSL2: disable CUDA Sysmem Fallback (recommended)
145
147
 
146
148
  By default Windows silently spills GPU overflow into system RAM via PCIe (30–100× slower than VRAM); you'll see this as a sudden throughput collapse during the heaviest pipeline stages with no error in the logs. Tell the NVIDIA driver to fail loudly instead:
@@ -151,8 +153,6 @@ Driver 546.01+. After this, WSL2 behaves like native Linux on overflow (CUDA OOM
151
153
 
152
154
  ![Monitor dashboard](https://github.com/authentic-research-partners/sciwrite-lint/raw/main/docs/monitor.png)
153
155
 
154
- `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
155
-
156
156
  **Providing references manually — two drop folders.** sciwrite-lint reads two local directories before going to the open-access waterfall, kept separate because the folder itself signals how much to trust the source:
157
157
 
158
158
  - `local_pdfs/` — **academic sources**. Accepts `.pdf` (primary) and `.md` summaries you've written yourself. Use this for paywalled papers, for OA papers whose publisher requires a browser (Cloudflare/JS walls, Cell, Springer, some PMC pages), and for anything you'd cite as peer-reviewed evidence.
@@ -214,6 +214,22 @@ sciwrite-lint contributions --paper my_paper # add contribution axes to SciLi
214
214
  sciwrite-lint contributions paper.pdf # standalone file scoring
215
215
  ```
216
216
 
217
+ **Supported inputs.**
218
+
219
+ *The manuscript you check:*
220
+
221
+ | Format | Notes |
222
+ |---|---|
223
+ | `.tex` | LaTeX — hand-written, or pandoc-generated (e.g. from Markdown); pandoc's heading anchors are unwrapped automatically. |
224
+ | `.pdf` | Parsed via GROBID (container required). |
225
+
226
+ *Cited sources you optionally supply (drop folders — see [Setup](#setup)):*
227
+
228
+ | Folder | Accepts | Trust level |
229
+ |---|---|---|
230
+ | `local_pdfs/` | `.pdf`, `.md` (your own summaries) | academic |
231
+ | `local_web/` | `.mhtml` / `.mht`, `.md` | web capture |
232
+
217
233
  `check` runs the full pipeline in one command: text checks → figure analysis → LLM consistency → reference verification via APIs → download and parse cited papers → claim verification → consistency checks on cited papers → bibliography verification → aggregate reliability scores → SciLint Score. An initial run on a 50-reference paper takes up to 30 minutes (dominated by downloads and claim verification); subsequent cached runs complete in minutes.
218
234
 
219
235
  ### Iterative editing — no `--fresh` needed
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sciwrite-lint"
7
- version = "0.5.0"
7
+ version = "0.5.1"
8
8
  description = "A linter for scientific manuscripts — reference verification, consistency checking, and structural validation."
9
9
  requires-python = ">=3.13,<3.14"
10
10
  license = "MIT"
@@ -2,7 +2,7 @@
2
2
 
3
3
  from sciwrite_lint.exceptions import LLMConnectionError, SciWriteLintError
4
4
 
5
- __version__ = "0.5.0"
5
+ __version__ = "0.5.1"
6
6
 
7
7
  from sciwrite_lint.oa import (
8
8
  DownloadResult,
@@ -450,12 +450,17 @@ def _build_context_latex(tex_path: Path, config: LintConfig) -> ManuscriptContex
450
450
  split_paragraphs,
451
451
  strip_comments,
452
452
  strip_non_prose_environments_preserve_lines,
453
+ unwrap_hypertarget,
453
454
  )
454
455
 
455
456
  # Read + strip_comments exactly once, then pass through to the
456
457
  # section/abstract extractors. They each used to re-read the file
457
458
  # and re-strip comments — three round trips for the same data.
458
- text = strip_comments(tex_path.read_text(encoding="utf-8"))
459
+ # unwrap_hypertarget normalises pandoc's two-line ``\hypertarget{id}{%
460
+ # \section{...}}`` heading envelope to plain LaTeX; without it the
461
+ # section splitter strands the opening brace in the prior section and
462
+ # pandoc rejects the unbalanced paragraph below.
463
+ text = unwrap_hypertarget(strip_comments(tex_path.read_text(encoding="utf-8")))
459
464
 
460
465
  raw_sections = analyze_sections_with_text(tex_path, text=text)
461
466
  abstract_raw = get_abstract_text(tex_path, text=text)
@@ -55,6 +55,80 @@ def strip_verbatim(text: str) -> str:
55
55
  return text
56
56
 
57
57
 
58
+ def unwrap_hypertarget(text: str) -> str:
59
+ r"""Unwrap pandoc ``\hypertarget{id}{content}`` envelopes to ``content``.
60
+
61
+ Pandoc renders every markdown heading as a two-line anchor wrapper::
62
+
63
+ \hypertarget{the-id}{%
64
+ \section{Title}\label{the-id}}
65
+
66
+ The opening ``\hypertarget{the-id}{`` and its matching ``}`` sit on
67
+ different lines, straddling the heading. Section splitting keys off the
68
+ ``\section`` line and assigns the line above it to the *preceding*
69
+ section, which strands the unbalanced opening brace at the end of that
70
+ section's body. Balanced-brace consumers downstream (the pandoc prose
71
+ conversion in ``paragraphs_to_markdown``) then choke on the lone brace.
72
+
73
+ The anchor is a hyperlink target with no prose meaning, so we drop the
74
+ wrapper and keep its content, normalising pandoc output to standard
75
+ LaTeX. Only the wrapper tokens are removed; newlines inside the content
76
+ are preserved, so source line numbers are unchanged. Nested wrappers are
77
+ handled (scanning continues inside each content span).
78
+ """
79
+ marker = "\\hypertarget{"
80
+ n = len(text)
81
+ delete_spans: list[tuple[int, int]] = []
82
+ i = 0
83
+ while True:
84
+ idx = text.find(marker, i)
85
+ if idx == -1:
86
+ break
87
+ # Skip the first argument {id} via balanced-brace matching.
88
+ j = idx + len(marker)
89
+ depth = 1
90
+ while j < n and depth > 0:
91
+ if text[j] == "{":
92
+ depth += 1
93
+ elif text[j] == "}":
94
+ depth -= 1
95
+ j += 1
96
+ # The two-arg form requires the content brace immediately after.
97
+ if j >= n or text[j] != "{":
98
+ i = j
99
+ continue
100
+ content_start = j + 1
101
+ depth = 1
102
+ k = content_start
103
+ while k < n and depth > 0:
104
+ if text[k] == "{":
105
+ depth += 1
106
+ elif text[k] == "}":
107
+ depth -= 1
108
+ k += 1
109
+ if depth != 0:
110
+ break # unbalanced input — leave the remainder untouched
111
+ # Remove "\hypertarget{id}{" and the matching content-closing "}".
112
+ delete_spans.append((idx, content_start))
113
+ delete_spans.append((k - 1, k))
114
+ # Resume inside the content so nested wrappers are also unwrapped.
115
+ i = content_start
116
+
117
+ if not delete_spans:
118
+ return text
119
+
120
+ # Nested wrappers append the outer closing brace before the inner
121
+ # spans, so sort before stitching the kept slices back together.
122
+ delete_spans.sort()
123
+ out: list[str] = []
124
+ prev = 0
125
+ for start, end in delete_spans:
126
+ out.append(text[prev:start])
127
+ prev = end
128
+ out.append(text[prev:])
129
+ return "".join(out)
130
+
131
+
58
132
  def extract_body(text: str) -> str:
59
133
  r"""Extract content between \begin{document} and \end{document}."""
60
134
  start = text.find("\\begin{document}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sciwrite-lint
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A linter for scientific manuscripts — reference verification, consistency checking, and structural validation.
5
5
  Author: Sergey Samsonau
6
6
  Maintainer-email: Authentic Research Partners LLC <info@arpconnect.com>
@@ -158,11 +158,11 @@ Three models — a vision model (Qwen3-VL-2B default, or 8B FP8 via `--vision-ba
158
158
  - **14-source full-text cascade** — early exit on first successful download across arXiv, Semantic Scholar, OpenAlex, PubMed Central, Europe PMC, Unpaywall, bioRxiv, NBER, RePEc/IDEAS, HAL, ERIC, NASA ADS, OSF Preprints, CORE
159
159
  - **Live monitoring** *(advanced)* — `sciwrite-lint containers monitor` shows service health, VRAM usage, and KV cache utilization in a terminal dashboard
160
160
 
161
- Full pipeline on a 50-reference paper: ~30 minutes initial (dominated by downloads and claim verification), minutes on cached reruns. The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU) — same code path on WSL2 and native Linux.
161
+ The pipeline automatically swaps vLLM containers to free GPU for embedding and vision stages (~50× faster than CPU).
162
162
 
163
163
  ## Install
164
164
 
165
- **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux is likely to work with GPU memory allocation tuning (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)). Not tested on macOS.
165
+ **Assumed setup:** A workstation with an NVIDIA GPU (16+ GB VRAM). Tested on WSL2 with NVIDIA driver 546.01+. Native Linux uses the same GPU-sequencing code path with no extra configuration (see [docs/services.md](https://github.com/authentic-research-partners/sciwrite-lint/blob/main/docs/services.md#embedding-device)), though it isn't actively tested. Not tested on macOS.
166
166
 
167
167
  Requires [uv](https://docs.astral.sh/uv/getting-started/installation/), a container runtime (podman or docker), CUDA drivers, and [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html).
168
168
 
@@ -207,6 +207,8 @@ sciwrite-lint containers start # start GROBID + vLLM (needs GPU for vLLM
207
207
  sciwrite-lint containers monitor # live dashboard: service health, VRAM, KV cache
208
208
  ```
209
209
 
210
+ `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
211
+
210
212
  ### WSL2: disable CUDA Sysmem Fallback (recommended)
211
213
 
212
214
  By default Windows silently spills GPU overflow into system RAM via PCIe (30–100× slower than VRAM); you'll see this as a sudden throughput collapse during the heaviest pipeline stages with no error in the logs. Tell the NVIDIA driver to fail loudly instead:
@@ -217,8 +219,6 @@ Driver 546.01+. After this, WSL2 behaves like native Linux on overflow (CUDA OOM
217
219
 
218
220
  ![Monitor dashboard](https://github.com/authentic-research-partners/sciwrite-lint/raw/main/docs/monitor.png)
219
221
 
220
- `init` detects `.tex` files and their `.bib` references and generates a `.sciwrite-lint.toml` config. Review to confirm the right files were detected.
221
-
222
222
  **Providing references manually — two drop folders.** sciwrite-lint reads two local directories before going to the open-access waterfall, kept separate because the folder itself signals how much to trust the source:
223
223
 
224
224
  - `local_pdfs/` — **academic sources**. Accepts `.pdf` (primary) and `.md` summaries you've written yourself. Use this for paywalled papers, for OA papers whose publisher requires a browser (Cloudflare/JS walls, Cell, Springer, some PMC pages), and for anything you'd cite as peer-reviewed evidence.
@@ -280,6 +280,22 @@ sciwrite-lint contributions --paper my_paper # add contribution axes to SciLi
280
280
  sciwrite-lint contributions paper.pdf # standalone file scoring
281
281
  ```
282
282
 
283
+ **Supported inputs.**
284
+
285
+ *The manuscript you check:*
286
+
287
+ | Format | Notes |
288
+ |---|---|
289
+ | `.tex` | LaTeX — hand-written, or pandoc-generated (e.g. from Markdown); pandoc's heading anchors are unwrapped automatically. |
290
+ | `.pdf` | Parsed via GROBID (container required). |
291
+
292
+ *Cited sources you optionally supply (drop folders — see [Setup](#setup)):*
293
+
294
+ | Folder | Accepts | Trust level |
295
+ |---|---|---|
296
+ | `local_pdfs/` | `.pdf`, `.md` (your own summaries) | academic |
297
+ | `local_web/` | `.mhtml` / `.mht`, `.md` | web capture |
298
+
283
299
  `check` runs the full pipeline in one command: text checks → figure analysis → LLM consistency → reference verification via APIs → download and parse cited papers → claim verification → consistency checks on cited papers → bibliography verification → aggregate reliability scores → SciLint Score. An initial run on a 50-reference paper takes up to 30 minutes (dominated by downloads and claim verification); subsequent cached runs complete in minutes.
284
300
 
285
301
  ### Iterative editing — no `--fresh` needed
File without changes
File without changes