default_install_hook_types:
  - pre-commit
  - commit-msg
default_stages:
  - pre-commit
exclude: ^target/|\.alef/
repos:
  - repo: local
    hooks:
      - id: no-project-special-casing
        name: no project-name special casing
        entry: hooks/check_project_mentions.py
        language: python
        types:
          - text
      - id: no-backend-local-naming-helpers
        name: no backend-local naming helpers
        entry: hooks/check_backend_naming_helpers.py
        language: python
        pass_filenames: false

  - repo: https://github.com/Goldziher/gitfluff
    rev: v0.8.0
    hooks:
      - id: gitfluff-lint
        args:
          - --write
        stages:
          - commit-msg

  - repo: https://github.com/xberg-io/pre-commit-hooks
    rev: v3.0.0
    hooks:
      # AI governance
      - id: ai-rulez-generate

      # File safety (general)
      - id: trailing-whitespace
      - id: end-of-file-fixer
        exclude: ^src/backends/php/templates/php_file_header\.jinja$
      - id: check-merge-conflict
      - id: check-added-large-files
      - id: detect-private-key
      - id: check-case-conflict
      - id: check-executables-have-shebangs
      - id: check-shebang-scripts-are-executable
        exclude: \.(jinja|rs)$
      - id: mixed-line-ending
      - id: typos
        args:
          - --force-exclude
      - id: check-json
      - id: check-yaml
        args:
          - --allow-multiple-documents
          - --unsafe
      - id: check-toml

      # GitHub Actions
      - id: actionlint
      - id: gh-actions-updater

      # Shell
      - id: shfmt
        args:
          - -w
          - -i
          - "2"
      - id: shellcheck

      # Markdown
      - id: rumdl-fmt
      - id: markdownlint-rumdl-strict
        exclude: ^(\.ai-rulez/|CHANGELOG\.md|README\.md|docs/design/|skills/alef/)
      - id: textlint
        exclude: ^docs/design/

      # Rust (canonical block; cargo-check dropped — cargo-clippy with -D warnings supersedes it)
      - id: cargo-fmt
        args:
          - --all
      - id: cargo-clippy
        args:
          - --fix
          - --allow-dirty
          - --allow-staged
          - --all-targets
          - --
          - -D
          - warnings
          - -A
          - clippy::needless_update
      - id: cargo-sort
      - id: cargo-machete
      - id: cargo-deny
        args:
          - check
      - id: rustdoc-lint
      # Enforces the file-modularization rule (CLAUDE.md): 1,000 LOC ceiling per .rs file.
      # The exclude list tracks the file-modularization remediation backlog —
      # existing files over the cap that need splitting. New files are subject
      # to the cap. Shrink this list as files are split.
      - id: rust-max-lines
        args:
          - --max=1000

      # Python — repo-internal pre-commit helper scripts only
      - id: ruff
        files: ^hooks/.*\.py$
      - id: ruff-format
        files: ^hooks/.*\.py$
      - id: mypy
        files: ^hooks/.*\.py$

      # JSON / generated manifest formatting (no JS/TS in this repo, but oxfmt covers JSON)
      - id: oxfmt
