Metadata-Version: 2.4
Name: antilibrary
Version: 0.3.7
Summary: Manage BibTeX libraries from the terminal
Project-URL: Homepage, https://github.com/vxvware/antilibrary
Project-URL: Repository, https://github.com/vxvware/antilibrary
Project-URL: Issues, https://github.com/vxvware/antilibrary/issues
Author-email: VxVware <trevor.j.vincent@gmail.com>
License-Expression: MIT
Keywords: bibliography,bibtex,citations,cli,research
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: End Users/Desktop
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Text Processing :: Markup :: LaTeX
Classifier: Topic :: Utilities
Requires-Python: >=3.11
Requires-Dist: bibtexparser>=2.0.0b7
Requires-Dist: rapidfuzz>=3.0
Requires-Dist: rich>=13.0
Provides-Extra: all
Requires-Dist: antifile<0.2,>=0.1; extra == 'all'
Requires-Dist: antifind<0.2,>=0.1; extra == 'all'
Provides-Extra: dev
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.4; extra == 'dev'
Provides-Extra: files
Requires-Dist: antifile<0.2,>=0.1; extra == 'files'
Provides-Extra: search
Requires-Dist: antifind<0.2,>=0.1; extra == 'search'
Description-Content-Type: text/markdown

<p align="center">
  <img src="logo/antilibrary_logo_with_text_red_anti.png" alt="antilibrary" width="200">
</p>

# antilibrary

Manage a BibTeX file from the terminal.

## Install

```bash
pip install antilibrary
# or
uv tool install antilibrary
```

## Usage

Antilibrary manages one or more **libraries** — each a `.bib` file with an
optional folder for associated files (PDFs, EPUBs, …). Libraries live in
`~/.config/antilibrary/config.toml` (override with `$ANTILIBRARY_CONFIG`).

```bash
# Register a library (the first one becomes the default)
antilibrary library add main --bib ~/refs/main.bib --files ~/refs/files
antilibrary library add movies --bib ~/media/movies.bib   # no files folder

antilibrary library list                 # show configured libraries
antilibrary library set-default movies   # change the default
antilibrary library remove movies        # forget a library (add --purge to delete its files)
```

Once a default is set, the entry commands operate on it. Use `-l/--library NAME`
to target another:

```bash
antilibrary add                          # interactively add an entry
antilibrary add -l movies                # add to the movies library
antilibrary get smith2024                # print citation for a key
antilibrary browse                       # list entries
antilibrary browse -q "attention"        # fuzzy search
antilibrary browse -t "nlp,transformers" # filter by tags
antilibrary remove smith2024             # delete an entry (+ its managed file)
```

The library is resolved in this order: `-l/--library NAME`, then `-f/--file FILE`
(ad-hoc, no files folder), then `$ANTILIBRARY_BIB`, then the configured default.

### Associated files

If a library has a `files` folder, attaching a file copies it there and renames
it to the entry's key (e.g. `smith2024.pdf`); the entry's `file` field stores the
relative name. If the library has no `files` folder, the file is left in place and
`file` stores its absolute path. Removing an entry deletes its managed file (pass
`--keep-file` to keep it).

```bash
antilibrary add --attach ~/Downloads/paper.pdf   # attach during interactive add
```

### Citation styles

`antilibrary get KEY --style {bibtex|bibtex-full|latex|org-cite|pandoc}` prints
a citation in the requested format:

| style          | output                  |
|----------------|-------------------------|
| `bibtex`       | `smith2024`             |
| `bibtex-full`  | the whole entry         |
| `latex`        | `\cite{smith2024}`      |
| `org-cite`     | `[cite:@smith2024]`     |
| `pandoc`       | `[@smith2024]`          |

## Adding entries

`antilibrary add` is interactive — it prompts for type, title, author, year,
key, and any extra fields. Adding an entry that matches an existing one
(by DOI, arXiv ID, ISBN, or normalized title+author) silently fills any
empty fields on the existing entry rather than creating a duplicate. Pass
`--no-merge` to skip on duplicate, or `--force` to append anyway with an
auto-suffixed key.

### Bulk add from files or online search

Antilibrary integrates with its two companion tools:

- **antifile** — extract BibTeX from PDFs, EPUBs, URLs, DOIs, arXiv IDs, or ISBNs.
- **antifind** — online search (movies, TV, music, papers, books) → BibTeX.

Install them as extras:

```bash
pip install 'antilibrary[files]'    # antifile
pip install 'antilibrary[search]'   # antifind
pip install 'antilibrary[all]'      # both
```

Then add entries in bulk. Files that resolve to a real path are attached using
the library's files-folder rules:

```bash
antilibrary add --add-from-files paper.pdf book.epub 10.1145/3292500
antilibrary add --add-from-search "attention is all you need" --kind papers --limit 3
```

For PDFs, antifile resolves metadata by identifier (DOI / arXiv / ISBN) or a
CrossRef title match. When none of those work it falls back to an LLM: set
`ANTHROPIC_API_KEY` (or `OPENAI_API_KEY` / `GEMINI_API_KEY`) and that key is
passed through. With no key set, it still tries the `claude` CLI if it's on your
PATH.

## License

MIT
