# 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