# Claude / Serena
.claude
.local
.serena

# Python bytecode
__pycache__/
*.py[cod]
*$py.class

# Distribution / packaging
*.egg-info/
*.egg
.eggs/
dist/
build/
*.whl
*.so
sdist/
wheels/
*.tar.gz

# Virtual environments
.venv/
venv/
ENV/

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

# Testing / coverage
.pytest_cache/
.coverage
.coverage.*
coverage.xml
htmlcov/
.tox/
.nox/

# Linting / type checking
.mypy_cache/
.ruff_cache/
.dmypy.json

# IDEs / editors
.idea/
.vscode/
*.swp
*.swo
*~
.project
.settings/

# OS files
.DS_Store
Thumbs.db

# Tool output
transcoded/

# Docs build
docs/build/
# Disposable development scratch (also in global ignore; repeated here so a
# fresh clone on any machine ignores it without relying on a user's global file).
/docs/dev/tmp/

# Rust
src/rust/target/
src/rust/uv.lock

# Frontend
src/tools/bim/commands/serve/frontend/node_modules/
src/tools/bim/commands/serve/frontend/build/
src/tools/bim/commands/serve/frontend/.svelte-kit/
src/tools/bim/commands/serve/static/

# postup frontend (PRD 00065): unlike bim (which builds on-demand and ignores
# its build/), postup COMMITS its production build so the future `postup serve`
# (00067) can ship it without a node toolchain. So build/ is intentionally NOT
# ignored here — only the dev-only trees are. The negation re-includes it past
# the global `build/` packaging rule above.
src/tools/postup/adapters/web/frontend/node_modules/
src/tools/postup/adapters/web/frontend/.svelte-kit/
!src/tools/postup/adapters/web/frontend/build/

# KiroCrew / kiro-cli local state — ignore all except shared steering/specs
# (.kiro/* not .kiro/, so git still descends and the negations below take effect)
.kiro/*
!.kiro/steering/
!.kiro/specs/

# Agent material (.agents/): shared skills + autopilot records are TRACKED
# (canonical). Only locally-generated projections and live runtime are ignored.
# Locally-projected skill views (generated by tools/onboard, never committed).
# NO trailing slash: onboard projects by SYMLINK, which git treats as a FILE —
# a trailing-slash pattern matches dirs only and lets the symlink slip into
# `git add -A`.
/.claude/skills
/.kiro/skills
# Autopilot live controls only; sibling .agents/autopilot/records/ stays tracked.
/.agents/autopilot/runtime/
