diff --git a/.claude/skills/init-project/SKILL.md b/.claude/skills/init-project/SKILL.md index a0c7d21..3f5d388 100644 --- a/.claude/skills/init-project/SKILL.md +++ b/.claude/skills/init-project/SKILL.md @@ -33,8 +33,19 @@ $ARGUMENTS가 "auto"이거나 비어있으면 다음 순서로 감지: - 프로젝트 디렉토리 구조 요약 - 팀 컨벤션 참조 (`.claude/rules/` 안내) +### Gitea 파일 다운로드 URL 패턴 +⚠️ Gitea raw 파일은 반드시 **web raw URL**을 사용해야 합니다 (`/api/v1/` 경로 사용 불가): +```bash +GITEA_URL="${GITEA_URL:-https://gitea.gc-si.dev}" +# common 파일: ${GITEA_URL}/gc/template-common/raw/branch/develop/<파일경로> +# 타입별 파일: ${GITEA_URL}/gc/template-<타입>/raw/branch/develop/<파일경로> +# 예시: +curl -sf "${GITEA_URL}/gc/template-common/raw/branch/develop/.claude/rules/team-policy.md" +curl -sf "${GITEA_URL}/gc/template-react-ts/raw/branch/develop/.editorconfig" +``` + ### 3. .claude/ 디렉토리 구성 -이미 팀 표준 파일이 존재하면 건너뜀. 없는 경우: +이미 팀 표준 파일이 존재하면 건너뜀. 없는 경우 위의 URL 패턴으로 Gitea에서 다운로드: - `.claude/settings.json` — 프로젝트 타입별 표준 권한 설정 + hooks 섹션 (4단계 참조) - `.claude/rules/` — 팀 규칙 파일 (team-policy, git-workflow, code-style, naming, testing) - `.claude/skills/` — 팀 스킬 (create-mr, fix-issue, sync-team-workflow, init-project) diff --git a/.claude/skills/mr/SKILL.md b/.claude/skills/mr/SKILL.md new file mode 100644 index 0000000..42bb407 --- /dev/null +++ b/.claude/skills/mr/SKILL.md @@ -0,0 +1,123 @@ +--- +name: mr +description: 커밋 + 푸시 + Gitea MR을 한 번에 생성합니다 +user-invocable: true +argument-hint: "[target-branch: develop|main] (기본: develop)" +allowed-tools: "Bash, Read, Grep" +--- + +현재 브랜치의 변경 사항을 커밋+푸시하고, Gitea에 MR을 생성합니다. +타겟 브랜치: $ARGUMENTS (기본: develop) + +## 수행 단계 + +### 1. 사전 검증 + +```bash +# 현재 브랜치 확인 (main/develop이면 중단) +BRANCH=$(git branch --show-current) + +# Gitea remote URL에서 owner/repo 추출 +REMOTE_URL=$(git remote get-url origin) +``` + +- 현재 브랜치가 `main` 또는 `develop`이면: "feature 브랜치에서 실행해주세요" 안내 후 종료 +- GITEA_TOKEN 환경변수 확인 (없으면 설정 안내) + +### 2. 커밋 + 푸시 (변경 사항이 있을 때만) + +```bash +git status --short +``` + +**커밋되지 않은 변경이 있으면**: +- 변경 범위(파일 목록, 추가/수정/삭제) 요약 표시 +- Conventional Commits 형식 커밋 메시지 자동 생성 +- **사용자 확인** (AskUserQuestion): 커밋 메시지 수락/수정/취소 +- 수락 시: `git add -A` → `git commit` → `git push` + +**변경이 없으면**: +- 이미 커밋된 내용으로 MR 생성 진행 +- 리모트에 push되지 않은 커밋이 있으면 `git push` + +### 3. MR 대상 브랜치 결정 + +타겟 브랜치 후보를 분석하여 표시: + +```bash +# develop과의 차이 +git log develop..HEAD --oneline 2>/dev/null +# main과의 차이 +git log main..HEAD --oneline 2>/dev/null +``` + +**사용자 확인** (AskUserQuestion): +- **질문**: "MR 타겟 브랜치를 선택하세요" +- 옵션 1: develop (추천, N건 커밋 차이) +- 옵션 2: main (N건 커밋 차이) +- 옵션 3: 취소 + +인자($ARGUMENTS)로 브랜치가 지정되었으면 확인 없이 바로 진행. + +### 4. MR 정보 구성 + +```bash +# 커밋 목록 +git log {target}..HEAD --oneline +# 변경 파일 통계 +git diff {target}..HEAD --stat +``` + +- **제목**: 커밋이 1개면 커밋 메시지 사용, 여러 개면 브랜치명에서 추출 + - `feature/ISSUE-42-user-login` → `feat: ISSUE-42 user-login` + - `bugfix/fix-timeout` → `fix: fix-timeout` +- **본문**: + ```markdown + ## 변경 사항 + - (커밋 목록 기반 자동 생성) + + ## 관련 이슈 + - closes #이슈번호 (브랜치명에서 추출, 없으면 생략) + + ## 테스트 + - [ ] 빌드 성공 확인 + - [ ] 기존 테스트 통과 + ``` + +### 5. Gitea API로 MR 생성 + +```bash +# remote URL에서 Gitea 호스트, owner, repo 파싱 +# 예: https://gitea.gc-si.dev/gc/my-project.git → host=gitea.gc-si.dev, owner=gc, repo=my-project + +curl -X POST "https://{host}/api/v1/repos/{owner}/{repo}/pulls" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{ + "title": "MR 제목", + "body": "MR 본문", + "head": "현재브랜치", + "base": "타겟브랜치" + }' +``` + +### 6. 결과 출력 + +``` +✅ MR 생성 완료 + 브랜치: feature/my-branch → develop + MR: https://gitea.gc-si.dev/gc/my-project/pulls/42 + 커밋: 3건, 파일: 5개 변경 + + 다음 단계: 리뷰어 지정 → 승인 대기 → 머지 +``` + +## 필요 환경변수 + +- `GITEA_TOKEN`: Gitea API 접근 토큰 + - 없으면: "Gitea 토큰이 필요합니다. Settings → Applications에서 생성하세요" 안내 + +## 기존 /create-mr과의 차이 + +- `/mr`: 커밋+푸시 포함, 빠른 실행 (일상적 사용) +- `/create-mr`: MR 생성만, 세부 옵션 지원 (상세 제어) diff --git a/.claude/skills/push/SKILL.md b/.claude/skills/push/SKILL.md new file mode 100644 index 0000000..a955c8d --- /dev/null +++ b/.claude/skills/push/SKILL.md @@ -0,0 +1,92 @@ +--- +name: push +description: 변경 사항을 확인하고 커밋 + 푸시합니다 +user-invocable: true +argument-hint: "[commit-message] (생략 시 자동 생성)" +allowed-tools: "Bash, Read, Grep" +--- + +현재 브랜치의 변경 사항을 확인하고, 사용자 승인 후 커밋 + 푸시합니다. +커밋 메시지 인자: $ARGUMENTS (생략 시 변경 내용 기반 자동 생성) + +## 수행 단계 + +### 1. 현재 상태 수집 + +```bash +# 현재 브랜치 +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. 커밋 + 푸시 실행 + +사용자가 수락하면: + +```bash +# 모든 변경 사항 스테이징 (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(-) +``` diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md new file mode 100644 index 0000000..fe289f9 --- /dev/null +++ b/.claude/skills/release/SKILL.md @@ -0,0 +1,134 @@ +--- +name: release +description: develop에서 main으로 릴리즈 MR을 생성합니다 +user-invocable: true +argument-hint: "" +allowed-tools: "Bash, Read, Grep" +--- + +develop 브랜치와 원격 동기화를 확인하고, develop → main 릴리즈 MR을 생성합니다. + +## 수행 단계 + +### 1. 사전 검증 + +```bash +# Gitea remote URL에서 owner/repo 추출 +REMOTE_URL=$(git remote get-url origin) + +# GITEA_TOKEN 확인 +echo $GITEA_TOKEN +``` + +- GITEA_TOKEN 환경변수 확인 (없으면 설정 안내 후 종료) +- 커밋되지 않은 변경 사항이 있으면 경고 ("먼저 /push로 커밋하세요") + +### 2. develop 브랜치 동기화 확인 + +```bash +# 최신 원격 상태 가져오기 +git fetch origin + +# 로컬 develop과 origin/develop 비교 +LOCAL=$(git rev-parse develop 2>/dev/null) +REMOTE=$(git rev-parse origin/develop 2>/dev/null) +BASE=$(git merge-base develop origin/develop 2>/dev/null) +``` + +**동기화 상태 판단:** + +| 상태 | 조건 | 행동 | +|------|------|------| +| 동일 | LOCAL == REMOTE | 바로 MR 생성 진행 | +| 로컬 뒤처짐 | LOCAL == BASE, LOCAL != REMOTE | "origin/develop에 새 커밋이 있습니다. `git pull origin develop` 후 다시 시도하세요" 안내 | +| 로컬 앞섬 | REMOTE == BASE, LOCAL != REMOTE | "로컬에 push되지 않은 커밋이 있습니다. `git push origin develop` 먼저 실행하시겠습니까?" 확인 | +| 분기됨 | 그 외 | "로컬과 원격 develop이 분기되었습니다. 수동으로 해결해주세요" 경고 후 종료 | + +**로컬 앞섬 상태에서 사용자가 push 수락하면:** +```bash +git push origin develop +``` + +### 3. develop → main 차이 분석 + +```bash +# main 대비 develop의 새 커밋 +git log main..origin/develop --oneline + +# 변경 파일 통계 +git diff main..origin/develop --stat + +# 커밋 수 +git rev-list --count main..origin/develop +``` + +차이가 없으면 "develop과 main이 동일합니다. 릴리즈할 변경이 없습니다" 출력 후 종료. + +### 4. MR 정보 구성 + 사용자 확인 + +**제목 자동 생성:** +``` +release: YYYY-MM-DD (N건 커밋) +``` + +**본문 자동 생성:** +```markdown +## 릴리즈 내용 +- (develop→main 커밋 목록, Conventional Commits type별 그룹핑) + +### 새 기능 (feat) +- feat(auth): 로그인 검증 로직 추가 +- feat(batch): 배치 스케줄러 개선 + +### 버그 수정 (fix) +- fix(api): 타임아웃 처리 수정 + +### 기타 +- chore: 의존성 업데이트 + +## 변경 파일 +- N files changed, +M insertions, -K deletions + +## 테스트 +- [ ] develop 브랜치 빌드 성공 확인 +- [ ] 주요 기능 동작 확인 +``` + +**사용자 확인** (AskUserQuestion): +- **질문**: "다음 내용으로 릴리즈 MR을 생성하시겠습니까?" +- 옵션 1: 생성 (추천) +- 옵션 2: 제목/본문 수정 (Other 입력) +- 옵션 3: 취소 + +### 5. Gitea API로 릴리즈 MR 생성 + +```bash +curl -X POST "https://{host}/api/v1/repos/{owner}/{repo}/pulls" \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{ + "title": "release: 2026-02-19 (12건 커밋)", + "body": "릴리즈 본문", + "head": "develop", + "base": "main", + "labels": [] + }' +``` + +### 6. 결과 출력 + +``` +✅ 릴리즈 MR 생성 완료 + 브랜치: develop → main + MR: https://gitea.gc-si.dev/gc/my-project/pulls/50 + 커밋: 12건, 파일: 28개 변경 + + 다음 단계: + 1. 리뷰어 지정 (main 브랜치는 1명 이상 리뷰 필수) + 2. 승인 후 머지 + 3. CI/CD 자동 배포 확인 (설정된 경우) +``` + +## 필요 환경변수 + +- `GITEA_TOKEN`: Gitea API 접근 토큰 diff --git a/.claude/skills/sync-team-workflow/SKILL.md b/.claude/skills/sync-team-workflow/SKILL.md index 56bb2fd..930d04d 100644 --- a/.claude/skills/sync-team-workflow/SKILL.md +++ b/.claude/skills/sync-team-workflow/SKILL.md @@ -26,8 +26,19 @@ curl -sf "${GITEA_URL}/gc/template-common/raw/branch/develop/workflow-version.js 1. `.claude/workflow-version.json`의 `project_type` 필드 확인 2. 없으면: `pom.xml` → java-maven, `build.gradle` → java-gradle, `package.json` → react-ts +### Gitea 파일 다운로드 URL 패턴 +⚠️ Gitea raw 파일은 반드시 **web raw URL**을 사용해야 합니다 (`/api/v1/` 경로 사용 불가): +```bash +GITEA_URL="${GITEA_URL:-https://gitea.gc-si.dev}" +# common 파일: ${GITEA_URL}/gc/template-common/raw/branch/develop/<파일경로> +# 타입별 파일: ${GITEA_URL}/gc/template-<타입>/raw/branch/develop/<파일경로> +# 예시: +curl -sf "${GITEA_URL}/gc/template-common/raw/branch/develop/.claude/rules/team-policy.md" +curl -sf "${GITEA_URL}/gc/template-react-ts/raw/branch/develop/.editorconfig" +``` + ### 4. 파일 다운로드 및 적용 -Gitea API로 해당 타입 + common 템플릿 파일 다운로드: +위의 URL 패턴으로 해당 타입 + common 템플릿 파일 다운로드: #### 4-1. 규칙 파일 (덮어쓰기) 팀 규칙은 로컬 수정 불가 — 항상 글로벌 최신으로 교체: @@ -42,7 +53,10 @@ Gitea API로 해당 타입 + common 템플릿 파일 다운로드: #### 4-2. settings.json (부분 갱신) - `deny` 목록: 글로벌 최신으로 교체 - `allow` 목록: 기존 사용자 커스텀 유지 + 글로벌 기본값 병합 -- `hooks`: 글로벌 최신으로 교체 +- `hooks`: init-project SKILL.md의 hooks JSON 블록을 참조하여 교체 (없으면 추가) + - SessionStart(compact) → on-post-compact.sh + - PreCompact → on-pre-compact.sh + - PostToolUse(Bash) → on-commit.sh #### 4-3. 스킬 파일 (덮어쓰기) ``` diff --git a/workflow-version.json b/workflow-version.json index 746b521..b6ee5aa 100644 --- a/workflow-version.json +++ b/workflow-version.json @@ -1,9 +1,27 @@ { - "version": "1.2.0", - "updated": "2026-02-14", + "version": "1.3.0", + "updated": "2026-02-19", "gitea_url": "https://gitea.gc-si.dev", "nexus_url": "https://nexus.gc-si.dev", "changes": [ + { + "version": "1.3.0", + "date": "2026-02-19", + "description": "Git 스킬 3종 추가 + 공지 페이지", + "items": [ + "/push: 변경 확인 → 커밋+푸시 원클릭", + "/mr: 커밋+푸시 + develop MR 생성 원클릭", + "/release: develop→main 릴리즈 MR 생성", + "Gitea 메인 페이지 워크플로우 업데이트 공지 섹션 추가", + "적용: 프로젝트에서 /sync-team-workflow 실행" + ], + "affected_files": [ + ".claude/skills/push/SKILL.md", + ".claude/skills/mr/SKILL.md", + ".claude/skills/release/SKILL.md", + "workflow-version.json" + ] + }, { "version": "1.2.0", "date": "2026-02-14",