# Lefthook configuration. # # Replaces the hand-rolled scripts that previously lived under # .githooks/ and were registered via `git config core.hooksPath # .githooks`. Behaviour is intentionally 1:1 with those scripts — # see WS-3 session 1a notes for the migration record. # # The .githooks/ scripts remain on disk and contain the actual logic # (gating against .claude-sync.conf, merge-commit handling, the # non-blocking pre-push warning). lefthook dispatches to them so the # delicate gating logic isn't re-translated into YAML. See # .githooks/README.md for details. post-commit: commands: sync-claude-docs: run: bash .githooks/post-commit pre-push: # LFS is handled by lefthook's built-in pre-push LFS hook (see # docs/usage/features/git-lfs.md). Do NOT add a manual `git lfs # pre-push` command here — it duplicates the internal call and # historically caused the pre-push to hang. Background and # mechanism: dev-docs/ADR-LEFTHOOK-LFS-INTEGRATION.md. commands: sync-check: run: bash .githooks/pre-push # Manual smoke tests need `lefthook run pre-push --force`: # without `--force`, lefthook v2 inspects {push_files} (the # diff between local and remote) and skips when that list is # empty, which is always the case during a manual run. On a # real `git push` with commits the file list is non-empty and # the command fires — matching the legacy hook's "always runs" # behaviour. (Pushing with zero new commits would be skipped # under lefthook but is a no-op for the sync-staleness warning # anyway, so behaviour stays effectively 1:1.)