# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
/lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

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

# uv
.uv/
# uv.lock is committed for reproducible builds

# IDEs
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store

# Testing
.pytest_cache/
.coverage
htmlcov/
*.cover

# Type checking
.mypy_cache/
.dmypy.json
dmypy.json

# Promptfoo data
.promptfoo/results/
*.promptfoo.db
promptfoo.db*
evalLastWritten
cache/

# Promptfoo generated configs (dynamically created, don't track)
promptfooconfig.yaml
promptfoo.yaml
promptfooconfig_*.yaml
*-dataset.yaml
*_dataset.yaml
*-eval-config.yaml
*_eval_config.yaml
backend/datasets/*.yaml
backend/*.yaml
test_*.yaml

# Logs
*.log

# Environment variables
.env
.env.*
!.env.keys.example
.env.local
.env.keys
.env.production

# Temporary files
*.tmp
.temp/

# Node.js
node_modules/
.next/
.turbo/
out/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Database
*.db
*.db-shm
*.db-wal
chat.db

# User data directory (per-user datasets, judges, configs, promptfoo.db)
backend/users/

# Vision/strategy documents (keep local)
VISION.md
VISION.docx

# Terraform
*.tfplan
tfplan
*.tfstate
*.tfstate.*
.terraform/
terraform.tfvars

# Local tool installs (deploy.sh auto-installs terraform/kubectl/helm here)
.tools/
.claude/*
# Track repo-scoped skills (read by Claude Code, Cursor, Codex, etc. —
# see https://code.claude.com/docs/en/skills). Everything else under
# .claude/ (sessions, worktrees, cache, settings) stays local.
!.claude/skills/
!.claude/skills/**

# Project-scope MCP config — must not be committed: it shadows users' user-scope
# eval-mcp install for anyone who cd's into this repo (Claude Code scope
# precedence: local > project > user). Contributors who want to dogfood from
# source can create one locally; see docs/DEVELOPMENT.md.
.mcp.json

# Local eval log artifacts (synced via S3)
logs/
