template-common/.claude/skills/push/SKILL.md
htlee 303d4dff68 feat: v1.6.1 custom_pre_commit 프로젝트 해시 분기 지원
- content_hashes_custom_precommit 필드 추가 (pre-commit 제외 해시)
- push/mr/release Step 0.5: custom_pre_commit 플래그에 따라 해시 비교 분기
- update-hash.sh: HASH_NO_PC_FILE 초기화 버그 수정 + 두 세트 해시 동시 계산
2026-03-06 15:30:48 +09:00

5.7 KiB

name description user-invokable argument-hint
push 변경 사항을 확인하고 커밋 + 푸시합니다 true [commit-message] (생략 시 자동 생성)

현재 브랜치의 변경 사항을 확인하고, 사용자 승인 후 커밋 + 푸시합니다. 커밋 메시지 인자: $ARGUMENTS (생략 시 변경 내용 기반 자동 생성)

수행 단계

0. 권한 확인

# GITEA_TOKEN 확인
if [ -z "$GITEA_TOKEN" ]; then
  echo "GITEA_TOKEN이 필요합니다. Gitea → Settings → Applications에서 생성하세요"
  exit 1
fi

# Gitea API로 리포 권한 조회
REMOTE_URL=$(git remote get-url origin)
GITEA_HOST=$(echo "$REMOTE_URL" | sed -E 's|^https?://([^/]+)/.*|\1|')
REPO_PATH=$(echo "$REMOTE_URL" | grep -oE '[^/]+/[^/]+\.git$' | sed 's/.git$//')
PERMISSIONS=$(curl -sf "https://${GITEA_HOST}/api/v1/repos/${REPO_PATH}" \
  -H "Authorization: token ${GITEA_TOKEN}")
CAN_PUSH=$(echo "$PERMISSIONS" | python3 -c "import sys,json; print(json.load(sys.stdin)['permissions']['push'])")
  • CAN_PUSHFalse이면: "push 권한이 필요합니다. 프로젝트 관리자에게 요청하세요." 안내 후 종료

0.5. 팀 워크플로우 최신화 확인

.claude/workflow-version.json이 존재하지 않으면 이 단계를 건너뛴다 (팀 프로젝트가 아닌 경우).

# 로컬 설정 읽기
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")
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

# 로컬 해시 계산 (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

비교 결과 처리:

  • 서버 조회 실패 (SERVER_HASH 비어있음): "⚠️ 서버 연결 불가, 워크플로우 체크를 건너뜁니다" 경고 후 다음 단계 진행
  • 일치 (LOCAL_HASH == SERVER_HASH): 다음 단계 진행
  • 불일치: "⚠️ 팀 워크플로우가 최신이 아닙니다. 동기화를 실행합니다..." 출력 → sync-team-workflow 절차를 자동 실행 → 완료 후 원래 작업 계속

1. 현재 상태 수집

# 현재 브랜치
git branch --show-current

# 커밋되지 않은 변경 사항
git status --short

# 변경 통계
git diff --stat
git diff --cached --stat

2. 변경 범위 표시

사용자에게 다음 정보를 표 형태로 요약하여 보여준다:

  • 현재 브랜치명
  • 변경된 파일 목록 (추가/수정/삭제 구분)
  • staged vs unstaged 구분
  • 변경 라인 수 요약

변경 사항이 없으면 "커밋할 변경 사항이 없습니다" 출력 후 종료.

3. 커밋 메시지 결정

인자가 있는 경우 ($ARGUMENTS가 비어있지 않으면):

  • 전달받은 메시지를 커밋 메시지로 사용
  • Conventional Commits 형식인지 검증 (아니면 자동 보정 제안)

인자가 없는 경우:

  • 변경 내용을 분석하여 Conventional Commits 형식 메시지 자동 생성
  • 형식: type(scope): 한국어 설명
  • type 판단 기준:
    • 새 파일 추가 → feat
    • 기존 파일 수정 → fix 또는 refactor
    • 테스트 파일 → test
    • 설정/빌드 파일 → chore
    • 문서 파일 → docs

4. 사용자 확인

AskUserQuestion으로 다음을 확인:

질문: "다음 내용으로 커밋하시겠습니까?"

  • 옵션 1: 제안된 메시지로 커밋 (추천)
  • 옵션 2: 메시지 수정 (Other 입력)
  • 옵션 3: 취소

5. 커밋 + 푸시 실행

사용자가 수락하면:

# 모든 변경 사항 스테이징 (untracked 포함)
# 단, .env, secrets/ 등 민감 파일은 제외
git add -A

# 커밋 (.githooks/commit-msg가 형식 검증)
git commit -m "커밋메시지"

# 푸시 (리모트 트래킹 없으면 -u 추가)
git push origin $(git branch --show-current)

주의사항:

  • git add 전에 .env, *.key, secrets/ 등 민감 파일이 포함되어 있으면 경고
  • pre-commit hook 실패 시 에러 메시지 표시 후 수동 해결 안내
  • 리모트에 브랜치가 없으면 git push -u origin {branch} 사용

6. 결과 출력

✅ 푸시 완료
  브랜치: feature/my-branch
  커밋: abc1234 feat(auth): 로그인 검증 로직 추가
  변경: 3 files changed, 45 insertions(+), 12 deletions(-)