# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv

# Coverage data, written by `pytest --cov` (CI runs it, T006).
.coverage
.coverage.*
htmlcov/
coverage.xml

# Dev stack (compose.yaml, docker/dev, scripts/). Paths and ids, written
# on first use by scripts/_lib.sh; .env.example is the committed one.
.env

# What the examples make. `gamedev` writes one HTML file per game here,
# and `claude_acp` and `docker_acp` keep their scratch projects under it;
# an untracked scratch directory is a dirty checkout, which is what the
# driver's `prepare` refuses to branch from (AGENTS.md).
/output/

# Local agent state. `.claude/settings.local.json` is Claude Code's
# machine-local permission list — the `.local` half of its settings pair,
# which is per-checkout and per-operator and not this repository's
# configuration. Ignored for the same reason `.env` and `.athanore/` are:
# an untracked file is a dirty checkout, which `feature`'s `prepare`
# refuses to branch from (AGENTS.md).
/.claude/

# Local server state. `operator_token` lives in .athanore/token and is
# refused in athanore.toml (12 §Auth).
athanore.db
athanore.db-shm
athanore.db-wal
.athanore/

# Frontend (T007 onward). The wheel ships athanore/web/dist via hatch
# `artifacts`, so the build output is ignored but the directory is not.
# pnpm resolves the workspace root from pnpm-workspace.yaml, so it writes
# a node_modules/ beside it as well as in web/; the checkout is also
# where pnpm parks its content-addressable store, because the store it is
# configured with in the dev container is on a different filesystem from
# the bind-mounted worktree and hardlinks cannot cross it.
/node_modules/
/.pnpm-store/
web/node_modules/
web/dist/
web/test-results/
web/coverage/
web/playwright-report/
athanore/web/dist/*
!athanore/web/dist/
!athanore/web/dist/.gitkeep

# The built docs site (`site_dir` in docs/site/mkdocs.yml). The `build/`
# rule at the top of this file already matches it; it is named here
# because a reader looking for where the site goes should find it.
docs/site/build/

# The operator's scratch TODO: wants that are deliberately not spec. Ignored
# rather than untracked so it can be edited *during* a run — `feature`
# refuses a dirty checkout with `git status --porcelain`, which counts
# untracked files but never ignored ones.
TODO.md

# Git worktrees the `feature` and `quick` workflows build in, one per run
# (`workflows/shared/sandbox.py`). Inside the checkout so the container's
# bind mount carries them; a merged run removes its own.
/.worktrees/
