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)