Communitygithub.com

wemilabs/ship-to-prod

완료된 작업을 기본 브랜치에 한 번에 배포합니다. 에이전트에 구애받지 않는 스킬: 포맷, 린트, 타입체크, 빌드, 커밋, 푸시, PR, 머지.

ship-to-prod란 무엇인가요?

이 스킬은 AI 에이전트(예: Claude Code, Cursor, Codex)가 사용자가 'ship it'이라고 말한 후 완료된 작업을 기본 브랜치로 배포하는 전체 워크플로우를 자동화합니다. 패키지 매니저(pnpm, yarn, bun, npm), 기본 브랜치, PR 도구(gh CLI), 셸 환경을 자동으로 감지합니다. `deslop` 및 `unslop` 스킬을 통해 AI 생성 코드 및 텍스트를 정리하고, 포맷, 린트, 타입체크, 빌드를 순차적으로 실행하여 작업을 검증합니다. 그런 다음 기능 브랜치에서 작업 중인 경우 커밋, 푸시, PR 생성 및 병합을 수행하거나, 기본 브랜치에 직접 푸시합니다. 충돌이 발생하면 리베이스로 처리하며, 작업 브랜치는 유지됩니다. 이 스킬은 에이전트에 구애받지 않으므로 Claude Code, Cursor, Codex 등 다양한 플랫폼에서 사용할 수 있습니다.

지원 대상~Claude Code~Codex CLI✓Cursor
npx skills add wemilabs/ship-to-prod

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Ship to Prod

사용자가 작업 완료 후 "ship it" 또는 유사한 말을 하면, 두 번 묻지 않고 다음 단계를 따릅니다.

흐름은 현재 브랜치에 따라 달라집니다. 환경을 한 번 감지한 후 모든 단계에서 재사용합니다.

환경 감지

시작할 때 한 번, 병렬로 다음을 실행합니다:

  1. 패키지 매니저: 저장소 루트에서 잠금 파일을 확인합니다.
    • pnpm-lock.yaml -> pnpm
    • yarn.lock -> yarn
    • bun.lockb 또는 bun.lock -> bun
    • package-lock.json -> npm
    • package.json에 packageManager 필드가 있으면 그것을 사용합니다.
    • 아무것도 없으면 기본값은 npm입니다.
  2. 기본 브랜치: git symbolic-ref refs/remotes/origin/HEAD (또는 대체로 git config init.defaultBranch). 둘 다 실패하면 기본값은 main입니다.
  3. PR 도구: gh --version. gh가 설치되어 있고 인증된 경우 PR 생성 및 병합에 사용합니다. 그렇지 않으면 사용자가 수동으로 생성할 수 있도록 PR URL을 출력합니다.
  4. 셸: 현재 셸을 감지합니다. Windows(PowerShell)에서는 heredoc이 작동하지 않으므로 git commit에 여러 -m 플래그를 사용합니다. bash/zsh/fish 및 기타 Unix 셸에서는 heredoc을 사용합니다.

이것들을 <pkg>, <default-branch>, <gh-available>, <shell>로 저장하고 나머지 흐름에서 사용합니다.

단계

1. 정리 (선택 사항)

AI 생성 쓰레기를 커밋 전에 정리하는 두 가지 스킬이 있습니다. 둘 다 사용 가능하면 실행합니다:

  • deslop: 기본 브랜치와의 차이점(diff)에서 AI 코드 슬롭(불필요한 주석, 신뢰된 경로에 대한 방어적 검사, any 캐스트, 깊은 중첩)을 제거합니다. 기본 브랜치에 대한 현재 diff에서 호출합니다.
  • unslop: 산문(UI 문자열, 주석, 커밋 메시지, PR 설명)에서 AI 텍스트 텔을 제거합니다. 이 세션에서 작성한 모든 텍스트에서 호출합니다.

다음 단계로 넘어가기 전에 두 스킬이 플래그한 모든 문제를 수정합니다.

둘 중 하나라도 설치되어 있지 않으면, 조용히 건너뛰지 말고 사용자에게 누락된 스킬을 설치할지 물어보고 다음 선택지를 제시합니다. 두 스킬 모두 Cursor AI의 공식 플러그인 저장소(https://github.com/cursor/plugins)에서 제공되므로 신뢰할 수 있는 출처임을 언급합니다:

  • 전역 설치 (향후 모든 프로젝트에서 사용): npx skills add https://github.com/cursor/plugins --skill deslop unslop -g
  • 로컬 설치 (이 프로젝트만): npx skills add https://github.com/cursor/plugins --skill deslop unslop
  • 건너뛰기: 이번 실행에서는 누락된 스킬 없이 계속 진행합니다. 선택적 종속성이 누락되었다고 흐름을 차단하지 마십시오.

ask_user_question 도구를 사용하여 선택지를 제시합니다. 사용자가 전역 또는 로컬을 선택하면 설치 명령을 실행한 후, 스킬을 호출하기 전에 사용 가능한지 다시 확인합니다. 설치가 실패하거나 사용자가 건너뛰기를 선택하면 사용 가능한 스킬로 흐름을 계속 진행합니다.

2. 작업 확인

다음을 순서대로 실행하고, 계속하기 전에 문제를 수정합니다. 감지된 패키지 매니저로 <pkg>를 대체합니다. npm은 항상 run이 필요합니다(예: npm run format). pnpm/yarn/bun은 직접 호출이 가능합니다(예: pnpm format):

  1. <pkg> run format (또는 pnpm/yarn/bun의 경우 <pkg> format): 자동 포맷
  2. <pkg> run lint (또는 pnpm/yarn/bun의 경우 <pkg> lint): 수정한 파일의 린트 오류를 수정합니다(다른 파일의 기존 문제는 무시).
  3. <pkg> run typecheck (또는 pnpm/yarn/bun의 경우 <pkg> typecheck): 종료 코드 0으로 통과해야 합니다.
  4. <pkg> run build (또는 pnpm/yarn/bun의 경우 <pkg> build): 종료 코드 0으로 통과해야 합니다.

스크립트가 없으면(예: format 스크립트 없음) 해당 단계를 건너뛰고 기록합니다. 선택적 스크립트가 누락되었다고 전체 흐름을 실패시키지 마십시오. typecheck와 build는 존재하는 경우 필수입니다. 둘 다 없으면 경고와 함께 진행합니다.

사용 가능한 검사가 통과할 때까지 커밋으로 진행하지 마십시오.

확인 후 git status가 깨끗하면(스테이징되거나 언스테이징된 항목 없음) "배송할 항목 없음"을 보고하고 중지합니다. 빈 커밋을 시도하지 마십시오.

3. 현재 브랜치 평가

git branch --show-current를 실행하여 현재 브랜치 이름을 가져옵니다. <default-branch>와 비교합니다. 그런 다음 결정합니다:

  • <default-branch>에 있는 경우: 직접 커밋하고 푸시합니다. PR이나 병합 없이 5단계로 건너뜁니다.
  • 다른 브랜치에 있는 경우: 커밋, 푸시, <default-branch>로 PR 생성, 병합합니다. 4단계로 계속합니다.

4. 변경 사항 검토

git status, git diff, git log --oneline -5를 병렬로 실행하여 변경된 사항을 이해하고 커밋 스타일과 일치시킵니다.

5. 스테이징 및 커밋

git add -A를 실행한 후, conventional-commit 메시지(feat/fix/refactor)로 커밋합니다.

커밋 메시지 형식:

<type>: <간단한 설명>

<선택적 본문>

bash/zsh/fish 및 기타 Unix 셸에서는 heredoc을 사용합니다:

git commit -m "$(cat <<'EOF'
type: 제목

본문
EOF
)"

PowerShell(Windows)에서는 heredoc이 작동하지 않으므로 여러 -m 플래그를 사용합니다:

git commit -m "type: 제목" -m "본문"

6. 푸시

git push (또는 브랜치에 업스트림이 없으면 git push -u origin <branch>).

7. 기능 브랜치인 경우: PR 생성 및 병합

<gh-available>인 경우:

  • PR 본문을 임시 파일에 작성한 후, --body-file로 PR을 생성합니다(모든 셸, PowerShell 포함에서 작동):
    • gh pr create --base <default-branch> --head <current-branch> --title "<title>" --body-file <temp-file>
  • gh pr create가 반환된 후 임시 파일을 삭제합니다. 디스크에 남겨두지 마십시오.
  • 전략을 지정하지 않고 병합합니다(사용자 저장소 기본값이 적용되도록):
    • gh pr merge <number>

PR 본문 형식:

## 요약
<불릿 포인트>

#### 테스트 계획
- [ ] <체크리스트>

gh를 사용할 수 없는 경우:

  • 브랜치를 푸시합니다(6단계).
  • 사용자가 수동으로 PR을 생성하기 위해 열어야 할 URL을 출력합니다: <repo-url>/compare/<default-branch>...<current-branch>
  • 중지합니다. 사용자가 직접 PR을 생성하고 병합하도록 합니다. gh 없이 병합을 시도하지 마십시오.

8. 현재 브랜치 유지

병합 후 작업 브랜치를 삭제하지 마십시오. 다음 기능을 위해 열어둡니다.

9. 확인

사용자에게 PR URL(해당되는 경우) 및 병합/푸시 상태를 보고합니다.

충돌 처리

기능 브랜치가 <default-branch>보다 뒤쳐져 있으면 푸시 전에 리베이스합니다:

git fetch origin <default-branch>
git rebase origin/<default-branch>

충돌을 해결한 후 푸시 + PR + 병합으로 계속 진행합니다.

참고 사항

  • 대상은 항상 감지된 <default-branch>이며, 하드코딩된 이름이 아닙니다.
  • 병합 후 작업 브랜치를 절대 삭제하지 마십시오.
  • <default-branch>에 있으면 그냥 커밋하고 푸시합니다. PR이 필요 없습니다.
  • 사용자가 서두르더라도 확인 단계를 절대 건너뛰지 마십시오.
  • deslop 단계는 선택 사항입니다. 스킬이 없으면 건너뛰기로 대체하기 전에 설치(전역 또는 로컬)를 제안합니다.

관련 스킬