From 303d4dff684fc15ab48bb1fa150950482f093847 Mon Sep 17 00:00:00 2001 From: htlee Date: Fri, 6 Mar 2026 15:30:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20v1.6.1=20custom=5Fpre=5Fcommit=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=95=B4=EC=8B=9C=20?= =?UTF-8?q?=EB=B6=84=EA=B8=B0=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - content_hashes_custom_precommit 필드 추가 (pre-commit 제외 해시) - push/mr/release Step 0.5: custom_pre_commit 플래그에 따라 해시 비교 분기 - update-hash.sh: HASH_NO_PC_FILE 초기화 버그 수정 + 두 세트 해시 동시 계산 --- .claude/skills/mr/SKILL.md | 26 +++++++++++++++++++------- .claude/skills/push/SKILL.md | 26 +++++++++++++++++++------- .claude/skills/release/SKILL.md | 26 +++++++++++++++++++------- update-hash.sh | 25 +++++++++++++++++++++++-- workflow-version.json | 31 +++++++++++++++++++++++++++---- 5 files changed, 107 insertions(+), 27 deletions(-) diff --git a/.claude/skills/mr/SKILL.md b/.claude/skills/mr/SKILL.md index 27c8c27..cb218b1 100644 --- a/.claude/skills/mr/SKILL.md +++ b/.claude/skills/mr/SKILL.md @@ -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 ``` **비교 결과 처리**: diff --git a/.claude/skills/push/SKILL.md b/.claude/skills/push/SKILL.md index 72e7e73..b9b7203 100644 --- a/.claude/skills/push/SKILL.md +++ b/.claude/skills/push/SKILL.md @@ -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 ``` **비교 결과 처리**: diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md index 89a105e..4d99a21 100644 --- a/.claude/skills/release/SKILL.md +++ b/.claude/skills/release/SKILL.md @@ -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 ``` **비교 결과 처리**: diff --git a/update-hash.sh b/update-hash.sh index 01d0492..43438e1 100644 --- a/update-hash.sh +++ b/update-hash.sh @@ -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 "" diff --git a/workflow-version.json b/workflow-version.json index 863448e..34a4d36 100644 --- a/workflow-version.json +++ b/workflow-version.json @@ -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",