release-app
Build, sign, and submit app to App Store and Google Play — fully automated
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Build, sign, and submit app to App Store and Google Play — fully automated
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Analyze every interactive UI element — classify effects, detect broken promises, map cross-screen dependencies
Full QA procedure — interaction map, unit tests, Maestro flows, visual review
Add/remove features, fix bugs, redesign — keeping code clean and artifacts in sync
Generate a new mobile app — full pipeline or code-only if PRD already exists
Run full QA — interaction map, unit tests, Maestro UI tests, visual review
Read screenshots and verify UI against DESIGN.md, reference mockups, and quality checklist
| name | release-app |
| description | Build, sign, and submit app to App Store and Google Play — fully automated |
| disable-model-invocation | true |
Release an app to stores. Single command: build, sign, upload, submit for review.
One-time setup required (see FIRST-TIME SETUP below). After that, /release-app handles everything.
App: $ARGUMENTS
.env.deploy exists — test -f apps/<slug>/.env.deploy. Do NOT read contents.apps/<slug>/aso/, apps/<slug>/marketing/, apps/<slug>/research/ all exist. If not → tell user to run /market-app first and stop.which: fastlane, xcrun (iOS), java (Android)If .env.deploy missing → generate .env.deploy.example and stop.
Create apps/<slug>/fastlane/ with:
Appfile — from app.config.js + env:
for_platform :ios do
app_identifier(ENV["APP_IDENTIFIER"])
team_id(ENV["TEAM_ID"])
itc_team_id(ENV["ITC_TEAM_ID"])
end
for_platform :android do
json_key_file(ENV["SUPPLY_JSON_KEY"])
package_name(ENV["ANDROID_PACKAGE_NAME"])
end
Fastfile — generate the production Fastfile with:
iOS deploy lane:
cocoapods for ios/PodfiledeliverAndroid deploy lane:
supplyCombined deploy_all lane that runs both sequentially.
Key Fastfile details:
xcargs: "CODE_SIGN_STYLE='Manual'" — never mutate .xcodeprojsubmission_information hash with export_compliance_uses_encryption: falserelease_notes.txt (required for submit_for_review)precheck_include_in_app_purchases: false when using API keyschanges_not_sent_for_review: true to avoid common supply errorapp_store_build_number, Android: parse build.gradle)Read apps/<slug>/aso/ and generate:
iOS metadata (fastlane/metadata/en-US/):
| Source | Target |
|---|---|
aso/ios/title.txt | name.txt |
aso/ios/subtitle.txt | subtitle.txt |
aso/ios/keywords.txt | keywords.txt |
aso/ios/description.txt | description.txt |
| privacy policy URL | privacy_url.txt |
| version change notes | release_notes.txt |
Android metadata (fastlane/metadata/android/en-US/):
| Source | Target |
|---|---|
aso/android/title.txt | title.txt |
aso/android/short_description.txt | short_description.txt |
aso/android/full_description.txt | full_description.txt |
| version change notes | changelogs/default.txt |
Also generate: copyright.txt, primary_category.txt from PRD.
Generate .maestro/screenshots.yaml from PRD key screens (§6).
Run on correct simulator for required sizes:
maestro test --test-output-dir ./screenshots/raw .maestro/screenshots.yaml
Map output to fastlane directory: fastlane/screenshots/en-US/<Device>-<Name>.png
Skip if Maestro not installed — note in output that screenshots need manual capture.
npx expo prebuild --clean
Add ITSAppUsesNonExemptEncryption = NO to ios/<AppName>/Info.plist if not present (skips encryption compliance question).
Ask user confirmation via AskUserQuestion:
question: "Ready to build and submit to stores?"
header: "Release"
options:
- label: "Both platforms"
description: "Build and submit iOS + Android"
- label: "iOS only"
description: "Build and submit to App Store only"
- label: "Android only"
description: "Build and submit to Google Play only"
- label: "Build only (don't submit)"
description: "Build binaries but don't upload to stores"
Then run:
cd apps/<slug>
bundle exec fastlane deploy_all --env deploy
# or: bundle exec fastlane ios deploy --env deploy
# or: bundle exec fastlane android deploy --env deploy
## Release Complete
### iOS
- Build number: <N>
- Status: Submitted for review
- Phased release: enabled
- Estimated review: 1-3 days
### Android
- Version code: <N>
- Track: production
- Status: Under review
### Next steps
- Monitor review status in App Store Connect / Play Console
- iOS changes to title/subtitle take effect after review approval
- Google Play metadata changes take 4-8 weeks for full indexing
# ──── iOS ────
APP_IDENTIFIER=com.example.myapp
TEAM_ID=ABCDE12345
ITC_TEAM_ID=18742801
XCODE_SCHEME=MyApp
# App Store Connect API Key
APP_STORE_CONNECT_API_KEY_KEY_ID=
APP_STORE_CONNECT_API_KEY_ISSUER_ID=
APP_STORE_CONNECT_API_KEY_KEY= # base64-encoded .p8 content
APP_STORE_CONNECT_API_KEY_IS_KEY_CONTENT_BASE64=true
# Code Signing
CERTIFICATE_BASE64= # base64-encoded .p12
CERT_PASSWORD=
PROVISIONING_PROFILE_BASE64= # base64-encoded .mobileprovision
PROVISIONING_PROFILE_NAME= # profile name as shown in Xcode
KEYCHAIN_PASSWORD=temp_keychain_pass
# ──── Android ────
ANDROID_PACKAGE_NAME=com.example.myapp
SUPPLY_JSON_KEY=fastlane/play-store-key.json
# Signing
ANDROID_KEYSTORE_BASE64= # base64-encoded .keystore
ANDROID_KEYSTORE_PASSWORD=
ANDROID_KEY_ALIAS=
ANDROID_KEY_PASSWORD=
Show this to the user if they haven't set up before. These steps are manual and done once.
base64 -i AuthKey_XXXXX.p8base64 -i Distribution.p12base64 -i AppStore.mobileprovision.env.deploykeytool -genkeypair -v -storetype PKCS12 -keystore upload.keystore -alias my-key -keyalg RSA -keysize 2048 -validity 10000
base64 -i upload.keystore.env.deploy| Error | Cause | Fix |
|---|---|---|
.env.deploy missing | Not configured | Generate example, show FIRST-TIME SETUP |
| "No suitable application records" | Wrong bundle ID or team | Check APP_IDENTIFIER and ITC_TEAM_ID |
| "Redundant Binary Upload" | Duplicate build number | Auto-handled by build number auto-increment |
| "Missing attribute 'whatsNew'" | No release notes | Always generate release_notes.txt |
| "Changes cannot be sent for review" (Android) | App in review state | Auto-handled by changes_not_sent_for_review: true |
| "applicationNotFound" (Android) | No first manual upload | Tell user to upload first AAB via Play Console |
| Certificate expired | Annual expiration | Tell user to renew in Developer Portal |
produce doesn't support API keys)