*.swp *.*~ project.lock.json .DS_Store # Code-coverage output (dotnet test --results-directory ./coverage, ersatztv#15) /coverage/ *.pyc .worktrees/ # Claude Code .mcp/ .mcp.json # Machine-local settings (DOTNET_ROOT and friends — see docs/local-lsp-tooling.md). # Ignored here rather than relying on a personal ~/.config/git/ignore, so a second # contributor following that doc cannot accidentally commit their own Homebrew paths. /.claude/settings.local.json .agents/ plugins/ nupkg/ # Visual Studio Code .vscode # Rider .idea # User-specific files *.suo *.user *.userosscache *.sln.docstates # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ build/ bld/ [Bb]in/ [Oo]bj/ [Oo]ut/ msbuild.log msbuild.err msbuild.wrn # Visual Studio 2015 .vs/ *.sqlite3* # Core dumps. MUST stay anchored/qualified (ersatztv#485): a bare `core` matches any path # component named `core`, and on a case-insensitive filesystem (macOS default) that includes # every `*/Core/` source directory — silently excluding NEW files under e.g. # ErsatzTV.Scanner/Core/ from `git add -A`. Tracked files are unaffected, so the symptom is a # clean local build and a CI checkout that fails to compile. # # Both patterns are anchored to the repo root ON PURPOSE — an unanchored `core.[0-9]*` would # re-introduce exactly the silent-exclusion class this fixes. Tradeoff, accepted: a dump written # into a SUBdirectory is no longer ignored (the old bare `core` did catch those). In practice the # processes that could drop one, run from the repo root or from `bin/` — and `[Bb]in/` already covers # the latter. An un-ignored dump is visible noise; a wrongly-ignored source file is not. /core /core.[0-9]* scripts/generate-api-sdk/swagger.json scripts/download-test-content.sh docker-compose.override.yml ErsatzTV/wwwroot/v2/ ErsatzTV/wwwroot/app/ web/dist/ web/node_modules # Root-level link that makes `typescript` resolvable from the repo root, which is # the LSP workspace root — without it typescript-language-server refuses to start # (ersatztv#777). See docs/local-lsp-tooling.md. /node_modules/ # E2E / screenshot scratch (from Playwright/live-E2E runs) — never committed /*.png .playwright-mcp/ # UI-E2E run artifacts: traces/screenshots Playwright writes on failure (outputDir in # web/playwright.config.ts), plus the report dir it would use if a reporter is ever added (#445). web/e2e/.output/ web/playwright-report/ # Per-session worktree-ownership marker (H7, ersatztv#303) — local, never committed .claude-worktree-owner # Codex CLI project scaffolding — a machine-local mirror of the .claude hooks, generated by # `codex exec`. Deliberately NOT tracked even though `.claude/` is: its config.toml embeds a # plaintext Gitea credential and absolute /Users paths, so it is neither portable nor safe to # commit. See ersatztv#711 for the related merge-gate gap. .codex/ # serena's per-project state, written by `activate_project` (ersatztv#799): project.yml, # project.local.yml, a language-server cache, and memories/. # # This deliberately rejects serena's own versioning model. Its nested .serena/.gitignore excludes # only `cache` and `project.local.yml`, and project.local.yml says project.yml "is intended to be # versioned" — but activation here is per DIRECTORY, and every worktree generates a project.yml # whose project_name is that worktree's folder (e.g. `781-tooling`). A committed copy would name # the wrong project in every checkout but the one that produced it. memories/ is ignored with it: # it is serena's own written notes, and this repo's durable knowledge lives in docs/ instead. .serena/