UI 복잡 버전 234 RED→GREEN 완료(docs/UI_USECASES.md §A~§J): 라이브 테마 전환(DynamicResource 전환+ThemeResolver+HighContrast 테마, 재시작 없음), 디자인 토큰 체계·WCAG 대비 결함 5건 수정, 설정창 카테고리 내비/검색 재구성+AppConfig 40여 속성, 다운로드 관리자(속도/ETA/세그먼트맵/전체 일시정지-이어받기/CSV 내보내기/예약 게이트/중복 확인), 라이브러리·아카이브·작업공간·재생목록·즐겨찾기 편집 뷰, 접근성(자동화 속성 30여 개·커스텀 피어·docs/ACCESSIBILITY.md), 인터랙션(휠 클릭 새 탭·XButton 탐색·F12·영역 캡처·프로필 전환), 상태/알림(토스트·알림센터·온보딩·CrashReportDialog). 보강 테스트 35건+실창 E2E 4건(StaDispatcher 기반 — 프록시 설정이 기시작 핸들러를 건드리는 크래시 실결함 수정 포함) — 453/453 GREEN. 이전 미커밋 작업(CI 워크플로·Mdns·QueueHub·UpdateChecker·AGENTS/CLAUDE·빌드 스크립트) 일괄 포함
This commit is contained in:
parent
5a0ce730b2
commit
17f2f91152
88 changed files with 9463 additions and 1127 deletions
56
.claude/hooks/session-brief.sh
Normal file
56
.claude/hooks/session-brief.sh
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#!/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
|
||||
71
.claude/hooks/verify-on-stop.sh
Normal file
71
.claude/hooks/verify-on-stop.sh
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
#!/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
|
||||
Loading…
Add table
Add a link
Reference in a new issue