.venv/
__pycache__/
*.pyc
*.egg-info/
dist/
build/
docs/_build/
.pytest_cache/
.ruff_cache/
.DS_Store

# marimo notebook session/output caches (regenerated by `marimo edit` / `marimo export`)
__marimo__/

# Large reference proteomes for source lookup are fetched, not committed
data/proteomes/
*.fasta
*.fasta.gz

# ...but shipped package data is never ignorable, whatever a glob above says. `mhci_pseudo.fa`
# escapes the *.fasta rule only by its extension; named .fasta it would have been silently
# untracked, and every fresh clone would ship a package that cannot load its own models.
!src/mhcmatch/data/**
# ...but bytecode is not package data. Without this carve-out the negation above re-adds
# data/__pycache__/*.pyc to the index, where they produce a spurious diff on every interpreter
# version and block `git worktree remove`. hatchling already keeps them out of the wheel.
src/mhcmatch/data/__pycache__/

# Obsidian memory-sync marker (machine-local absolute paths + sync hashes)
.claude/obsidian-sync.json

# per-feature git worktrees (see CLAUDE.md) — live inside the repo dir but are never committed
.claude/worktrees/

# `uv.lock` — a resolved graph for one machine, and this is a library, not an application. A
# consumer gets their dependencies from `pyproject.toml`'s ranges; a lockfile here binds nothing
# downstream and churns on every `uv sync`. It rode into the mouse-corpus branch unexamined
# (860 KB, 4,199 lines) and is excluded deliberately rather than by omission. Track it only if
# CI is ever made to install from it.
uv.lock
docs/_generated/
