Releases: musharna/ghostcite
Releases · musharna/ghostcite
Release list
v0.5.0
Added
- Multi-file and directory input: the CLI now accepts one or more paths, and a
directory is walked recursively for*.bib/*.md(hidden dirs like.git
skipped). This makes the GitHub Action's defaultpaths: .work as documented.
When more than one file is scanned, findings are attributed with their filename
(textpath:Lnn, JSONfilefield). The pre-commit hook now passes staged
filenames automatically (pass_filenames: true).
Fixed
--fail-onnow errors on an unknown tier name instead of silently dropping it
(a typo like--fail-on retractionshad turned the CI gate into a no-op).- DOI cache round-trip no longer drops the preprint flags (
is_preprint,
has_preprint_relation); a preprint served from a warm cache is now downgraded
identically to a cold lookup (restores determinism). - Markdown/DOI-list entries (which carry no parsed title) no longer emit a
misleading "possibly wrong DOI" verdict on an author mismatch; they fall back to
the neutral "CrossRef first author is …" message. - DOIs are URL-encoded before being spliced into CrossRef/OpenAlex/
doi.orgrequest
URLs, so a DOI containing#(or other URL-significant characters) is no longer
silently truncated into a different query. --json --dry-runnow emits valid JSON instead of a plain-text line.
Packaging / CI
- Release workflow gains a test gate (
buildneedstest), so a tag pushed on a
red tree cannot publish. Action inputs are passed viaenv:(no shell
interpolation), the Action'spip installis pinned, and thev1major tag is
force-moved to each release commit. .claude/is git-ignored and excluded from the sdist (was leaking local
worktrees intouv buildartifacts). Added theTyping :: Typedclassifier.test_semantic_live.pygains thelivemarker so the weekly live-tests
workflow actually collects it (and that workflow now setsGHOSTCITE_LIVE=1).
v0.4.0
Added
- Venue-mismatch tier
V(warn-only, opt-in): flags a cited journal/venue that disagrees with
CrossRef's container-title, using abbreviation-tolerant matching (so "J. Mol. Biol." vs
"Journal of Molecular Biology" does not fire). Informational by default; add--fail-on venue
to gate on it. Suppressed when an author/title mismatch already fired. - Preprint ↔ published awareness: a year difference that is explained by the DOI being a preprint
(or having a preprint/published relation) is downgraded from a CI-failing year mismatch to a
non-failing informational finding. - Dead-DOI resolution probe: when a DOI is absent from CrossRef, a
HEAD https://doi.org/<doi>
distinguishes "dead/fabricated DOI" from "resolves but not in CrossRef" in the Tier U message.
Best-effort, never fails CI on its own;--no-doi-probeskips it for fully offline runs. --badge <path>: writes a shields.io endpoint badge JSON (citation health) keyed to the active
--fail-onthreshold (green/clean vs red/N issues). Warn-only tiers do not turn it red.--cross-checknow accepts a comma-separated list and adds openalex as a second source of
truth (mirroring the PubMed pass: corroborate/conflict, raise findings CrossRef missed, and
OR-combine retraction).--cross-check pubmedis unchanged;--cross-check pubmed,openalex
runs both. Optional--openalex-mailto/OPENALEX_MAILTOfor the polite pool.
v0.1.0
Initial release.
Added
- CrossRef author/year cross-check: compares each citation's claimed first-author
surname and year against CrossRef's canonical record for the DOI. - Input auto-detection for BibTeX, Markdown reference lists, and bare DOI lists
(override with--format {auto,bibtex,markdown,doi}). - Read the bibliography from stdin by passing
-as the filename
(e.g.cat refs.bib | ghostcite -). - Severity tiers: A (author mismatch), B (year mismatch), C (cosmetic fold-only),
R (retraction / expression-of-concern), U (unresolvable / not verifiable). - Retraction and expression-of-concern detection via CrossRef
updated-by/
update-to/relationmetadata. --cross-check pubmed: optional second source of truth via PubMed / NCBI
E-utilities. Corroborates or conflicts CrossRef findings, can raise findings
CrossRef missed, and supplies records for DOIs absent from CrossRef. Honors
--ncbi-email/--ncbi-api-key(orNCBI_EMAIL/NCBI_API_KEY) for NCBI
etiquette and a higher rate limit.- Proactive rate pacing: self-throttles to CrossRef's advertised rate limit (read
from response headers);--max-rpsto cap further. --color {auto,always,never}colorized tier glyphs, honoringNO_COLOR.- No-DOI entries resolved by best-effort bibliographic search, flagged
low-confidence and never escalated above a warning on their own. --jsonmachine-readable output,--dry-runparse-and-count (no network), and
--fail-onCI gate to select which tiers force a non-zero exit.--versionflag andpython -m ghostcitemodule entry point.- Composite GitHub Action (
musharna/ghostcite@v1) for drop-in CI usage. - Exit-code policy:
0clean,1findings at/above the fail threshold,2tool
error (network down, unparseable input).