From 3ffb03e22bac3214029e1e40a0dd109d77441dad Mon Sep 17 00:00:00 2001 From: swrring Date: Wed, 15 Apr 2026 23:27:40 +0900 Subject: [PATCH] =?UTF-8?q?feat(hook):=20=EC=B6=95=202=20hook=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=EC=95=88=20=EA=B5=AC=EC=B6=95=20=E2=80=94=20agent=5Fs?= =?UTF-8?q?ync.sh=20+=20SessionStart=20hook=20=ED=8E=B8=EC=9E=85=20(PD?= =?UTF-8?q?=EB=8B=98=20=EC=8A=B9=EC=9D=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/agent_sync.sh: cwd 기반 부서 판단 → 부서 .claude/agents/*.md 를 cwd .claude/agents/ 로 자동 복제 - 실증 A 실패(상향 탐색 차단 확정) 후속 — hook 확장안으로 전환 결정 - SessionStart hook 3단(fetch·agent_sync·inbox_scan) 체계 확정 - 루트·개발실·기획실 settings.json 동일 복제 (3중 SOT 유지) - 동작 검증 완료: 개발실 3개·기획실 7개 에이전트 동기화 OK - 제약: 첫 세션은 여전히 부서 에이전트 미로드 (다음 세션부터 유효) — 감시자안 별도 검토 중 Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/settings.json | 4 +++ scripts/agent_sync.sh | 61 ++++++++++++++++++++++++++++++++++++ 개발실/.claude/settings.json | 4 +++ 기획실/.claude/settings.json | 4 +++ 4 files changed, 73 insertions(+) create mode 100644 scripts/agent_sync.sh diff --git a/.claude/settings.json b/.claude/settings.json index 8250926..7c598db 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -81,6 +81,10 @@ "type": "command", "command": "git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출:'; echo \"$CHANGES\"; echo '→ 권장: git merge origin/main --no-edit'; else echo '✅ [SessionStart] main 동기화 상태'; fi" }, + { + "type": "command", + "command": "bash scripts/agent_sync.sh 2>/dev/null || true" + }, { "type": "command", "command": "bash scripts/inbox_scan.sh 2>/dev/null || true" diff --git a/scripts/agent_sync.sh b/scripts/agent_sync.sh new file mode 100644 index 0000000..b160ae7 --- /dev/null +++ b/scripts/agent_sync.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# SessionStart hook 확장: 부서 에이전트를 현재 워크트리 .claude/agents/ 로 자동 복제 +# 축 2 hook 확장안 (2026-04-15 PD님 승인) +# +# 동작: +# 1. cwd 기반 부서 판단 (기획실/개발실/PM) +# 2. 해당 부서의 .claude/agents/*.md 를 cwd의 .claude/agents/ 로 복사 +# 3. 이미 같은 내용이면 skip (cmp -s 비교) +# +# 제약: +# - hook은 세션 이미 시작된 후 실행 → 그 세션의 이미 로드된 에이전트 목록은 갱신되지 않음 +# - 따라서 "다음 세션부터 유효" +# - 첫 세션 유효화 이슈는 감시자안(별도 검토 중)에서 다룰 수 있음 +# +# C23 준수: 실패·skip도 투명 보고 + +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) +[ -z "$REPO_ROOT" ] && exit 0 + +CWD=$(pwd -W 2>/dev/null || pwd) + +# 부서 판단 +if [[ "$CWD" == *"/기획실/"* ]] || [[ "$CWD" == *"/기획실" ]]; then + ROLE="기획실" + DEPT_AGENTS="$REPO_ROOT/기획실/.claude/agents" +elif [[ "$CWD" == *"/개발실/"* ]] || [[ "$CWD" == *"/개발실" ]]; then + ROLE="개발실" + DEPT_AGENTS="$REPO_ROOT/개발실/.claude/agents" +else + # PM(루트) 세션은 복제 대상 아님 — 루트 .claude/agents/ 그대로 사용 + exit 0 +fi + +# 부서 원본 디렉토리 없으면 종료 (이례적) +[ ! -d "$DEPT_AGENTS" ] && exit 0 + +WT_AGENTS=".claude/agents" +mkdir -p "$WT_AGENTS" 2>/dev/null + +COPIED=0 +SKIPPED=0 +for f in "$DEPT_AGENTS"/*.md; do + [ -e "$f" ] || continue + BASENAME=$(basename "$f") + DEST="$WT_AGENTS/$BASENAME" + if [ ! -f "$DEST" ] || ! cmp -s "$f" "$DEST" 2>/dev/null; then + cp "$f" "$DEST" + COPIED=$((COPIED + 1)) + else + SKIPPED=$((SKIPPED + 1)) + fi +done + +if [ $COPIED -gt 0 ]; then + echo "🔧 [agent_sync:$ROLE] 부서 에이전트 $COPIED 개 신규 동기화 (다음 세션부터 유효)" + [ $SKIPPED -gt 0 ] && echo " (이미 동일: $SKIPPED 개)" +else + echo "✅ [agent_sync:$ROLE] 부서 에이전트 동기화 상태 (동일 $SKIPPED 개)" +fi + +exit 0 diff --git a/개발실/.claude/settings.json b/개발실/.claude/settings.json index 8250926..7c598db 100644 --- a/개발실/.claude/settings.json +++ b/개발실/.claude/settings.json @@ -81,6 +81,10 @@ "type": "command", "command": "git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출:'; echo \"$CHANGES\"; echo '→ 권장: git merge origin/main --no-edit'; else echo '✅ [SessionStart] main 동기화 상태'; fi" }, + { + "type": "command", + "command": "bash scripts/agent_sync.sh 2>/dev/null || true" + }, { "type": "command", "command": "bash scripts/inbox_scan.sh 2>/dev/null || true" diff --git a/기획실/.claude/settings.json b/기획실/.claude/settings.json index 8250926..7c598db 100644 --- a/기획실/.claude/settings.json +++ b/기획실/.claude/settings.json @@ -81,6 +81,10 @@ "type": "command", "command": "git fetch origin 2>/dev/null; CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -10); if [ -n \"$CHANGES\" ]; then echo '📌 [SessionStart] origin/main 변경 검출:'; echo \"$CHANGES\"; echo '→ 권장: git merge origin/main --no-edit'; else echo '✅ [SessionStart] main 동기화 상태'; fi" }, + { + "type": "command", + "command": "bash scripts/agent_sync.sh 2>/dev/null || true" + }, { "type": "command", "command": "bash scripts/inbox_scan.sh 2>/dev/null || true"