zioinfo-mail/.claude/skills/repo-split-orchestrator/SKILL.md
DESKTOP-TKLFCPR\ython c1ae173a9f refactor(paths): update all path references after workspace reorganization
CLAUDE.md: directory structure updated (itsm/->workspace/guardia-itsm/, etc.)
repo-splitter.md: subtree split prefixes updated to workspace/ paths
repo-split-orchestrator/SKILL.md: split target paths updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 23:57:45 +09:00

6.2 KiB
Raw Blame History

name description
repo-split-orchestrator GUARDiA 모노레포를 4개 독립 Gitea 저장소로 분리하는 오케스트레이터. 로컬 소스 분리 → Gitea repo 생성/push → CI/CD webhook 연결 → 매뉴얼 업데이트의 전체 파이프라인을 실행한다. 다음 상황에서 반드시 사용: (1) '레파지토리 분리', '저장소 분리', 'repo 분리'; (2) 'GitHub 제거', 'Gitea만 사용'; (3) '각 시스템 독립 repo'; (4) 분리 후 webhook/CI/CD 연결; (5) 다시 실행, 업데이트, 보완.

GUARDiA 레파지토리 분리 오케스트레이터

실행 모드: 파이프라인 (순차 서브 에이전트) repo-splittergitea-publishercicd-wirerdoc-updater


분리 목표

현재 (모노레포)                          목표 (독립 repo × 5)
C:\GUARDiA\workspace\                   C:\GUARDiA\repos\
├── zioinfo-web/      →                 ├── zioinfo-web\       (zio/zioinfo-web)
├── guardia-itsm/     →                 ├── guardia-itsm\      (zio/guardia-itsm)
├── guardia-manager/  →                 ├── guardia-manager\   (zio/guardia-manager)
├── guardia-messenger/→                 ├── guardia-messenger\ (zio/guardia-messenger)
└── guardia-docs/     →                 └── guardia-docs\      (zio/guardia-docs)

Phase 0: 사전 확인

# 현재 모노레포 상태
cd C:\GUARDiA
git status         # 커밋 안된 변경사항 없어야 함
git remote -v      # origin(GitHub) + gitea + gitea-itsm 확인

# Gitea 서버 상태
curl http://101.79.17.164:3000 --head

⚠️ 주의사항:

  • 미커밋 변경사항이 있으면 먼저 커밋
  • 분리 중 원본 모노레포 수정 금지
  • C:\GUARDiA\repos\ 디렉토리가 .gitignore에 추가됨

Phase 1: 로컬 소스 분리 (repo-splitter)

cd C:\GUARDiA

# 1-1. repos 디렉토리 생성
mkdir -p C:\GUARDiA\repos

# 1-2. 각 서브트리 히스토리 분기
git subtree split --prefix=workspace/zioinfo-web       -b split/zioinfo-web
git subtree split --prefix=workspace/guardia-itsm      -b split/guardia-itsm
git subtree split --prefix=workspace/guardia-manager   -b split/guardia-manager
git subtree split --prefix=workspace/guardia-messenger -b split/guardia-messenger

# 1-3. 각 독립 repo 디렉토리 생성 및 클론
for name in zioinfo-web guardia-itsm guardia-manager guardia-messenger; do
  split_branch="split/$name"
  target="C:/GUARDiA/repos/$name"
  mkdir -p "$target"
  git clone --no-local --branch "$split_branch" . "$target"
  echo "Created: $target"
  git -C "$target" log --oneline -3
done

# 1-4. manual/ → guardia-docs
git subtree split --prefix=workspace/guardia-docs -b split/guardia-docs
mkdir -p C:\GUARDiA\repos\guardia-docs
git clone --no-local --branch split/guardia-docs . C:\GUARDiA\repos\guardia-docs

# 1-5. repos/ 모노레포 .gitignore에 추가
echo "repos/" >> C:\GUARDiA\.gitignore

Phase 2: Gitea 저장소 생성 + push (gitea-publisher)

# 2-1. 신규 저장소 생성 (manager, messenger, docs)
for repo in guardia-manager guardia-messenger guardia-docs; do
  curl -sf -X POST http://101.79.17.164:3000/api/v1/user/repos \
    -u 'zio:Zio@Admin2026!' \
    -H 'Content-Type: application/json' \
    -d "{\"name\":\"$repo\",\"private\":false,\"auto_init\":false}" \
  && echo "Created $repo"
done

# 2-2. 각 독립 repo에 Gitea remote 설정 + push
declare -A REPOS=(
  [zioinfo-web]="zio/zioinfo-web"
  [guardia-itsm]="zio/guardia-itsm"
  [guardia-manager]="zio/guardia-manager"
  [guardia-messenger]="zio/guardia-messenger"
  [guardia-docs]="zio/guardia-docs"
)
for local_name in "${!REPOS[@]}"; do
  repo_path="C:/GUARDiA/repos/$local_name"
  gitea_url="http://zio:Zio%40Admin2026%21@101.79.17.164:3000/${REPOS[$local_name]}.git"
  cd "$repo_path"
  git remote add origin "$gitea_url"
  git push origin main --force
  echo "Pushed: $local_name${REPOS[$local_name]}"
done

# 2-3. 모노레포에서 GitHub(origin) remote 제거
cd C:\GUARDiA
git remote remove origin
git remote -v  # gitea + gitea-itsm만 남아야 함

Phase 3: CI/CD Webhook 연결 (cicd-wirer)

# 3-1. Gitea webhook 등록
REPOS_WITH_WEBHOOK=(zioinfo-web guardia-itsm guardia-manager guardia-messenger)
for repo in "${REPOS_WITH_WEBHOOK[@]}"; do
  curl -sf -X POST "http://101.79.17.164:3000/api/v1/repos/zio/$repo/hooks" \
    -u 'zio:Zio@Admin2026!' \
    -H 'Content-Type: application/json' \
    -d '{
      "type":"gitea",
      "config":{"url":"http://localhost:9999","content_type":"json","secret":"zioinfo-deploy-2026"},
      "events":["push"],"active":true
    }' \
  && echo "Webhook: $repo"
done

# 3-2. deploy_server.py repo name 매핑 업데이트 (서버에서)
# guardia-manager, guardia-messenger 배포 경로 추가

Phase 4: 문서 업데이트 (doc-updater)

  • 각 독립 repo에 CLAUDE.md 생성
  • manual/43_레파지토리_구조_가이드.md 신규 작성
  • manual/20_zio서버_CICD_가이드.md 업데이트
  • manual/42_zio서버_소프트웨어_구성도.md 업데이트

에러 핸들링

오류 원인 해결
subtree split 실패 prefix 경로 오탈자 git log --oneline -- {prefix} 확인
Gitea push 413 파일 크기 초과 git lfs 또는 대용량 파일 .gitignore 추가
Gitea repo 이미 존재 중복 생성 시도 오류 무시하고 진행 (이미 있으면 OK)
webhook 미트리거 저장소명 불일치 deploy_server.py의 repo name 매핑 확인

완료 검증 체크리스트

□ C:\GUARDiA\repos\ 아래 5개 디렉토리 존재
□ 각 repo git log 정상 (히스토리 있음)
□ Gitea에 5개 저장소 확인 가능
□ GitHub remote(origin) 제거됨
□ 각 repo에 Gitea remote만 존재
□ webhook 4개 등록 완료
□ 매뉴얼 43 신규 생성
□ CLAUDE.md 업데이트

테스트 시나리오

정상 흐름:

  1. git subtree split → 각 브랜치 생성 확인
  2. repos/ 디렉토리에 클론 → git log 히스토리 확인
  3. Gitea push → 웹 브라우저에서 저장소 확인
  4. test push → webhook 트리거 → 서버 배포 로그 확인

에러 흐름:

  • split 브랜치 이미 존재 → 먼저 git branch -D split/xxx 후 재실행