# 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
MANIFEST

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

# Pytest / coverage
.pytest_cache/
.coverage
.coverage.*
htmlcov/
.cache/
.mypy_cache/
.ruff_cache/
.tox/
.nox/

# IDE
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db

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

# Hexa runtime (never committed — these are generated per-clone)
.hexa/
# ...except the copier template's own .hexa/ assets, which ARE shipped. They
# are tracked, so git keeps them either way — but copier's dirty-template
# overlay (`--vcs-ref HEAD` against a repo with ANY uncommitted change) copies
# the work tree MINUS gitignored paths, so without this re-include a rendered
# project silently loses .hexa/profile.yaml (tests/test_egress_render.py).
# (braces escaped: ruff's glob parser reads a bare `{{` as an alternate group)
!\{\{project_slug\}\}/.hexa/

# Local AI-tool artifacts (browser-session captures may hold sensitive pages)
.playwright-mcp/
.ai-sync/locks/*.lock
.ai-sync/locks/*.lock.hb
.ai-sync/KILL
.ai-sync/logs/
# Evidence the test suite writes into the package tree (a `git add -A` would
# otherwise sweep run noise into a commit — the root pattern above is anchored
# and does not reach this path).
hexa_swarm_core/.ai-sync/logs/
