--- name: repo-split-orchestrator description: "GUARDiA 모노레포를 4개 독립 Gitea 저장소로 분리하는 오케스트레이터. 로컬 소스 분리 → Gitea repo 생성/push → CI/CD webhook 연결 → 매뉴얼 업데이트의 전체 파이프라인을 실행한다. 다음 상황에서 반드시 사용: (1) '레파지토리 분리', '저장소 분리', 'repo 분리'; (2) 'GitHub 제거', 'Gitea만 사용'; (3) '각 시스템 독립 repo'; (4) 분리 후 webhook/CI/CD 연결; (5) 다시 실행, 업데이트, 보완." --- # GUARDiA 레파지토리 분리 오케스트레이터 **실행 모드:** 파이프라인 (순차 서브 에이전트) `repo-splitter` → `gitea-publisher` → `cicd-wirer` → `doc-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: 사전 확인 ```bash # 현재 모노레포 상태 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) ```bash 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) ```bash # 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) ```bash # 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` 후 재실행