feat: v1.6.1 custom_pre_commit 해시 분기 지원 #12

병합
htlee feature/v1.6.1-custom-precommit 에서 develop 로 1 commits 를 머지했습니다 2026-03-06 15:31:01 +09:00
5개의 변경된 파일107개의 추가작업 그리고 27개의 파일을 삭제

파일 보기

@ -38,16 +38,28 @@ CAN_PUSH=$(echo "$PERMISSIONS" | python3 -c "import sys,json; print(json.load(sy
# 로컬 설정 읽기
GITEA_URL=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('gitea_url', 'https://gitea.gc-si.dev'))" 2>/dev/null)
PROJECT_TYPE=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('project_type', ''))" 2>/dev/null)
CUSTOM_PRECOMMIT=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('custom_pre_commit', False))" 2>/dev/null)
# 서버 해시 조회
# 서버 해시 조회 (custom_pre_commit이면 pre-commit 제외 해시 사용)
SERVER_VER=$(curl -sf --max-time 5 "${GITEA_URL}/gc/template-common/raw/branch/develop/workflow-version.json")
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes_custom_precommit',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
else
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
fi
# 로컬 해시 계산
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
# 로컬 해시 계산 (custom_pre_commit이면 .githooks/pre-commit 제외)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f ! -path '.githooks/pre-commit' 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
else
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
fi
```
**비교 결과 처리**:

파일 보기

@ -38,16 +38,28 @@ CAN_PUSH=$(echo "$PERMISSIONS" | python3 -c "import sys,json; print(json.load(sy
# 로컬 설정 읽기
GITEA_URL=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('gitea_url', 'https://gitea.gc-si.dev'))" 2>/dev/null)
PROJECT_TYPE=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('project_type', ''))" 2>/dev/null)
CUSTOM_PRECOMMIT=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('custom_pre_commit', False))" 2>/dev/null)
# 서버 해시 조회
# 서버 해시 조회 (custom_pre_commit이면 pre-commit 제외 해시 사용)
SERVER_VER=$(curl -sf --max-time 5 "${GITEA_URL}/gc/template-common/raw/branch/develop/workflow-version.json")
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes_custom_precommit',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
else
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
fi
# 로컬 해시 계산
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
# 로컬 해시 계산 (custom_pre_commit이면 .githooks/pre-commit 제외)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f ! -path '.githooks/pre-commit' 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
else
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
fi
```
**비교 결과 처리**:

파일 보기

@ -37,16 +37,28 @@ IS_ADMIN=$(echo "$PERMISSIONS" | python3 -c "import sys,json; print(json.load(sy
# 로컬 설정 읽기
GITEA_URL=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('gitea_url', 'https://gitea.gc-si.dev'))" 2>/dev/null)
PROJECT_TYPE=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('project_type', ''))" 2>/dev/null)
CUSTOM_PRECOMMIT=$(python3 -c "import json; print(json.load(open('.claude/workflow-version.json')).get('custom_pre_commit', False))" 2>/dev/null)
# 서버 해시 조회
# 서버 해시 조회 (custom_pre_commit이면 pre-commit 제외 해시 사용)
SERVER_VER=$(curl -sf --max-time 5 "${GITEA_URL}/gc/template-common/raw/branch/develop/workflow-version.json")
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes_custom_precommit',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
else
SERVER_HASH=$(echo "$SERVER_VER" | python3 -c "import sys,json; print(json.load(sys.stdin).get('content_hashes',{}).get('${PROJECT_TYPE}',''))" 2>/dev/null)
fi
# 로컬 해시 계산
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
# 로컬 해시 계산 (custom_pre_commit이면 .githooks/pre-commit 제외)
if [ "$CUSTOM_PRECOMMIT" = "True" ]; then
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f ! -path '.githooks/pre-commit' 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
else
LOCAL_HASH=$(find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1)
fi
```
**비교 결과 처리**:

파일 보기

@ -58,7 +58,9 @@ echo "Common 파일: ${COMMON_COUNT}개"
# 2. 각 타입별 해시 계산 → 파일로 저장
HASH_FILE="$WORK_TMPDIR/hashes.json"
HASH_NO_PC_FILE="$WORK_TMPDIR/hashes_no_pc.json"
echo "{" > "$HASH_FILE"
echo "{" > "$HASH_NO_PC_FILE"
FIRST=true
for TYPE in $TYPES; do
@ -84,25 +86,36 @@ for TYPE in $TYPES; do
fi
done
# 해시 계산 (find | sort | xargs cat | shasum — 로컬 계산과 동일한 방식)
# 해시 계산 — 전체 (find | sort | xargs cat | shasum)
HASH=$(cd "$WORK_TMPDIR/combined" && find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f 2>/dev/null | sort | xargs cat 2>/dev/null | $SHA_CMD | cut -d' ' -f1)
# 해시 계산 — pre-commit 제외 (custom_pre_commit 프로젝트용)
HASH_NO_PC=$(cd "$WORK_TMPDIR/combined" && find .claude/rules .claude/agents .claude/scripts .githooks \
.claude/skills/push .claude/skills/mr .claude/skills/create-mr \
.claude/skills/release .claude/skills/version .claude/skills/fix-issue \
-type f ! -path '.githooks/pre-commit' 2>/dev/null | sort | xargs cat 2>/dev/null | $SHA_CMD | cut -d' ' -f1)
if [ "$FIRST" = true ]; then
FIRST=false
else
echo "," >> "$HASH_FILE"
echo "," >> "$HASH_NO_PC_FILE"
fi
printf ' "%s": "%s"' "$TYPE" "$HASH" >> "$HASH_FILE"
printf ' "%s": "%s"' "$TYPE" "$HASH_NO_PC" >> "$HASH_NO_PC_FILE"
echo " 타입별 파일: ${TYPE_COUNT}개 추가"
echo " 해시: $HASH"
echo " 해시(전체): $HASH"
echo " 해시(pre-commit 제외): $HASH_NO_PC"
done
echo "" >> "$HASH_FILE"
echo "}" >> "$HASH_FILE"
echo "" >> "$HASH_NO_PC_FILE"
echo "}" >> "$HASH_NO_PC_FILE"
# 3. workflow-version.json 갱신
echo ""
@ -114,10 +127,14 @@ import json
with open('$HASH_FILE', 'r') as f:
hashes = json.load(f)
with open('$HASH_NO_PC_FILE', 'r') as f:
hashes_no_pc = json.load(f)
with open('workflow-version.json', 'r') as f:
data = json.load(f)
data['content_hashes'] = hashes
data['content_hashes_custom_precommit'] = hashes_no_pc
with open('workflow-version.json', 'w') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
@ -126,6 +143,10 @@ with open('workflow-version.json', 'w') as f:
print('content_hashes 갱신 완료:')
for t, h in hashes.items():
print(f' {t}: {h}')
print()
print('content_hashes_custom_precommit 갱신 완료:')
for t, h in hashes_no_pc.items():
print(f' {t}: {h}')
"
echo ""

파일 보기

@ -1,14 +1,37 @@
{
"version": "1.6.0",
"version": "1.6.1",
"updated": "2026-03-06",
"gitea_url": "https://gitea.gc-si.dev",
"nexus_url": "https://nexus.gc-si.dev",
"content_hashes": {
"java-maven": "1456f972fb250ba60fa6331d5fad81155c9992bf80947867e34a7178293513db",
"java-gradle": "0f7afc70942888cd2f98e01ef2eef0fcb815c0a68704d27b970a528081710d22",
"react-ts": "2a3a5b6ce9e2c6080c79b78be92c4967ed2418c3efff6082038b3f270c3b7e18"
"java-maven": "",
"java-gradle": "",
"react-ts": ""
},
"content_hashes_custom_precommit": {
"java-maven": "",
"java-gradle": "",
"react-ts": ""
},
"changes": [
{
"version": "1.6.1",
"date": "2026-03-06",
"description": "custom_pre_commit 프로젝트 해시 불일치 해결",
"items": [
"content_hashes_custom_precommit: pre-commit 제외 해시 필드 추가",
"push/mr/release Step 0.5: custom_pre_commit 플래그에 따라 해시 비교 분기",
"update-hash.sh: 두 세트 해시 동시 계산 (전체 + pre-commit 제외)",
"적용: 자동 (기존 v1.6.0 프로젝트는 /push 시 해시 차이로 자동 동기화)"
],
"affected_files": [
".claude/skills/push/SKILL.md",
".claude/skills/mr/SKILL.md",
".claude/skills/release/SKILL.md",
"update-hash.sh",
"workflow-version.json"
]
},
{
"version": "1.6.0",
"date": "2026-03-06",