71 lines
2.9 KiB
Bash
71 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
# Stop 훅 — 폐쇄루프의 "checker" 층.
|
|
#
|
|
# 소스(.cs/.csproj/.xaml/.axaml)가 마지막 성공 검증 이후 바뀌었으면 테스트를 돌린다.
|
|
# 실패하면 exit 2 로 턴 종료를 막고, 실패 내용을 에이전트에게 돌려준다.
|
|
# 변경이 없으면 즉시 통과하므로 대화만 하는 턴은 지연이 없다.
|
|
#
|
|
# 무한 루프 방지: stop_hook_active 가 true 면(=이미 이 훅 때문에 재개된 상태) 바로 통과.
|
|
set -uo pipefail
|
|
|
|
INPUT=$(cat)
|
|
|
|
# ── 1. 재진입 가드 ────────────────────────────────────────────────────
|
|
if command -v jq >/dev/null 2>&1; then
|
|
ACTIVE=$(printf '%s' "$INPUT" | jq -r '.stop_hook_active // false' 2>/dev/null || echo false)
|
|
else
|
|
case "$INPUT" in
|
|
*'"stop_hook_active"'*[Tt]rue*) ACTIVE=true ;;
|
|
*) ACTIVE=false ;;
|
|
esac
|
|
fi
|
|
if [ "$ACTIVE" = "true" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# ── 2. 프로젝트 루트 ──────────────────────────────────────────────────
|
|
ROOT="${CLAUDE_PROJECT_DIR:-}"
|
|
if [ -z "$ROOT" ]; then
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
fi
|
|
cd "$ROOT" || exit 0
|
|
|
|
STAMP=".claude/.verify-stamp"
|
|
|
|
# ── 3. 변경 감지 (소스 최신 수정시각) ─────────────────────────────────
|
|
NEWEST=$(find ./VideoDownloader.* -type f \
|
|
\( -name '*.cs' -o -name '*.csproj' -o -name '*.xaml' -o -name '*.axaml' \) \
|
|
-not -path '*/bin/*' -not -path '*/obj/*' \
|
|
-printf '%T@\n' 2>/dev/null | sort -rn | head -1)
|
|
|
|
# 소스를 못 찾으면(경로 이상 등) 훅이 개발을 막지 않도록 통과시킨다.
|
|
if [ -z "$NEWEST" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
if [ -f "$STAMP" ] && [ "$(cat "$STAMP" 2>/dev/null)" = "$NEWEST" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# ── 4. 검증 ───────────────────────────────────────────────────────────
|
|
LOG=$(mktemp 2>/dev/null || echo "${TMPDIR:-/tmp}/vd-verify.$$")
|
|
dotnet test VideoDownloader.Tests/VideoDownloader.Tests.csproj \
|
|
--nologo -v quiet >"$LOG" 2>&1
|
|
CODE=$?
|
|
|
|
if [ $CODE -eq 0 ]; then
|
|
printf '%s' "$NEWEST" > "$STAMP"
|
|
rm -f "$LOG"
|
|
exit 0
|
|
fi
|
|
|
|
# ── 5. 실패 → 종료 차단 ───────────────────────────────────────────────
|
|
{
|
|
echo "검증 실패: dotnet test 가 통과하지 않았다. 테스트를 GREEN 으로 만들기 전에는 턴을 끝낼 수 없다."
|
|
echo "테스트를 삭제하거나 Skip 처리해서 통과시키지 말 것. 근본 원인을 고칠 것."
|
|
echo "---- dotnet test 출력 (마지막 60줄) ----"
|
|
tail -60 "$LOG"
|
|
} >&2
|
|
|
|
rm -f "$LOG"
|
|
exit 2
|