# Python
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
build/
dist/

# Generated at wheel-build time by tools/bundle_data.py (Hatchling hook);
# the source of truth is the repo-root templates/ dir, not this copy.
src/eawf/_data/
.pytest_cache/
.ruff_cache/
.mypy_cache/
.coverage
htmlcov/
# mutmut rewrites source + writes its CI/CD stats into this sandbox dir
# at the repo root when a mutation campaign runs locally.
mutants/

# uv
.venv/

# mkdocs build output (the published site is built in CI, not committed).
site/

# OS / IDE
.DS_Store
.idea/
.vscode/
*.swp

# Eä-managed surface:
#  - AGENTS.md is committed (managed by `eawf sync`; user-region preserved
#    on re-render).
#  - CLAUDE.md + .claude/ stay gitignored permanently — these are
#    machine-specific renders of the CC plugin tree (run
#    `eawf plugin install claude` locally to regenerate). Only AGENTS.md
#    is the committed agent contract.
CLAUDE.md
.claude/
.opencode/

# .ea/ — state.json + config.yaml + store/*.jsonl are committed; locks +
# local scratch + manifest cache + instrument-probe cache + worktrees +
# state migration backups are not.
.ea/locks/
.ea/local/
.ea/indexes/
.ea/instrument-probe.json

# Telemetry / SQLite databases — telemetry.db embeds absolute cwd +
# session_log_path, so it must never be committed. The bare glob covers
# any *.db written anywhere in the tree (telemetry, scratch probes).
*.db
.ea/telemetry.db

# Per Q13 (operator decision 2026-05-18): worktrees live under .ea/worktrees/
.ea/worktrees/

# State migration backups (kept locally during migration; not committed).
# Forward-fix is the canonical recovery path. The bare glob covers backups
# written adjacent to any resolved state.json, not just the .ea/ default.
.ea/state.json.bak.*
state.json.bak.*

# Secrets
.env
*.pem
*.key
secrets/
