# Environment + virtualenv
.env
.env.local
.env.*.local
.venv/
venv/
env/

# Infra console screenshots — the maintainer captures these per
# provisioning step for personal runbook trail; the committed
# infra/README.md carries every URL + ID + cap value the next
# maintainer needs, so screenshots stay local.
infra/screenshots/

# Editor / OS
.vscode/
.idea/
.cursor/
*.swp
*.swo
*~
**/.DS_Store
Thumbs.db
desktop.ini

# Python build artifacts
__pycache__/
*.pyc
*.pyo
*.pyd
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.nox/
build/
dist/
*.egg-info/
pip-wheel-metadata/

# Bundled docs copied from docs/ by hatch_build.py at build time.
# This directory is build output; committing it would create a second
# source of truth alongside docs/.
/src/roadmodel/data/

# Supabase CLI working dir: .temp/ holds the linked-project pooler URL (a DB
# connection SECRET) and project ref; migrations is a symlink to the canonical
# tracked infra/supabase/migrations/. Never commit this dir — `supabase db push`
# still reads it from disk. (Guards against an accidental `git add -A` leak.)
/supabase/

# Update run artifacts (transient outputs of update_models.py)
update/.last-summary.txt
update/.last-warnings.txt
update/.cache/

# Test fixtures regenerated from update/build_fixture.py (never committed).
# Hand-authored fixtures (cost_catalog.json) are whitelisted below.
tests/fixtures/*.json
!tests/fixtures/cost_catalog.json

# Local user-specific selector config (real subscription values, API-key state).
# The committed template is docs/user-context.example.md — copy it to
# docs/user-context.md and fill in your values.
/docs/user-context.md

# Deploy CLI artifacts (link state, local config)
.railway/
.vercel/

# Node / Next.js (Phase 3 Step 4 onward, in web/)
node_modules/
.next/
out/
.turbo/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Logs
*.log
logs/

# NOTE: /private/ (local-only planning docs) is excluded via .git/info/exclude
# rather than .gitignore so editor tooling (Cursor / VSCode @-pickers,
# fuzzy-find) still indexes the files locally while git continues to ignore
# them. The directory has already been scrubbed from history (commit 1b60bfb)
# and exists only on the maintainer's machine, so the per-clone exclude is
# sufficient.
.vercel
