# Byte-compile / cache
__pycache__/
*.py[cod]
*$py.class
*.so
.Python

# Virtual environments
.venv/
venv/
ENV/
env/

# Environment / secrets (never commit)
.env
.env.*
!.env.example
llm-help.md
*.pem
*.key
credentials.json
service-account*.json
.secrets/

# Distribution / packaging
build/
dist/
develop-eggs/
downloads/
eggs/
.eggs/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
pip-wheel-metadata/

# Test / coverage / linters / type checkers
.pytest_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.nox/
coverage.xml
*.cover
.hypothesis/
.mypy_cache/
.dmypy.json
dmypy.json
.ruff_cache/
.cache/

# Jupyter
.ipynb_checkpoints/

# IDE / editors
.idea/
.vscode/
*.swp
*.swo
*~
*.code-workspace

# OS junk (Windows / macOS / Linux)
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
Desktop.ini
$RECYCLE.BIN/

# Local run outputs (keep committed examples/)
/out/
/output/
/tmp/
/temp/

# Artifacts CleanFrame writes next to an input file. The sample recipe and schema
# under examples/ are committed on purpose and are already tracked.
*.report.html
*.clean.csv
*.clean.tsv
*.clean.xlsx
*.clean.json
*.clean.parquet
*.quarantine.csv
*.patched.yaml
*.cf-tmp
examples/messy_customers.recipe.yaml
examples/messy_customers.schema.yaml
!examples/customer.recipe.yaml
!examples/customer.schema.yaml
