# ── Python ────────────────────────────────────────────────
__pycache__/
*.py[cod]
*.pyo
*.pyd
.Python
*.egg-info/
dist/
build/
*.egg
.eggs/

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

# ── uv ────────────────────────────────────────────────────
.uv/

# ── Secrets / credentials ─────────────────────────────────
services/**/.env
*.env
!services/**/.env.example
!.env.example
# SeaweedFS S3 identity (real secret) — track only the placeholder template.
services/**/s3_config.json
!services/**/s3_config.json.example

# ── Logs ──────────────────────────────────────────────────
logs/
*.log

# ── Node / frontend build artifacts (location-independent) ──
# Globbed so they match wherever the frontend lives (now src/docforge/app/frontend/).
**/node_modules/
**/frontend/dist/
# Stale .js outputs that shadow .tsx/.ts source — Vite resolves them with priority
# and serves an old bundle.  We're TS-only (tsconfig has noEmit); any .js under a
# frontend src/ is build artefact noise.
**/frontend/src/**/*.js
**/frontend/src/**/*.js.map
# NOTE: src/api/generated.ts is NOW committed (tracked) so the build is reproducible
# without a live backend — regenerate it with `npm run gen:types` after schema changes.

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

# ── Claude Code / AI dev tooling (kept LOCAL, never published) ──
# The whole .claude/ tree (agents, rules, commands, agent-memory, session data, knowledge graph)
# and the MCP client config are internal AI-assisted-workflow tooling — not part of the public repo.
.claude/
.mcp.json

# ── Alembic / migrations (keep structure, not generated) ──
# src/docforge/migrations/versions/*.py  # comment in to exclude

# ── Test artifacts ────────────────────────────────────────
.pytest_cache/
.coverage
htmlcov/
# Note: the synthetic test corpus under src/docforge/tests/corpus/documents/<ext>/ IS committed
# (deterministic, loaded at test time); it is regenerated via tests/corpus/generation/ when builders change.

# Vite dependency pre-bundling cache (regenerated by the dev server)
**/.vite/

# Playwright MCP session artifacts (snapshots / console logs from browser-driven checks)
.playwright-mcp/

# The pipeline BUILD module (blob models + PipelineBuilder) is SOURCE, not a build
# artifact - re-include it from the global build/ rule above.
!src/docforge/shared/libs/pipelines/build/
!src/docforge/shared/libs/pipelines/build/**

# The build/ unit-test package mirrors that source module - also SOURCE, not an artifact.
!src/docforge/tests/units/build/
!src/docforge/tests/units/build/**
src/docforge/app/frontend/scripts/node_modules/

# UI-screenshot dev tooling — internal, kept private like .claude/ (Playwright-via-Docker recipe).
src/docforge/app/frontend/scripts/ui-shot.mjs
src/docforge/app/frontend/scripts/*.png
src/docforge/app/frontend/UI-SCREENSHOT.md

# Retired AI agent-memory snapshots — internal, not part of the public docs.
docs/archive/agent-memory-legacy/

# Root AI project instructions — local dev tooling, kept private (like .claude/).
/CLAUDE.md

# Docker Compose interpolation vars (copied from .env.example) — may hold local pins
/.env
