.DS_Store
__pycache__/
*.pyc
.venv/
.vscode/
.idea/
.env
*.log

# Lint/test caches
.ruff_cache/
.mypy_cache/
.pytest_cache/

# Coverage data. The `.coverage.*` glob is not redundant: `[tool.coverage.run]`
# sets `parallel = true` for xdist, so each worker writes its own
# `.coverage.<host>.<pid>.<rand>` before they are combined.
.coverage
.coverage.*
htmlcov/
coverage.xml

# Deliberately not committed: a lockfile here would pin nothing a user gets.
# brew installs resolve through the tap formula's own `resource` blocks, and
# PyPI installs resolve `textual>=8.2.8` themselves — wheels don't carry a lock.
# Everything that affects reproducibility is already exact-pinned where it is
# read: `[dependency-groups] dev` and each pre-commit hook's `rev` +
# `additional_dependencies`. Committing one would add a second pin that can
# disagree with the formula's.
uv.lock

# Editor swap/backup files
*~
*.swp
*.swo

# Per-worktree planning scratch
PLAN.md
plan.md

# ./dev.sh sandbox (COCKPIT_HOME + TMPDIR for a dev run); re-seeded every run
.cockpit-dev/
