.githooks/* text eol=lf
python/dcc_mcp_core/schemas/*.schema.json text eol=lf
config/*.json text eol=lf

# Text sources: normalize to LF on check-in and check out with LF.
# Path.read_text()/Path.write_text() round trips rewrite LF files as CRLF on
# Windows; scripts/ci/check_line_endings.py enforces the result in CI.
*.py text eol=lf
*.pyi text eol=lf
*.md text eol=lf
*.toml text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.jsonl text eol=lf
*.sh text eol=lf
*.ps1 text eol=lf

# Core release projections compare canonical bytes, including on Windows.
admin-ui/package.json text eol=lf
admin-ui/package-lock.json text eol=lf
server.json text eol=lf
benchmarks/skills/seeds.json text eol=lf
docs/.vitepress/config.mts text eol=lf
llms.txt text eol=lf

# The pilot verifies exact generated bytes and SHA-256 across platforms.
examples/design-provider-bridge/pilot/** text=auto eol=lf
# Preserve vendor export bytes, including archives, images and PDFs.
examples/design-provider-bridge/pilot/native/** -text
examples/design-provider-bridge/pilot/native/fieldkit.pen text eol=lf

# Skill bundles are packed into reproducible archives whose SHA-256 is pinned
# in marketplace entries, so their bytes must not depend on how the packing
# host checks them out. Scoped to skills/** so the -text exceptions above,
# which later rules would otherwise override, keep applying.
skills/**/*.md text eol=lf
skills/**/*.yaml text eol=lf
skills/**/*.json text eol=lf

# Later rules win in .gitattributes, so every `-text` exception has to stay
# below every `text eol=lf` rule that could otherwise match the same path.
# This fixture is consumed with include_bytes! and its CR bytes are payload.
crates/dcc-mcp-attestation/tests/fixtures/core-release.json -text
