원클릭으로
rn-harness-submit
Phase 10 — Submit to App Store Connect (iOS) and Google Play (Android). iOS fully automated, Android pauses for manual steps.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Phase 10 — Submit to App Store Connect (iOS) and Google Play (Android). iOS fully automated, Android pauses for manual steps.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Phase 7 — Smart AdMob ad placement analysis and integration. Guides user through manual ad unit creation.
Phase 5 — Build the React Native + Expo app in 3 sub-phases (scaffold, API, UI). Self-evaluates before handoff.
Phase 7.5 — Human acceptance gate before store build. Runs an automated Maestro E2E smoke test on a real simulator/emulator, then PAUSES for the user to run the app themselves and explicitly approve before any EAS/local build or store submission.
React Native app launch harness — from market research to App Store & Google Play submission. One command takes you from idea to store review.
Phase 8 (EAS-free alternative) — Build & deploy without EAS. For users whose EAS free-plan project slots are full. Local Gradle (Android AAB) + Xcode/fastlane (iOS IPA), self-hosted OTA, then submit via Google Play API + fastlane/Transporter.
Phase 8 — EAS Build for iOS and Android, plus EAS Update (OTA) configuration.
| name | rn-harness-submit |
| description | Phase 10 — Submit to App Store Connect (iOS) and Google Play (Android). iOS fully automated, Android pauses for manual steps. |
| allowed-tools | ["Read","Write","Edit","Bash","Glob","Grep","AskUserQuestion"] |
Submit the app to App Store and Google Play. Uses App Store Connect API (iOS) and Google Play Developer API v3 (Android).
Called by the orchestrator as Phase 10.
docs/harness/config.md (API keys, developer info)docs/harness/handoff/build-result.md (build URLs)docs/harness/store-assets/ (screenshots + metadata).env (credentials)Read from .env:
ASC_KEY_ID — API Key ID (10 chars)ASC_ISSUER_ID — Issuer ID (UUID)ASC_PRIVATE_KEY_PATH — .p8 file path (default: ./credentials/asc-api-key.p8)If missing or .p8 file not found → AskUserQuestion:
App Store Connect API Key is required.
1. App Store Connect → Users and Access → Integrations → API Keys
2. Generate new key (Admin role)
3. Save .p8 file to credentials/asc-api-key.p8
4. Add to .env:
ASC_KEY_ID=XXXXXXXXXX
ASC_ISSUER_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ASC_PRIVATE_KEY_PATH=./credentials/asc-api-key.p8
Press Enter when done. (Type "eas" if already configured in EAS)
If config.md → build.method is eas:
eas submit --platform ios --profile production --non-interactive
Or with a specific build URL:
eas submit --platform ios --url [BUILD_URL] --non-interactive
If build.method is local (EAS-free — see rn-harness-build-local): upload the local .ipa without EAS, using the same ASC API key:
# fastlane (recommended)
fastlane pilot upload # → TestFlight
# or
xcrun altool --upload-app -f app.ipa --type ios \
--apiKey $ASC_KEY_ID --apiIssuer $ASC_ISSUER_ID
Android is unaffected — Part B already uploads the AAB via the Google Play API, EAS or not.
EAS Submit handles the binary upload. Additional metadata via ASC API:
Check/Create App Record
POST /v1/bundleIdsPOST /v1/appsCreate App Store Version
POST /v1/appStoreVersions (version: "1.0.0", platform: IOS)App Info
ko (Korean)config.md → developer.privacy_urlLocalization (ko locale)
keywords.txt length before uploadconfig.md → developer.homepage_urlconfig.md → developer.email (or privacy URL)Copyright
config.md → developer.copyrightScreenshot Upload
Build Assignment
processingState: VALID)Review Information
config.md → ios_review (first_name, last_name, phone)Submit for Review
POST /v1/reviewSubmissionsiOS submission complete!
- App: [name]
- Version: 1.0.0
- Status: Waiting for Review
- App Store Connect: https://appstoreconnect.apple.com
AskUserQuestion — PAUSE and guide user through mandatory manual steps:
Google Play requires some manual setup that the API cannot do.
Please complete these in Play Console (https://play.google.com/console):
1. CREATE APP:
- App name: [name from PRD]
- Default language: Korean
- App (not game) / Free
- Accept declarations
2. AAB UPLOAD (first time only):
- Production → Create new release
- Upload the .aab file from EAS Build
- (Download link: [build URL from build-result.md])
3. CONTENT RATING (IARC):
- App content → Content rating → Start questionnaire
- Complete the survey
4. DATA SAFETY:
- App content → Data safety
- Fill out the privacy form
- Note: If using AdMob, declare "Advertising" data collection
5. TARGET AUDIENCE & ADS:
- Set target age group
- Select "Yes, contains ads" (if AdMob enabled)
6. APP CATEGORY:
- Store settings → App category
- Select appropriate category
7. COUNTRIES/REGIONS:
- Production → Countries/regions
- Select distribution countries
Press Enter when all steps are complete.
Read from .env:
GOOGLE_PLAY_SA_JSON — path to service account JSONIf missing → AskUserQuestion:
Google Play Service Account JSON is required.
1. Play Console → Settings → API access
2. Create or link a service account
3. Grant "Release Manager" role
4. Download JSON key
5. Save to credentials/google-play-sa.json
6. Add to .env:
GOOGLE_PLAY_SA_JSON=./credentials/google-play-sa.json
Enter the path, or press Enter if already set.
Create scripts/publish.js in the project based on the proven pattern:
#!/usr/bin/env node
const { google } = require('googleapis');
const fs = require('fs');
const path = require('path');
const PACKAGE_NAME = '[from config.md bundle_id]';
const KEY_FILE = path.resolve(__dirname, '..', process.env.GOOGLE_PLAY_SA_JSON || './credentials/google-play-sa.json');
const METADATA_DIR = path.resolve(__dirname, '..', 'docs/harness/store-assets/metadata');
const SCREENSHOTS_DIR = path.resolve(__dirname, '..', 'docs/harness/store-assets');
const APP_CONFIG = {
contactEmail: '[from config.md developer.email]',
contactWebsite: '[from config.md developer.homepage_url]',
contactPhone: '',
defaultLanguage: 'ko-KR',
};
// ... (full publish.js implementation)
Install dependency:
npm install googleapis
Create metadata directory structure from store-assets:
docs/harness/store-assets/
├── metadata/
│ └── ko-KR/
│ ├── title.txt # App name (from PRD)
│ ├── short_description.txt # 80 chars max
│ ├── full_description.txt # 4000 chars max
│ └── release_notes.txt # What's new
├── icon.png # 512x512
├── feature_graphic.png # 1024x500
└── android/
└── phone/
├── phone_01.png
├── phone_02.png
└── phone_03.png
Execute in stages:
# Step 1: Metadata + images only (no submission)
node scripts/publish.js --images
# Step 2: Verify in Play Console that everything looks correct
AskUserQuestion:
Metadata and images have been uploaded to Play Console.
Please verify in the Play Console that everything looks correct.
Press Enter to proceed with review submission, or type "skip" to submit manually.
# Step 3: Submit for review
node scripts/publish.js --submit-only --track production
If the app is still in draft (first submission, manual steps incomplete):
⚠ App is still in draft status.
Complete these in Play Console before review submission:
□ Content rating (IARC questionnaire)
□ App category
□ Countries/regions
□ Data safety section
AskUserQuestion:
The app is in draft status — some Play Console steps are still incomplete.
Complete the items listed above, then press Enter to retry submission.
(Or type "done" to finish — you can submit manually from Play Console.)
Android submission complete!
- App: [name]
- Track: production
- Version: [versionCode]
- Status: [completed/draft]
- Play Console: https://play.google.com/console
docs/harness/handoff/submit-result.md:
# Store Submission Report
## iOS — App Store
- Status: [Submitted/Skipped/Failed]
- Version: 1.0.0
- Build: [buildNumber]
- Submitted: [date]
## Android — Google Play
- Status: [Submitted/Draft/Skipped/Failed]
- Track: [production/internal]
- Version Code: [versionCode]
- Submitted: [date]
- Script: scripts/publish.js
## AdMob
- iOS Ad Units: [real/test]
- Android Ad Units: [real/test]
- Note: [Replace test IDs before release if using test IDs]
## EAS Update
- Channel: production
- OTA ready: [yes/no]
## Pending Manual Actions
- [ ] [remaining items]
## Re-submission Commands
# Update metadata + images
node scripts/publish.js --images
# Submit for review
node scripts/publish.js --submit-only
# Full automation
node scripts/publish.js --images --submit
# Internal test track
node scripts/publish.js --images --submit --track internal
git tag -a v1.0.0 -m "Release 1.0.0 — Store submission"
AskUserQuestion before pushing tag:
Ready to create git tag v1.0.0. Push to remote? (yes/no)
status: completed
current_phase: done