Communitygithub.com

juraj-blahunka/release

simctlhouse의 새 버전을 엔드투엔드로 릴리스합니다. 버전 범프, 릴리스 노트 작성, 서명 및 공증된 tarball 빌드, 태그 생성, GitHub 릴리스 생성, Homebrew 탭에 포뮬러 게시까지 자동화합니다. 릴리스, 배포, 출시 요청 시 사용합니다.

release란 무엇인가요?

이 스킬은 simctlhouse 도구의 완전한 릴리스 프로세스를 자동화하는 AI 에이전트 전용 명령어 집합입니다. GitHub 릴리스, 공증된 tarball, Homebrew 탭 포뮬러 업데이트를 포함한 전체 워크플로우를 처리합니다. 주요 기능으로는 버전 선택 및 범프, 사용자와 협력한 릴리스 노트 초안 작성, scripts/release.sh를 통한 빌드 및 서명/공증, tarball 연기 테스트, GitHub 릴리스 생성 및 태그 푸시, Homebrew 탭에 포뮬러 게시, 최종 Homebrew 설치 테스트 완료까지 다룹니다. 스킬은 실패 시 복구 절차도 제공하며, 공개된 아티팩트 수정 시 주의사항을 명시합니다. Claude Code, Cursor, Codex 등 AI 코딩 도구와 함께 사용하기에 적합합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/juraj-blahunka/simctlhouse/tree/HEAD/.agents/skills/release

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

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

문서

simctlhouse 릴리스

이 저장소의 X.Y.Z 버전을 배포합니다: 공증된 tarball이 포함된 GitHub 릴리스와 탭의 포뮬러를 게시합니다. scripts/release.sh가 빌드, 서명, 공증 및 패키징을 담당하며, 이 스킬은 그 외 모든 작업을 수행합니다. docs/how-to.md("릴리스 만들기")와 docs/decisions.md의 D27에서 디자인을 설명합니다.

고정 이름:

항목값
GitHub 저장소juraj-blahunka/simctlhouse (리모트 origin)
탭 체크아웃../homebrew-tap, GitHub juraj-blahunka/homebrew-tap, juraj-blahunka/tap으로 사용
탭 내 포뮬러Formula/simctlhouse.rb
태그vX.Y.Z
tarballdist/simctlhouse-X.Y.Z-macos.tar.gz
릴리스 노트dist/release-notes-X.Y.Z.md (dist/는 git에서 무시됨)

별도의 지시가 없는 한 모든 명령은 저장소 루트에서 실행하세요. 첫 번째 실패에서 멈추고, 실패한 내용과 출력을 보고하며, 우회하지 마십시오 (--skip-notarize, --allow-dirty, --force 또는 --no-verify 사용 금지).

1. 버전 선택

사용자가 제공한 버전을 사용합니다. 그렇지 않으면 하나를 제안하고 질문합니다: git log --oneline $(git describe --tags --abbrev=0 2>/dev/null)..HEAD (태그가 없으면 모든 커밋)로 마지막 태그 이후 변경 사항을 나열한 후, feat: 커밋에서는 마이너 버전을, 수정만 있는 경우 패치 버전을 올립니다.

2. 사전 조건 확인

아무것도 변경하기 전에 다음을 모두 확인하고, 모든 실패를 한 번에 보고하세요:

git rev-parse --abbrev-ref HEAD                  # main
git status --porcelain --untracked-files=no      # 비어 있음
git fetch origin && git status -sb | head -1     # origin/main보다 뒤쳐지지 않음
git ls-remote --tags origin "refs/tags/vX.Y.Z"   # 비어 있음: 버전이 릴리스되지 않음
gh auth status                                   # 로그인됨
git -C ../homebrew-tap status --porcelain        # 탭이 존재하고 깨끗함
git -C ../homebrew-tap pull --ff-only            # 탭이 최신 상태임

origin 또는 탭이 없으면, 사용자에게 무엇을 생성해야 하는지 알리고 멈추세요; 직접 GitHub 저장소를 생성하지 마십시오. 새 탭에는 GitHub 저장소 juraj-blahunka/homebrew-tap가 필요하며, ../homebrew-tap에 클론하고 Formula/ 디렉토리를 포함해야 합니다.

3. 버전 범프

Sources/simctlhouse/SimctlHouse.swift의 version:이 X.Y.Z가 아니면, 그곳에서 변경하고, swift build와 swift test를 실행한 후, 해당 파일만 커밋하세요:

git commit -m "chore: release X.Y.Z" Sources/simctlhouse/SimctlHouse.swift

4. 사용자와 함께 릴리스 노트 작성

마지막 릴리스 이후 변경 사항을 기반으로 노트 초안을 작성하세요:

git log --format='%h %s%n%b' $(git describe --tags --abbrev=0 2>/dev/null)..HEAD
git diff --stat $(git describe --tags --abbrev=0 2>/dev/null)..HEAD

커밋을 읽고, 제목이 불명확한 경우 diff 자체를 읽으세요; 노트는 CLI와 스킬 사용자가 무엇을 알아차리는지 설명하며, 코드가 어떻게 변경되었는지는 설명하지 않습니다.

  • 릴리스가 무엇에 관한 것인지 한두 문장으로 시작하세요.

  • 그런 다음 섹션을 추가하되, 빈 섹션은 생략합니다: ## 새로운 기능, ## 변경됨, ## 수정됨, 먼저 ## Breaking (스크립트나 에이전트를 깨뜨리는 경우: 명령어나 플래그 이름 변경, 출력 변경, 종료 코드 변경).

  • 변경 사항당 한 개의 글머리 기호, 명령어나 플래그는 백틱으로 감싸기 (예: simctlhouse skill install).

  • 사용자가 알아차리지 않는 한 chore:, refactor:, test: 및 문서 전용 커밋은 생략하세요.

  • 설치 방법으로 정확히 다음과 같이 끝내세요:

    ## 설치
    
    ```sh
    brew install juraj-blahunka/tap/simctlhouse   # 또는: brew upgrade simctlhouse
    simctlhouse skill install                     # 한 번 실행하여 에이전트 스킬 연결
    ```
    

초안을 dist/release-notes-X.Y.Z.md에 작성하고 사용자에게 전체 텍스트를 보여주세요. 사용자가 수락하거나 변경할 사항을 말하도록 요청하세요; 변경 사항을 파일에 적용하고 전체 텍스트를 다시 보여주세요. 명시적으로 수락할 때까지 반복하고, 그 전에는 빌드로 진행하지 마십시오. 파일은 그대로 게시되므로, 질문이나 TODO와 같이 사용자를 대상으로 한 내용이 포함되어서는 안 됩니다.

5. 릴리스 빌드

scripts/release.sh X.Y.Z

몇 분이 소요되며, 대부분 Apple의 공증을 기다리는 데 시간이 걸립니다; 최대 10분까지 허용하세요. 버전 불일치, 커밋되지 않은 소스, 다른 곳을 가리키는 태그가 있으면 실행을 거부하며, 테스트와 린트를 실행하고, scripts/build.sh를 통해 빌드하고, Apple이 공증 티켓을 게시했는지 확인하며, 자체 tarball을 검증합니다. 마지막에 tarball 경로, sha256 및 dist/simctlhouse.rb를 출력합니다.

6. tarball 연기 테스트

게시하려는 정확한 바이트를 실제 시뮬레이터에 대해 실행하세요:

scripts/smoke-test.sh dist/simctlhouse-X.Y.Z-macos.tar.gz

tarball을 임시 디렉토리에 풀고, 거기에 스킬을 링크하고, 임시 SIMCTLHOUSE_HOME에서 기기를 획득하고, 데몬이 시작되었는지 확인하고 중지 및 재시작할 수 있는지 확인하고, 기기를 해제하고 데몬이 종료될 때까지 기다린 후 삭제하고, 이전에 존재했던 모든 시뮬레이터가 여전히 존재하는지 확인합니다. 첫 부팅은 약 30초가 걸립니다; 부하가 많은 시스템에서는 최대 5분까지 허용하세요. 시뮬레이터가 누락되었다고 보고하면 목록을 사용자에게 보여주세요: 다른 에이전트가 그동안 자신의 기기를 삭제했을 수 있으며, 사용자만 확인할 수 있습니다.

7. 게시 전 확인

여기부터 모든 것은 공개적이고 되돌리기 어렵습니다. 사용자에게 버전, 커밋 (git log --oneline -1), sha256, 연기 테스트 결과, 승인된 릴리스 노트 파일 및 아래 단계를 보여주고, 명시적인 허락을 기다리세요.

8. 게시

모든 게시 단계가 이미 존재하는 것을 가리키도록 다음 순서로 실행하세요:

git push origin main
git tag -a vX.Y.Z -m "simctlhouse X.Y.Z"
git push origin vX.Y.Z
gh release create vX.Y.Z dist/simctlhouse-X.Y.Z-macos.tar.gz \
    --repo juraj-blahunka/simctlhouse --verify-tag --title "simctlhouse X.Y.Z" --notes-file dist/release-notes-X.Y.Z.md

업로드된 tarball이 포뮬러가 설명하는 것과 일치하는지 확인하세요; 불일치는 scripts/release.sh가 업로드 후 다시 실행되었음을 의미합니다:

gh release download vX.Y.Z --repo juraj-blahunka/simctlhouse --pattern '*.tar.gz' --output - | shasum -a 256
grep sha256 dist/simctlhouse.rb

그런 다음 포뮬러를 게시하세요:

mkdir -p ../homebrew-tap/Formula
cp dist/simctlhouse.rb ../homebrew-tap/Formula/simctlhouse.rb
git -C ../homebrew-tap add Formula/simctlhouse.rb
git -C ../homebrew-tap commit -m "simctlhouse X.Y.Z"
git -C ../homebrew-tap push

9. Homebrew를 통해 확인

푸시는 탭의 tests 워크플로를 시작하며, 이 워크플로는 포뮬러를 감사하고, 깨끗한 macOS 15 및 26 시스템에 설치하고, test 블록을 실행합니다. 사용자에게 배포되기 전에 게시된 포뮬러의 유일한 실제 설치이므로, 통과할 때까지 기다리세요:

commit="$(git -C ../homebrew-tap rev-parse HEAD)"
gh run list --repo juraj-blahunka/homebrew-tap --commit "$commit" --json databaseId,url   # 푸시 후 몇 초 동안 비어 있음
gh run watch <databaseId> --repo juraj-blahunka/homebrew-tap --exit-status

그런 다음 이 시스템에서 포뮬러를 확인하세요. Homebrew는 신뢰되지 않은 탭의 포뮬러를 로드하지 않습니다 (brew info조차도); 따라서 먼저 이 포뮬러 하나를 신뢰하세요; 이는 사용자의 Homebrew 구성을 변경합니다 (brew install juraj-blahunka/tap/simctlhouse 명령과 동일). 나머지는 읽기와 다운로드만 수행하며, 아무것도 설치하지 않습니다:

brew tap juraj-blahunka/tap 2>/dev/null; brew update
brew trust --formula juraj-blahunka/tap/simctlhouse
brew info juraj-blahunka/tap/simctlhouse            # X.Y.Z를 표시
brew fetch --force juraj-blahunka/tap/simctlhouse   # 다운로드하고 sha256 확인
brew audit --strict --online juraj-blahunka/tap/simctlhouse

사용자가 이미 탭에서 simctlhouse를 설치했다면, brew upgrade simctlhouse를 제안한 후 simctlhouse --version과 simctlhouse skill status를 실행하세요.

10. 보고

사용자에게 릴리스 URL (gh release view vX.Y.Z --repo juraj-blahunka/simctlhouse --json url -q .url), 탭 커밋, 통과한 tests 실행 URL, 설치 명령 brew install juraj-blahunka/tap/simctlhouse를 제공하세요.

실패한 릴리스 복구

  • 8단계 이전의 실패: 아무것도 공개되지 않음. 원인을 수정하고 다시 시작하세요; scripts/release.sh를 다시 실행해도 괜찮습니다.
  • 태그가 푸시되었지만 릴리스가 누락됨: gh release create 단계를 다시 실행하세요.
  • 릴리스가 생성되었지만 탭이 업데이트되지 않음: 탭 단계를 다시 실행하세요.
  • 탭의 tests 실행 실패: 사용자에게 실패한 단계의 로그를 보여주세요 (gh run view <databaseId> --repo juraj-blahunka/homebrew-tap --log-failed). 지금 설치하는 사용자도 동일한 실패를 만나기 때문입니다. 새 탭 커밋으로 수정하세요; 탭에 강제 푸시하지 마십시오. 사용자의 brew update가 가져오기 때문입니다.
  • 게시 후 노트 수정 필요: dist/release-notes-X.Y.Z.md를 사용자와 함께 편집한 후, gh release edit vX.Y.Z --repo juraj-blahunka/simctlhouse --notes-file dist/release-notes-X.Y.Z.md를 실행하세요.
  • tarball이 업로드된 버전에 대해 scripts/release.sh를 다시 실행하지 마십시오. 모든 빌드는 새 sha256을 가지기 때문입니다. 손상된 업로드를 교체하려면 먼저 사용자에게 물어본 후, gh release upload vX.Y.Z <tarball> --clobber로 새 빌드를 업로드하고 일치하는 포뮬러를 게시하세요.
  • 사용자의 명시적 승인 없이 푸시된 태그나 게시된 릴리스를 삭제하거나 이동하지 마십시오.

관련 스킬