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

# Virtual environments
.venv/
venv/
env/

# Graph database
*.db
*.db-journal
*.db-wal
*.db-shm
.code-review-graph/

# IDE
.idea/
.vscode/
*.swp
*.swo
*~

# OS
.DS_Store
Thumbs.db

# Secrets / env
.env
.env.*

# Claude Code
.claude/

# Coverage
htmlcov/
.coverage
.coverage.*
coverage.xml

# pytest
.pytest_cache/

# Ruff
.ruff_cache/

# mypy / ty
.mypy_cache/

# Medium article
medium/

# Superpowers brainstorm
.superpowers/

# Worktrees
.worktrees/

# Generated files
*_e2e_result.json
docs/superpowers/

# AI traces (public repo hygiene)
# Conversation traces and scratch output from automated contributors stay out
# of the repo. The two decision logs below are the deliberate exception: they
# are instruction input that those tools read from a checkout, so they only
# work if they live here, and they are written as technical documentation
# (commit anchors, measurements, query plans) rather than as a record of any
# conversation. Listed by name so new files under .jules/ stay ignored by
# default.
#
# Both patterns end in `/*` rather than `/` because git cannot re-include a
# file whose parent directory is itself excluded. `.Jules/*` needs the same
# treatment as `.jules/*`: on a case-insensitive filesystem (Windows, macOS)
# core.ignorecase makes `.Jules/` match this same directory, which would
# re-exclude it after the negations and silently break the exception.
.jules/*
.Jules/*
!.jules/bolt.md
!.jules/sentinel.md
.superpower/
clean.ps1

# Bot/merge junk artifacts (prevent accidental commits) — 2026-06-07
*.orig
*.rej
*.cover
*.bak
/*.patch
/*.diff
