diff --git a/scripts/agents-tools/hooks/pre-commit b/scripts/agents-tools/hooks/pre-commit index 676cb31..ff3f604 100755 --- a/scripts/agents-tools/hooks/pre-commit +++ b/scripts/agents-tools/hooks/pre-commit @@ -1,3 +1,7 @@ #!/usr/bin/env bash # agents-tools-version: 1 -exec "$(git rev-parse --show-toplevel)/.agents-tools/version-bump" precommit +# Delegates to the repo's committed .agents-tools/version-bump. Guarded so a +# missing script or failed rev-parse never blocks the commit (always exit 0). +root="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0 +[ -x "$root/.agents-tools/version-bump" ] && "$root/.agents-tools/version-bump" precommit +exit 0 diff --git a/scripts/agents-tools/hooks/prepare-commit-msg b/scripts/agents-tools/hooks/prepare-commit-msg index 5d4ef84..57aed4a 100755 --- a/scripts/agents-tools/hooks/prepare-commit-msg +++ b/scripts/agents-tools/hooks/prepare-commit-msg @@ -1,3 +1,7 @@ #!/usr/bin/env bash # agents-tools-version: 1 -exec "$(git rev-parse --show-toplevel)/.agents-tools/version-bump" prepmsg "$1" +# Delegates to the repo's committed .agents-tools/version-bump. Guarded so a +# missing script or failed rev-parse never blocks the commit (always exit 0). +root="$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0 +[ -x "$root/.agents-tools/version-bump" ] && "$root/.agents-tools/version-bump" prepmsg "$1" +exit 0 diff --git a/scripts/agents-tools/test-version-bump.sh b/scripts/agents-tools/test-version-bump.sh index c8f78ad..96668bb 100644 --- a/scripts/agents-tools/test-version-bump.sh +++ b/scripts/agents-tools/test-version-bump.sh @@ -87,6 +87,34 @@ git log -1 --pretty=%s | grep -qF 'add specs (v1.1.0)' || fail "e2e structure me echo z > specs/z.md git add -A; git commit -q -m "edit spec" [ "$(cat .version)" = 1.1.1 ] || fail "e2e content: want 1.1.1 got $(cat .version)" +git log -1 --pretty=%s | grep -qF 'edit spec (v1.1.1)' || fail "e2e content message: $(git log -1 --pretty=%s)" cd /; rm -rf "$r" echo "e2e OK" + +# ── corrupt .version recovers to a clean baseline ──────────────────────────── +r="$(new_repo)"; cd "$r" +mkdir -p plans; : > plans/.gitkeep +echo 1.0.0 > .version +git add -A; "$SCRIPT" precommit; git commit -q -m init +printf '1.\n' > .version # partial/corrupt +echo hi > plans/a.md +git add -A; "$SCRIPT" precommit +[ "$(cat .version)" = 1.0.1 ] || fail "corrupt recovery: want 1.0.1 got $(cat .version)" +cd /; rm -rf "$r" +echo "corrupt-recovery OK" + +# ── hook never blocks a commit when version-bump is missing ────────────────── +r="$(new_repo)"; cd "$r" +mkdir -p .agents-tools/hooks +cp "$HERE/hooks/pre-commit" .agents-tools/hooks/pre-commit +cp "$HERE/hooks/prepare-commit-msg" .agents-tools/hooks/prepare-commit-msg +chmod +x .agents-tools/hooks/pre-commit .agents-tools/hooks/prepare-commit-msg +# note: .agents-tools/version-bump intentionally NOT copied +git config core.hooksPath .agents-tools/hooks +echo hi > file.txt +git add -A +git commit -q -m "no bumper present" || fail "missing version-bump blocked the commit" +git rev-parse -q --verify HEAD >/dev/null || fail "commit did not happen" +cd /; rm -rf "$r" +echo "hook-resilience OK" diff --git a/scripts/agents-tools/version-bump b/scripts/agents-tools/version-bump index a8689c5..72a950a 100755 --- a/scripts/agents-tools/version-bump +++ b/scripts/agents-tools/version-bump @@ -38,11 +38,14 @@ bump_precommit() { return 0 fi - local major minor patch - IFS=. read -r major minor patch < "$vfile" - case "$major$minor$patch" in - *[!0-9]*|"") major=1; minor=0; patch=0 ;; - esac + local ver major minor patch + ver="$(head -n1 "$vfile")" + if printf '%s' "$ver" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + IFS=. read -r major minor patch <<< "$ver" + else + # Corrupt/partial .version (e.g. "1." or "abc") → reset to a clean baseline. + major=1; minor=0; patch=0 + fi if [ "$(read_dirset HEAD)" != "$(read_dirset INDEX)" ]; then minor=$((minor + 1)); patch=0