Explorer
/opt/struktur/buzz/lefthook.yml
← Zurück ↓ Download
# Glob patterns below mirror the `changes` job's dorny/paths-filter groups in
# .github/workflows/ci.yml — keep the two in sync. Deliberate deviations:
# - The `.github/workflows/ci.yml` path CI adds to its `rust`/`mobile` filters
#   is omitted; a CI-workflow-only edit doesn't need a local test run.
# - `desktop-check`/`desktop-typecheck`/`desktop-test` don't trigger on `rust`
#   changes, though CI's Desktop Core job does. Those commands are pure TS
#   (biome + tsc + node:test) with no Rust dependency, so the extra trigger
#   would be spurious locally.
# - Deletion-only surface changes do not trigger local hooks: lefthook 2.1.x
#   drops deleted paths from push-file discovery (`extractFiles` existence
#   check, repository.go). CI's dorny/paths-filter catches deletions.
#   Deliberate — accepted, not worked around.
# - `commit-msg` has no glob: it rewrites the commit message, not files. Note
#   Git only runs it for `git commit` and `git merge` — other flows need their own
#   flag: `git rebase --signoff`, `git cherry-pick -s`.
pre-commit:
  parallel: true
  commands:
    rust-fmt:
      glob: ["crates/**", "examples/countdown-bot/**"]
      run: just fmt
      stage_fixed: true
    desktop-tauri-fmt:
      glob: ["desktop/src-tauri/**"]
      run: just desktop-tauri-fmt
      stage_fixed: true
    desktop-fix:
      glob: ["desktop/**", "pnpm-lock.yaml"]
      exclude: ["desktop/src-tauri/**"]
      run: just desktop-fix
      stage_fixed: true
    web-fix:
      glob: ["web/**", "pnpm-lock.yaml"]
      run: just web-fix
      stage_fixed: true
    mobile-fix:
      glob: ["mobile/**"]
      run: just mobile-fix
      stage_fixed: true

# Appends the DCO Signed-off-by trailer the required "DCO Check" enforces.
# `--if-exists doNothing` makes it idempotent and preserves an existing
# sign-off (including `git commit -s` and a different signer's trailer).
commit-msg:
  commands:
    signoff:
      run: 'git interpret-trailers --if-exists doNothing --trailer "Signed-off-by: $(git var GIT_COMMITTER_IDENT | sed ''s/ [0-9]* [+-][0-9]*$//'')" --in-place {1}'

pre-push:
  parallel: true
  commands:
    branch-skew:
      run: ./scripts/check-branch-skew.sh
    rust-tests:
      glob: ["crates/**", "migrations/**", "schema/**", "Cargo.toml", "Cargo.lock", "rust-toolchain.toml", "deny.toml", "scripts/run-tests.sh", "justfile"]
      run: just test-unit
    desktop-check:
      glob: ["desktop/**", "pnpm-lock.yaml"]
      exclude: ["desktop/src-tauri/**"]
      run: just desktop-check
    desktop-typecheck:
      glob: ["desktop/**", "pnpm-lock.yaml"]
      exclude: ["desktop/src-tauri/**"]
      run: just desktop-typecheck
    desktop-test:
      glob: ["desktop/**", "pnpm-lock.yaml"]
      exclude: ["desktop/src-tauri/**"]
      run: just desktop-test
    desktop-tauri-checks:
      # Keep local lint parity with Desktop Core CI for every path that can
      # affect the Tauri crate or its path dependencies. Run clippy and tests
      # serially so parallel pre-push hooks do not contend for Cargo's lock.
      glob: ["desktop/src-tauri/**", "crates/**", "migrations/**", "schema/**", "Cargo.toml", "Cargo.lock", "rust-toolchain.toml", "deny.toml", "scripts/run-tests.sh", "justfile"]
      run: just desktop-tauri-clippy && just desktop-tauri-test
    mobile-test:
      glob: ["mobile/**"]
      run: just mobile-test