# Environment variables and secrets
.env
.env.*
!.env.example

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

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

# Testing and coverage
.pytest_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.nox/
coverage.xml
test-results/

# Type checking and linting
.mypy_cache/
.dmypy.json
dmypy.json
.ruff_cache/
.pytype/

# Logs and temporary files
*.log
logs/
tmp/
temp/
*.tmp
*.bak

# Databases
var/
*.db
*.db-journal
*.db-wal
*.db-shm
*.sqlite
*.sqlite-journal
*.sqlite-wal
*.sqlite-shm
*.sqlite3
*.sqlite3-journal
*.sqlite3-wal
*.sqlite3-shm

# Jupyter Notebook
.ipynb_checkpoints/

# IDEs and editors
.vscode/
.idea/
*.swp
*.swo

# Operating systems
.DS_Store
Thumbs.db
Desktop.ini

# Node.js (if applicable)
node_modules/
npm-debug.log*
.next/
.nuxt/
.parcel-cache/

# AI models and generated data
models/
checkpoints/
*.gguf
*.safetensors

# Local runtime data. Root-anchored on purpose: a bare `storage/` would also match the framework's
# own `src/xyberos/storage/` package and swallow it.
/instance/
/storage/
/uploads/

# Documentation builds
# `site/` is the documentation site's tracked source, not its build output: MkDocs writes to
# `build/site` (covered by the `build/` rule above), because its default output directory is `site/`,
# which would build the site on top of its own source and hide `site.md` from every commit.
docs/_build/
# Two pages are generated by site/scripts/build.py from other content, so they are not committed:
# the roadmap is derived from the pages' own front matter, and `reference/` is a copy of `docs/`.
site/roadmap.md
site/reference/
# The published copy of the configuration schema, made from `src/xyberos/config.schema.json` by the
# same build. Generated for the same reason: two committed copies of one schema is one too many.
site/schema/
