# Build directories
build/
dist/

# Test artifacts
tests/*.png
tests/*.csv
tests/output/

# Python
__pycache__/
*.py[cod]
*.egg-info/
dist/
.eggs/
pip-wheel-metadata/
.venv/
venv/
.env
.env.local
.env.*.local
.ipynb_checkpoints/

# pytest / coverage
.pytest_cache/
.coverage
htmlcov/
# Hypothesis writes its own nested .gitignore, but hatchling's sdist
# builder only reads this root file — without this line `uv build` sweeps
# the whole example database into the tarball.
.hypothesis/

# Linting / type-checking
.mypy_cache/
.dmypy.json
.ruff_cache/

# Scratch / local directories
scratch*/
.cache/

# macOS
.DS_Store

# VS Code
.vscode/

# JetBrains (CLion etc.)
.idea/

# Vim / Neovim
*.swp
*.swo
*~
.netrwhist
*.un~
Session.vim
*.vim.session
.nvim/
.nvimrc.lua

# LLM config
CLAUDE.local.md
.claude/
.cursorrules
.cursor/
.copilot/
copilot-instructions.md

# Internal development notes (agent loop specs, test-audit scoreboards).
# Kept out of the public repo; local copies live outside the tree.
autoresearcher-*.md
scoreboard-*.tsv
pypic-review.md

# MkDocs
site/

# uv — uv.lock IS committed (see .github/workflows/ci.yml for why)

# Output and data files
*.h5
*.hdf5
*.dat
*.log
*.png
!docs/assets/*.png
# examples/ holds both committed example scripts and local scratch
# simulation data. Ignore the data, not the directory — a blanket
# `examples/*` allowlist meant a new example was silently untracked and
# `git add` failed without saying why.
examples/*/
examples/*.h5
examples/*.hdf5
examples/*.dat
examples/*.out
examples/*.m
# Local working notes, kept out of the public tree.
examples/NOTES-*.md
examples/ipic3d-grid.md
examples/ipic3d-double-harris-setup.md

# Test fixture data (small, committed)
!tests/data/
!tests/data/**
# The negation above re-includes everything under tests/data/, which
# overrides the blanket .DS_Store rule — so re-exclude it explicitly.
tests/data/.DS_Store
