# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
.Python
*.egg
*.egg-info/
dist/
build/
.eggs/
pip-wheel-metadata/
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
htmlcov/

# Virtual environments
.venv/
.venv-*/
venv/
env/

# Environment & secrets
.env
.env.*
!.env.example
!.env.docs.example

# Docker
docker/.env

# Config (local overrides)
config.json

# Cache
cache/

# MkDocs
site/

# Docs generated output
docs/plc/
docs-output/

# Obsidian
.obsidian/

# OS
.DS_Store
Thumbs.db

# IDE
.idea/
.vscode/
*.swp

# Claude Code (per-user; CLAUDE.md and .claude/skills/ stay committed)
CLAUDE.local.md
.claude/settings.local.json
.claude/worktrees/

# Benchmark results (one file per run; don't commit individuals)
bench/results/

# Default-name XAE projects (debris from accidentally opening XAE in the
# bench tree without naming the project — real fixtures use named dirs).
bench/fixtures/bug-hunting/TwinCAT Project*/
bench/fixtures/bug-hunting/Untitled*/

# Throwaway smoke fixtures (created on demand by smoke_*.py runners,
# never source-controlled; the scripts under bench/fixtures/bug-hunting/_author/
# regenerate them from scratch).
bench/fixtures/_smoke-*/

# Local server logs from bench setup
bridge.log
bridge.err.log
tckit-server.log
