# === OS ===
.DS_Store
Thumbs.db
desktop.ini
*~
bot-father/
tmp_botfather/

# === Java ===
*.class
*.war
*.ear
hs_err_pid*
replay_pid*
.mtj.tmp/

# === Maven ===
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
/.mvn/wrapper/maven-wrapper.jar

# === Gradle ===
.gradle/

# === IDEs ===

# IntelliJ / JetBrains
.idea/
*.iml
*.iws
/out/
.idea_modules/
atlassian-ide-plugin.xml
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Eclipse
.classpath
.project
.settings/
.factorypath

# VS Code
.vscode/
.history/

# === Project-specific ===
.env
docker/data/
/tmp/

# Grafana runtime state. The monitoring stack uses a named Docker volume and
# provisions from docs/monitoring/, so anything written here is local scratch —
# grafana.db (a 1.4 MB SQLite file) used to be committed from the bind-mount era.
/grafana-data/

# Kubernetes — user-specific values and Helm packaging output
helm/eddi/charts/
*.tgz
my-values.yaml
*-values-override.yaml

# Build & test outputs
build-clean-compile.txt
build-full.txt
build-package-clean.txt
build-package-output.txt
build-test-output.txt
build-xlint-output.txt
build-xlint.txt
build-warnings.txt
orphan-test.txt
test-output.txt

# AI session files (keep locally, don't push)
.gemini/
.claude/

# Event/marketing material — kept locally, not part of the product
waic-2026/

# (eddi-audit-deadletter.jsonl was listed here, and the entry was load-bearing:
# the audit ledger's unit-test factory passed a RELATIVE dead-letter path, which
# resolves against the process CWD — the repository root — so `mvn test` dropped
# a JSONL file into the source tree that `mvn clean` did not remove and git had
# to be taught to hide. That factory now writes under java.io.tmpdir, so nothing
# produces THAT name any more. See AuditLedgerService#defaultTestDeadLetterPath,
# pinned by AuditLedgerServiceTest#testDeadLetterPathIsOutsideTheSourceTree.
#
# Not a blanket guarantee about dead-letter files in general:
# AuditLedgerServiceBranchTest still constructs the service directly with a
# relative "deadletter.jsonl" — a different name, never covered by this entry.
# Those cases exercise the NATS and serialization branches and never reach the
# file write, so nothing lands. If you add a case that DOES drop a batch to
# disk, give it an absolute path instead of re-adding an ignore rule here.
#
# And NOT a claim that nothing else writes into the checkout. `/tmp/` further up
# is still load-bearing and is kept deliberately: RestExportService and
# RestImportService build their staging roots from System.getProperty("user.dir")
# — `tmp/export` and `tmp/import`, i.e. the repository root under Maven and in
# dev mode — which is the same CWD-relative mechanism described above, one class
# of file further out. Fixing that half means giving export/import a configurable
# staging directory (the image already has /deployments/tmp; the Dockerfile
# creates it), which changes runtime behaviour of the backup API and does not
# belong in a build-gate change. Deferred on purpose — `/tmp/` is not an
# oversight, and removing it will need that work first.)

# Auto-generated license files (rebuilt during Maven build)
licenses/third-party/
licenses/licenses.xml
licenses/THIRD-PARTY.txt

# Jazzer working corpus, written next to the repo root while a @FuzzTest runs in
# fuzzing mode (JAZZER_FUZZ=1). Thousands of small files, regenerated every run.
# The inputs worth keeping are checked in under src/test/resources/**/*Inputs/.
.cifuzz-corpus/

# Python bytecode from scripts/ (e.g. rotate-changelog.py)
__pycache__/
*.py[cod]

# ui/manager/.claude holds the Manager's tracked Claude Code skills and launch.json.
# The `.claude/` rule above would ignore any new file there, so the directory is
# re-included — and then everything in it re-excluded except those two, the same
# shape as the root block below. Re-including the whole directory let anything
# Claude Code writes there (settings.local.json, a worktrees/ checkout of the whole
# repository) become addable.
!ui/manager/.claude/
ui/manager/.claude/*
!ui/manager/.claude/skills/
!ui/manager/.claude/launch.json

# Repo-root .claude/skills holds tracked, shared Claude Code skills (the backend's
# counterpart to ui/manager/.claude/skills). The `.claude/` rule above ignores the
# whole directory, and git will not descend into an excluded directory to find a
# re-included file — so the parent has to be un-ignored first, then re-excluded for
# everything that is genuinely machine-local: settings.local.json, worktrees/ and
# the local workflow scratch.
#
# All three are anchored with a leading `/`. An unanchored `!.claude/` matches a
# .claude/ directory at ANY depth, while `.claude/*` (slash in the middle) is
# already root-only — so a nested ui/chat/.claude/ or src/.claude/ was re-included
# and nothing re-excluded its contents, settings.local.json included.
!/.claude/
/.claude/*
!/.claude/skills/

# === Generated frontend output (ui/manager and ui/chat, built by Maven) ===
# frontend-maven-plugin installs Node into ui/node/<node.version>/node (see the
# installDirectory comment in pom.xml; ui/*/node would NOT match it).
ui/node/
ui/*/node_modules/
ui/*/dist/
# Protective: nothing writes these any more. A stale local copy of the old
# deploy-to-local-eddi-repo script would silently re-create them — including the
# MSW worker, which it copies from dist/ wholesale. Keep this list identical to
# the default-resource excludes and the maven-clean-plugin fileset in pom.xml.
src/main/resources/META-INF/resources/assets/
src/main/resources/META-INF/resources/manage.html
src/main/resources/META-INF/resources/welcome.html
src/main/resources/META-INF/resources/workforce.html
src/main/resources/META-INF/resources/chat.html
src/main/resources/META-INF/resources/scripts/js/chat-ui*.js
src/main/resources/META-INF/resources/scripts/css/chat-ui*.css
src/main/resources/META-INF/resources/mockServiceWorker.js
src/main/resources/META-INF/resources/eddi-icon.ico
src/main/resources/META-INF/resources/eddi-icon.svg
src/main/resources/META-INF/resources/logo_eddi.png
src/main/resources/META-INF/resources/fonts/
src/main/resources/META-INF/resources/img/
