#!/usr/bin/env bash # SessionStart 훅 — 폐쇄루프의 "state layer". # # 세션 시작 시 저장소의 현재 상태를 요약해 컨텍스트에 넣는다. # 에이전트가 매번 git status/log 를 따로 물어보지 않아도 지금 상황을 알고 시작한다. # stdout 이 그대로 컨텍스트로 들어가므로 짧게 유지한다. set -uo pipefail ROOT="${CLAUDE_PROJECT_DIR:-}" if [ -z "$ROOT" ]; then ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" fi cd "$ROOT" || exit 0 echo "## 저장소 현재 상태 (SessionStart 자동 브리핑)" echo BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "?") echo "- 브랜치: \`$BRANCH\`" LAST=$(git log -1 --format='%h %s' 2>/dev/null | cut -c1-110) echo "- 마지막 커밋: $LAST" CHANGED=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ') if [ "$CHANGED" = "0" ]; then echo "- 작업트리: 깨끗함" else echo "- 작업트리: 변경 $CHANGED 건" git status --porcelain 2>/dev/null | head -10 | sed 's/^/ /' if [ "$CHANGED" -gt 10 ]; then echo " … 외 $((CHANGED - 10))건" fi fi # 마지막 검증 이후 소스가 바뀌었는지 (Stop 훅이 쓰는 스탬프와 같은 기준) STAMP=".claude/.verify-stamp" 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 [ -f "$STAMP" ] && [ "$(cat "$STAMP" 2>/dev/null)" = "$NEWEST" ]; then echo "- 검증: 마지막 \`dotnet test\` 이후 소스 변경 없음 (GREEN 상태)" else echo "- 검증: **미검증 변경 있음** — 작업 전에 \`dotnet test VideoDownloader.Tests\` 로 기준선을 확인할 것" fi # 미완료 백로그 if [ -f docs/BACKLOG.md ]; then OPEN=$(grep -c '^- \[ \]' docs/BACKLOG.md 2>/dev/null) || OPEN=0 echo "- 백로그 미완료: ${OPEN}건 (\`docs/BACKLOG.md\`)" fi echo echo "작업 계약은 \`AGENTS.md\`, 하네스 운영법은 \`docs/HARNESS.md\` 참고." exit 0