diff --git a/CLAUDE.md b/CLAUDE.md index 86f4913f..1f446a2c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -129,3 +129,6 @@ The docs below own the details — this section just points at them. window:** → [`docs/turn-loop.md`](docs/turn-loop.md). - **Two-step spawn, approval flow, flake.lock validation:** → [`docs/approvals.md`](docs/approvals.md). +- **Pre-push lint hook** (catches tracker-tag and comment-block failures + before CI does — install once per clone): + `ln -sf ../../scripts/pre-push .git/hooks/pre-push` diff --git a/scripts/pre-push b/scripts/pre-push new file mode 100755 index 00000000..3b6ea478 --- /dev/null +++ b/scripts/pre-push @@ -0,0 +1,32 @@ +#!/bin/sh +# Git pre-push hook: runs the tracker-tag lint and the comment-block +# lint against the working tree before any push lands on the remote. +# Catches issues that would fail CI and require a follow-up commit +# (common failure mode: a nix comment containing a hash-issue-number +# tag added mid-session). +# +# Install (once per clone): +# ln -sf ../../scripts/pre-push .git/hooks/pre-push +# +# The hook runs against the full working tree (not just staged or +# pushed files) to match what CI sees: `nix flake check` builds from +# the committed tree, so an untracked hit on a staged file would still +# trip CI. +set -eu + +repo_root="$(git rev-parse --show-toplevel)" + +echo "pre-push: running tracker-tag lint..." >&2 +if ! sh "$repo_root/scripts/check-issue-refs.sh"; then + echo "pre-push: tracker-tag lint FAILED — fix before pushing" >&2 + exit 1 +fi + +echo "pre-push: running comment-block lint..." >&2 +if ! sh "$repo_root/scripts/check-comment-blocks.sh"; then + echo "pre-push: comment-block lint FAILED — fix before pushing" >&2 + exit 1 +fi + +echo "pre-push: lints passed ✓" >&2 +exit 0