| name | appstore-deploy |
| description | App Store release automation โ run the full pipeline at once or control it step by step. Auto-detects and self-heals errors during deployment, and self-diagnoses script/environment issues. Use for '๋ฐฐํฌ', 'deploy', 'TestFlight', '์ฑ์คํ ์ด', 'App Store', '์คํฌ๋ฆฐ์ท', 'screenshots', '๋ฉํ๋ฐ์ดํฐ', 'metadata', '๋ฒ ํ', '์ถ์', 'App Preview', '์์ฐ ์์' requests. For the full release pipeline use the /release skill. Use this skill to directly run individual deployment steps (screenshots, metadata, TestFlight, App Store). |
App Store Release Automation
Manages the App Store deployment pipeline for Apple apps. Auto-detects errors during deployment and self-heals where possible.
Respond to the user in Korean.
Core Principle: Self-Healing
Every step in this skill follows an Execute โ Verify โ Repair loop:
์คํ (Execute)
โ ์ฑ๊ณต? โ ๋ค์ ๋จ๊ณ
โ ์คํจ? โ ์ค๋ฅ ๋ถ์ (Diagnose)
โ ์๋ ์๋ณต ๊ฐ๋ฅ? โ ์๋ณต (Repair) โ ์ฌ์คํ
โ ์๋ณต ๋ถ๊ฐ? โ ์ฌ์ฉ์์๊ฒ ์๋ ์คํ ์๋ด (! ๋ช
๋ น ์ ์)
Phase 0: Pre-flight Check
Run this before starting any deployment workflow โ it catches environment problems early before they fail mid-pipeline.
Auto-detect the project
XCODEPROJ=$(find . -maxdepth 1 -name "*.xcodeproj" | head -1)
XCWORKSPACE=$(find . -maxdepth 1 -name "*.xcworkspace" | head -1)
xcodebuild -project "$XCODEPROJ" -list -json 2>/dev/null | jq -r '.project.schemes[]'
grep 'MARKETING_VERSION' "${XCODEPROJ}/project.pbxproj" | sort -u
test -f fastlane/Fastfile && echo "Fastfile: OK" || echo "Fastfile: MISSING"
test -f fastlane/Appfile && echo "Appfile: OK" || echo "Appfile: MISSING"
Verify the environment
which fastlane || echo "MISSING"
for keypath in \
~/.appstoreconnect/AuthKey_*.p8 \
~/.private_keys/AuthKey_*.p8 \
fastlane/AuthKey_*.p8; do
ls $keypath 2>/dev/null && break
done
xcrun simctl list devices available | grep -E "(iPhone|Apple Watch)" | head -5
git status --porcelain
Auto-repair matrix
| Problem | Auto-repair | Method |
|---|
| fastlane not installed | โ
| Run gem install fastlane |
| API Key missing | โ | Point the user to the expected path |
| Script not executable | โ
| Run chmod +x |
| Simulator off | โ
| Run xcrun simctl boot |
| uncommitted changes | โ ๏ธ | Confirm with the user whether to commit |
Workflow selection
Full release pipeline
Phase 0: ํ๊ฒฝ ์ฌ์ ๊ฒ์ฆ โโโ ์๋ ์๋ณต
Step 1: ๋ฒ์ ๋ฒํ โโโ ์ฌ์ฉ์ ์ ํ
Step 2: ๋ฆด๋ฆฌ์ค ๋
ธํธ ์์ฑ โโโ ์ฌ์ฉ์ ํ์ธ
Step 3: ์คํฌ๋ฆฐ์ท & App Preview โโโ ์ฌ์ฉ์ ํ์ธ
Step 4: ๋ฉํ๋ฐ์ดํฐ ๋๊ธฐํ โโโ ์๋
Step 5: ์ปค๋ฐ & ํ๊ทธ & ํธ์ โโโ ์ฌ์ฉ์ ํ์ธ
Step 6: TestFlight / App Store ๋ฐฐํฌ โโโ ์ฌ์ฉ์ ์ ํ
1. Release notes generation
Execute
git tag --sort=-creatordate | head -3
git log --merges --oneline <์ด์ ํ๊ทธ>..HEAD
git log <์ด์ ํ๊ทธ>..HEAD --pretty=format:"%s" | grep -E "^(feat|fix|refactor)"
Writing rules
- User perspective (technical terms โ user-facing language)
- Exclude developer-tooling changes
Apply (detect by project structure)
docs/appstore-metadata.md exists โ replace the English/Korean ### What's New sections
fastlane/metadata/ exists โ update per-locale release_notes.txt directly
- Neither exists โ create
fastlane/metadata/en-US/release_notes.txt
Verify & repair
๊ฒ์ฆ: ํ์ผ ๊ต์ฒด ํ Readํ์ฌ ์ ๋ฒ์ ๋ฒํธ๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธ
์๋ณต: ๊ต์ฒด ์คํจ ์ โ Grep์ผ๋ก ํ์ฌ ๋ฆด๋ฆฌ์ค ๋
ธํธ ์์น๋ฅผ ์ฐพ์ ์ฌ์๋
2. Version bump
Execute
grep 'MARKETING_VERSION' "${XCODEPROJ}/project.pbxproj" | sort -u
Change MARKETING_VERSION with Edit replace_all.
Verify & repair
๊ฒ์ฆ: ๋ณ๊ฒฝ ํ grep์ผ๋ก ์ ๋ฒ์ ์ด ์ ์ฉ๋์๋์ง ํ์ธ
์๋ณต: replace_all ์คํจ ์ โ ํ์ฌ ๋ฒ์ ๋ฌธ์์ด์ ์ ํํ ํ์ธํ์ฌ ์ฌ์๋
3. Screenshots & App Preview
3-1. Screenshots
Attempt order (auto-fallback):
1์ฐจ: fastlane ios screenshots (๋๋ ํ๋ก์ ํธ์ screenshot lane)
โ ์ฑ๊ณต? โ ์๋ฃ
โ ์คํจ? โ ์๋ฌ ๋ก๊ทธ ๋ถ์
โ ์๋ฎฌ๋ ์ดํฐ ๋ถํ
์คํจ โ xcrun simctl boot <UDID> โ ์ฌ์๋
โ ๋น๋ ์คํจ โ xcodebuild ์๋ฌ ํ์ธ โ ์์ ํ ์ฌ์๋
โ ๊ทธ๋๋ ์คํจ?
2์ฐจ: Scripts/ ๋๋ ํ ๋ฆฌ์ ์บก์ฒ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉด ์คํ
โ ์คํฌ๋ฆฝํธ ์คํ ๊ถํ ์์ โ chmod +x โ ์ฌ์๋
โ ๊ทธ๋๋ ์คํจ?
3์ฐจ: ์ฌ์ฉ์์๊ฒ ํฐ๋ฏธ๋ ์คํ ์๋ด
"! fastlane ios screenshots" ์ ์
3-2. App Preview demo video
Limitation: simctl recordVideo cannot stay alive in the background inside the Claude Code sandbox.
1์ฐจ: Scripts/์ ๋
นํ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉด Bash ๋๊ตฌ๋ก ์๋
โ ์คํจ (์๋๋ฐ์ค ์ ํ)?
2์ฐจ: ์ฌ์ฉ์์๊ฒ ํฐ๋ฏธ๋ ์คํ ์๋ด
"! bash Scripts/record_app_preview.sh" ์ ์
baepsae UI automation notes (when using the baepsae MCP)
- tap_tab: Liquid Glass ํญ๋ฐ๋ tabCount ๋ช
์ ํ์
- ์๋ฎฌ๋ ์ดํฐ UDID: xcrun simctl list devices available๋ก ๋์ ํ์ง
4. Metadata sync
Execute (by project structure)
test -f Scripts/prepare_app_store_assets.py && python3 Scripts/prepare_app_store_assets.py
Verify & repair
๊ฒ์ฆ: fastlane/metadata/ ๋๋ ํ ๋ฆฌ์ ๋ฆด๋ฆฌ์ค ๋
ธํธ๊ฐ ๋ฐ์๋์๋์ง ํ์ธ
์๋ณต:
- ์คํฌ๋ฆฝํธ ์คํ ์คํจ โ Python ๋ฒ์ ํ์ธ โ ๊ฒฝ๋ก ์์
- fastlane/metadata ๋๋ ํ ๋ฆฌ ์์ โ mkdir -p ํ ์ฌ์คํ
5. TestFlight deployment
Execute
fastlane ios beta
This takes a while, so try run_in_background: true. On failure, point the user to ! fastlane ios beta.
Verify & repair
๊ฒ์ฆ: fastlane ์ถ๋ ฅ์์ "Successfully uploaded" ํ์ธ
์๋ณต:
- ์ฝ๋ ์๋ช
์คํจ โ Xcode Automatic Signing ํ์ธ ์๋ด
- ๋น๋ ์คํจ โ xcodebuild -configuration Release build ์๋ฌ ํ์ธ โ ์์
- ์
๋ก๋ ์คํจ โ API Key ํ์ธ + ๋คํธ์ํฌ ํ์ธ
- ๋ฒ์ ์ถฉ๋ โ CURRENT_PROJECT_VERSION +1 ํ ์ฌ์๋
6. App Store deployment
fastlane ios release
fastlane ios store_assets
fastlane ios release_full
Run only after explicit user confirmation โ this submits to the App Store and is externally visible.
Metadata SOT
docs/appstore-metadata.md (if present) โ fastlane/metadata/ one-way sync. Never edit fastlane/metadata/ directly โ it is a generated target and direct edits will be overwritten by the next sync.
Error auto-diagnosis matrix
| Error message / situation | Cause | Auto-repair |
|---|
Unable to find a device matching | Simulator name mismatch | xcrun simctl list devices โ auto-select an available device |
No signing certificate | Code signing not configured | Point to Xcode Automatic Signing |
App Store Connect API key not found | Wrong API Key path | Search the common paths in sequence |
The bundle version must be higher | Build number conflict | Auto-bump CURRENT_PROJECT_VERSION +1 |
Tab bar has no children | Liquid Glass tab bar | Auto-add tabCount |
No accessibility element matched | App screen changed | analyze_ui โ analyze the current UI โ re-detect coordinates/label |
Recording completed + empty file | Sandbox limitation | Point to running ! bash Scripts/... in the terminal |
error: Provisioning profile | Provisioning expired | Point to re-enabling Xcode Automatically manage signing |
ImportError / Python error | Python dependency | python3 -m pip install or verify the path |
Script Permission denied | Not executable | Run chmod +x |