---
name: ship
description: "원커맨드 배포 워크플로우: main 동기화 → 테스트 → 커버리지 → VERSION bump → CHANGELOG → PR 생성. 드라이런 기본."
triggers:
  - "ship"
  - "배포"
  - "deploy"
  - "push to main"
  - "PR 생성"
usage: "/ship [--dry-run|--live]"
---

# /ship — 원커맨드 배포 워크플로우

> 출처: gstack `/ship` 스킬 패턴 (MIT 라이선스, https://github.com/garrytan/gstack)
> 우리 시스템에 맞게 커스텀 (드라이런 기본, 실 배포 시 제이회장님 승인 필수)

프로젝트 코드를 main 브랜치에 안전하게 배포하는 전체 워크플로우를 자동 실행한다.

## User-invocable
사용자가 `/ship`을 입력하면 이 스킬을 실행한다.

## Arguments
- `/ship` — 드라이런 모드 (기본, 실제 push/PR 없음)
- `/ship --dry-run` — 명시적 드라이런
- `/ship --live` — 실 배포 (⚠️ 제이회장님 승인 필수)

---

## Step 0: Pre-flight 확인

1. 현재 브랜치 확인. main/master에서 직접 실행하면 중단: "feature 브랜치에서 실행하세요."
2. `git status` 실행 (uncommitted changes 확인)
3. `git fetch origin` 실행

---

## Step 1: Main 브랜치 동기화

```bash
git fetch origin main
git merge origin/main --no-edit
```

- 충돌 발생 시: 자동 해결 시도. 복잡한 충돌은 중단하고 보고.
- 이미 최신이면 조용히 진행.

---

## Step 2: 전체 테스트 실행

```bash
python3 -m pytest tests/ -x
```

- **실패 시 중단.** 테스트가 모두 통과해야 다음 단계 진행.
- 테스트 디렉토리가 없으면 경고 후 진행.

---

## Step 3: 커버리지 감사

```bash
python3 -m pytest tests/ --cov=. --cov-report=term-missing 2>/dev/null || echo "coverage not available"
```

- 커버리지 하락 시 경고 (이전 배포 대비).
- 커버리지 도구가 없으면 건너뛰기.

---

## Step 4: pyright 타입 체크

```bash
bash /home/jay/workspace/teams/shared/run_pyright.sh <변경된 파일들>
```

- 에러 0건 확인. 에러 있으면 중단.

---

## Step 5: VERSION bump (semver)

1. `VERSION` 파일 읽기 (없으면 `0.1.0` 초기화)
2. 변경량 기반 자동 결정:
   - < 50줄 변경: PATCH (x.y.Z)
   - 50+ 줄 변경: MINOR (x.Y.0) — 확인 필요
   - 브레이킹 체인지: MAJOR (X.0.0) — 확인 필요
3. VERSION 파일 업데이트

---

## Step 6: CHANGELOG 자동 생성

1. `CHANGELOG.md` 읽기 (없으면 생성)
2. `git log origin/main..HEAD --oneline`에서 항목 추출
3. conventional commits 기반 분류:
   - `### Added` — feat:
   - `### Changed` — refactor:, chore:
   - `### Fixed` — fix:
   - `### Removed` — 삭제 관련
4. 날짜와 버전 포함하여 삽입

> **스킬 연동**: CHANGELOG 생성 시 `/changelog-generator` 스킬을 호출하여 Keep a Changelog 포맷으로 생성할 수 있다. 한국어/영어 이중 지원. 수동 분류보다 정확한 conventional commits 파싱 제공.

---

## Step 7: 커밋

```bash
git add VERSION CHANGELOG.md
git commit -m "chore: bump version to vX.Y.Z

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
```

---

## Step 8: Push & PR (드라이런 vs 라이브)

### 드라이런 모드 (기본)
```
[DRY-RUN] 아래 명령이 실행될 예정:
  git push -u origin <branch>
  gh pr create --base main --title "..." --body "..."

실 배포를 원하면 `/ship --live`로 실행하세요.
⚠️ 실 배포 시 제이회장님 승인이 필요합니다.
```

### 라이브 모드 (`--live`)
```bash
# ⚠️ 제이회장님 승인 확인 필수
git push -u origin <branch>
gh pr create --base main --title "<type>: <summary>" --body "$(cat <<'EOF'
## Summary
<CHANGELOG에서 추출>

## Test plan
- [x] pytest 전체 통과
- [x] pyright 0 errors
- [x] 커버리지 확인

🤖 Generated with Claude Code
EOF
)"
```

PR URL 출력 후 완료.

---

## 산출물

- VERSION 파일 업데이트
- CHANGELOG.md 업데이트
- (라이브 모드) PR 생성

---

## Important Rules

- **드라이런이 기본.** 실 배포는 `--live` 명시 필수.
- **테스트 실패 시 절대 push 금지.**
- **force push 절대 금지.** 일반 `git push`만 사용.
- **main/master 브랜치에서 직접 실행 금지.**
- **제이회장님 승인 없이 `--live` 실행 금지.**
- **CHANGELOG은 자동 생성.** 사용자에게 작성 요청하지 않음.

---

**스킬 버전**: v1.0
**작성일**: 2026-03-23
**출처**: gstack `/ship` 스킬 (MIT 라이선스) 커스텀
