# Every text file is stored and checked out with LF on every platform, whatever a clone's
# core.autocrlf says. CRLF working trees made exact-text edits by agents and scripts miss their
# anchors (trend 39b33f07). Git still detects binary files itself (text=auto).
* text=auto eol=lf
# Windows batch files keep CRLF: cmd.exe can mis-parse labels and GOTOs in an LF .bat file.
*.bat text eol=crlf
*.cmd text eol=crlf

# The explicit LF pins below predate the repo-wide rule above; each records why its files must
# never be CRLF, so keep them if the rule above ever changes.

# Force LF line endings for shell scripts (required for bash heredocs)
*.sh text eol=lf
*.mjs text eol=lf

# Config fingerprints (server + config-sync hook) normalize CRLF/BOM before hashing, but keeping
# these files LF in the repo avoids the one-time re-push every CRLF/BOM checkout would otherwise
# trigger on first sync (see infrastructure/security/Sha256Hex.kt's configFingerprint KDoc).
**/.taskorchestrator/*.yaml text eol=lf

# Golden snapshots (A1 T0 SeatlessResponseGoldenTest compares exact compact-JSON strings, key order included): a CRLF
# checkout would fail every compare on Windows, so pin them (and their YAML fixtures) to LF.
current/src/test/resources/golden/** text eol=lf
# Rule text is served byte-for-byte and hashed into rulesVersion (A3): pin LF so a Windows
# checkout (core.autocrlf=true) cannot change the stashed body or its content hash.
.taskorchestrator/rules/*.md text eol=lf
# Bundled copies the config-sync hook pushes; their hashes are listed in bundled-rules/manifest.json.
claude-plugins/task-orchestrator/bundled-rules/*.md text eol=lf
# Checked-in SQLite databases (the golden V17 upgrade fixture) are opaque binaries: never convert line endings.
*.sqlite binary
