packaging

mirror-repo

산출물 — github.com 에만 있던 기존 <domain>-skills repo 의 GHES 미러 한 벌. GHES 위의 private repo, 로컬 클론(origin=GHES over SSH, upstream=github.com over HTTPS), 그리고 그 GHES repo 로 push 된 기본 브랜치까지.

01

언제 쓰고, 언제 안 쓰는가

상황에 따라 다섯 개의 스킬(과 갱신 스크립트) 중 하나를 고른다.

상황쓸 스킬
외부 repo 가 github.com 에는 있는데 GHES 에는 없다 (git-clone-skills.sh 가 실패한다) mirror-repo
이미 미러된 repo 를 최신으로 당긴다 git-pull-skills.sh (스킬 아님)
repo 가 아직 없다. 흩어진 스킬을 묶어 새로 만든다 scaffold-repo
repo 는 있는데 이름이 컨벤션에 안 맞는다 rename-repo
미러한 repo 의 구조가 표준에서 벗어났는지 알고 싶다 structure-check
그 구조를 실제로 고친다 structure-refactor
mirror-repo 는 신규 미러 전용이다. 대상 디렉터리나 GHES repo 가 이미 존재하면 덮어쓰지 않고 중단한다 — 멱등하지 않다. 기존 미러 갱신은 git-pull-skills.sh 의 몫이다.
02

호출 형식

<repo-name> 만 필수이고, 나머지는 모두 기본값이 있다.

/packaging:mirror-repo <repo-name> [--owner <owner>] [--ghes-owner <owner>]
                       [--dest <path>] [--host <host>] [--ghes-host <host>] [--dry-run]
/packaging:mirror-repo help
인자 / 플래그의미기본값
<repo-name> <domain>-skills 형식 repo 이름 (필수). -skills 접미어가 없으면 자동으로 붙이고 알려 준다. claude-plugin- prefix 는 pre-#1410 옛 규칙이라 거부한다 —
--owner <owner> upstream owner dEitY719
--ghes-owner <owner> 미러를 만들 GHES owner 활성 GHES 로그인 (gh api --hostname <ghes-host> user)
--dest <path> 클론할 부모 디렉터리 ~/para/project/skills/
--host <host> upstream 호스트 github.com
--ghes-host <host> GHES 호스트 dotfiles SSOT _gh_resolve_host
--dry-run 계획만 출력, 클론 / repo 생성 / push 없음 off
엔진 스크립트 lib/mirror_repo.sh 에는 사용자 플래그가 아닌 --yes 가 하나 더 있다. 사용자가 repo 생성과 push 둘 다 승낙했을 때만 스킬이 붙여 넘긴다.
03

동작 단계

단계를 눌러 펼치면 상세가 보인다. 하드 중단 지점은 4곳이다 — 0단계 인증 실패, 1단계 검증 실패, 4단계 gh repo create 실패, push 거부.

한 번에 한 단계만 열립니다.
0 호스트 해석 + 인증 중단 지점

upstream 호스트는 --host (기본 github.com), GHES 호스트는 --ghes-host, 없으면 dotfiles SSOT _gh_resolve_host. 양쪽 모두 gh auth status 를 통과해야 하고, GHES owner 는 --ghes-owner 가 없으면 활성 GHES 로그인으로 정한다.

GHES 호스트를 못 찾거나 upstream 호스트와 같으면 중단. 인증 실패도 하드 중단 지점이다.

1 검증 중단 지점

-skills 접미어 보정, claude-plugin- prefix 거부, 소문자-하이픈 강제.

<dest>/<repo-name> 이 이미 있거나, upstream repo 가 없거나, GHES repo 가 이미 있으면 중단.

2 [PLAN] 블록 출력 항상

[PLAN] 블록은 항상 출력된다. --dry-run 이면 여기서 정지 — 클론도, repo 생성도, push 도 없다.

3 upstream 클론

git clone https://<host>/<owner>/<repo-name>.git <dest>/<repo-name> — HTTPS 로 클론한다.

4 GHES repo 생성 사용자 확인중단 지점

사용자 확인을 받고 GHES 에서 gh repo create <ghes-owner>/<repo-name> --private.

gh repo create 실패는 하드 중단 지점이다. 여기서 거절하면 로컬 클론만 남는다.

5 remote 설정

origin -> git@<ghes-host>:<ghes-owner>/<repo-name>.git (SSH)

upstream -> https://<host>/<owner>/<repo-name>.git (HTTPS)

6 push 사용자 확인중단 지점

사용자 확인을 받고 git push -u origin <branch>. <branch> 는 클론된 기본 브랜치다.

push 거부는 하드 중단 지점이다. 여기서 거절하면 GHES repo 는 비어 있는 채로 남는다.

7 재확인 후 [OK] 리포트

git remote -v 와 GHES 쪽 gh repo view 로 다시 확인한 뒤 [OK] 리포트를 출력한다.

04

주의사항 / 제약

여섯 가지 제약을 그대로 지킨다.

신규 미러 전용

<dest>/<repo-name> 이나 GHES repo 가 이미 있으면 무조건 중단한다. 기존 미러 갱신은 git-pull-skills.sh 를 쓴다.

호스트는 추측하지 않는다

--ghes-host 도 없고 _gh_resolve_host 도 못 읽으면 중단, GHES 호스트가 upstream 호스트와 같아도(공용 PC 에서 github.com 이 나오는 경우) 중단한다. GHES 호스트나 사용자를 하드코딩하지 않는다.

외부 영향 단계는 각각 확인

4단계(repo 생성)와 6단계(push)는 외부에 영향을 주므로 각각 확인을 받는다. [y/N] 에서 EOF 는 거절로 친다. git push --force 는 절대 쓰지 않는다.

--dry-run 은 아무것도 쓰지 않는다

클론도, repo 생성도, push 도 없다. [PLAN] 블록만 출력한다.

하드 중단 지점은 4곳

0단계 인증 실패, 1단계 검증 실패, 4단계 gh repo create 실패, push 거부.

marketplaces.json 은 건드리지 않는다

매니페스트에 추가할지는 사용자 선택이다.