__pycache__/
.pytest_cache/
.coverage*
*.pyc
*.pyo
*.pyd
.Python
build/
dist/
out/
*.egg-info/
src/*.egg-info/
.venv/
venv/
.env
.env.*
!.env.example
.DS_Store
src/browsertap_mcp/chrome_extension/config.js
*.log
log
temp_desktop.png

# browser state and user-derived data
.browsertap/
browser-profile*/
profiles/
sessions/
downloads/
screenshots/
test-results/
*.har
cookie*.json
cookies*.json
junit*.xml
coverage.xml

# local agent/acceptance material
#
# `AGENTS.md` itself is tracked: it is the contributor-facing document every
# agent reads. Machine-specific notes -- absolute paths, which browser profile is
# in use, how one maintainer's skill manager is wired -- go in `AGENTS.local.md`,
# which stays untracked so that none of it reaches a public tree.
.superpowers/
artifacts/
AGENTS.local.md
CLAUDE.md
BUGREPORT.md
SPEC.md
DELIVER.md
# Whole directory, not just `plans/`. The three files under `specs/` were tracked
# and shipped 686 lines of internal design notes -- named after the private
# framework that produced them, linked from nothing in README, and useful only to
# whoever was mid-implementation. They stay on disk for that person and out of the
# published tree. Design decisions a reader needs are in README, CONTRIBUTING and
# AGENTS.md; anything here that outlives its task belongs there instead.
docs/superpowers/

# local scratch files, repository root only
#
# Anchored with a leading slash on purpose. Unanchored, `_*.json` matches at
# every depth, so a real fixture like `tests/fixtures/_expected.json` would
# vanish from `git status` and never make it into a commit -- the build would
# still pass locally and a clone would be missing the file. There is
# deliberately no `_*.py` rule in any form: it would hide
# `src/browsertap_mcp/_version.py`, the single source of the release version.
/_*.json
/_*.txt
/_*.md

# local MCP client wiring
#
# This project is an MCP server, so a maintainer testing it naturally drops a
# client config into the repository root. Those files carry an absolute
# interpreter path and sometimes an API key in `env`, which is machine
# configuration and occasionally a secret -- neither belongs in a public tree.
# `.claude/` and `.github/` are deliberately not ignored: agent skills and
# workflows are part of the published surface.
.mcp.json
.vscode/
.idea/
.cursor/mcp.json
.gemini/settings.json

# local agent permission state, and backups of it
#
# `.claude/` is deliberately absent from the list above: a project's agent skills
# and commands are part of the published surface. `settings.local.json` is the
# opposite -- it records one machine's permission decisions, which means absolute
# interpreter paths, home-directory read allowances and the names of the other
# local MCP servers that machine runs. It was covered only by whatever global
# ignore file the maintainer happened to have, and the backup an agent tool
# writes when it switches permission modes
# (`.claude/settings.local.json.bak-bypass`) was covered by nothing at all: it
# sat untracked and unignored, one `git add -A` away from being published.
# `*.bak-*` is the general form -- a backup of a local config is local too.
.claude/settings.local.json
.claude/settings.local.json.*
*.bak-*
*.bak

# local test/build caches that are safe to regenerate
htmlcov/
.mypy_cache/
.ruff_cache/
.tox/

# supply-chain scan output, all regenerated by .github/workflows/supply-chain.yml
#
# Comments stay on their own line: a trailing comment on a pattern line becomes
# part of the pattern and silently matches nothing. `*-venv/` covers the
# throwaway environments the SBOM and the install check build, because `venv/`
# above matches that exact name only.
*-venv/
sbom/
runtime-requirements.txt
pip-audit.*
gitleaks
gitleaks.tar.gz
gitleaks-*.json
