$npx -y skills add hanamizuki/solopreneur --skill asc-app-create-uiCreate a new App Store Connect app record via browser automation. Use when there is no public API for app creation and you need an agent to drive the New App form.
| 1 | # asc app create (UI automation) |
| 2 | |
| 3 | Use this skill to create a new App Store Connect app by driving the web UI. |
| 4 | This is opt-in, local-only automation that requires the user to be signed in. |
| 5 | |
| 6 | ## Preconditions |
| 7 | - A browser automation tool is available (Playwright, Cursor browser MCP, or equivalent). |
| 8 | - User is signed in to App Store Connect (or can complete login + 2FA). |
| 9 | - The **bundle ID must already be registered** in the Apple Developer portal. |
| 10 | - Required inputs are known: |
| 11 | - app name (max 30 characters) |
| 12 | - bundle ID (must exist and be unused by another app) |
| 13 | - SKU |
| 14 | - platform (iOS, macOS, tvOS, visionOS) |
| 15 | - primary language |
| 16 | - user access (Full Access or Limited Access) |
| 17 | |
| 18 | ## Safety Guardrails |
| 19 | - Never export or store cookies. |
| 20 | - Use a visible browser session only. |
| 21 | - Pause for a final confirmation before clicking "Create" (for standalone scripts). |
| 22 | - Do not retry the Create action automatically on failure. |
| 23 | |
| 24 | ## Workflow |
| 25 | |
| 26 | ### 1. Preflight: register bundle ID and verify no existing app |
| 27 | ```bash |
| 28 | # Register the bundle ID via public API (if not already registered) |
| 29 | asc bundle-ids create --identifier "com.example.app" --name "My App" --platform IOS |
| 30 | |
| 31 | # Confirm no app record exists yet |
| 32 | asc apps list --bundle-id "com.example.app" --output json |
| 33 | ``` |
| 34 | |
| 35 | ### 2. Open App Store Connect |
| 36 | Navigate to `https://appstoreconnect.apple.com/apps` and ensure the user is signed in. |
| 37 | |
| 38 | ### 3. Open the New App form |
| 39 | The "New App" button (blue "+" icon) opens a **dropdown menu**, not a dialog directly. |
| 40 | - Click the "New App" button to open the dropdown. |
| 41 | - Click the "New App" **menu item** inside the dropdown. |
| 42 | - The creation dialog/modal appears. |
| 43 | |
| 44 | ### 4. Fill required fields (in order) |
| 45 | |
| 46 | #### Platform (checkboxes) |
| 47 | The platforms are **checkboxes** (not radio buttons). Click the checkbox for the desired platform(s): |
| 48 | - iOS, macOS, tvOS, visionOS |
| 49 | - Multiple can be selected. |
| 50 | |
| 51 | #### Name (text input) |
| 52 | - Label: `Name` |
| 53 | - Max 30 characters. |
| 54 | |
| 55 | #### Primary Language (select/combobox) |
| 56 | - Label: `Primary Language` |
| 57 | - Use `select_option` or equivalent with the language label (e.g., `"English (U.S.)"`). |
| 58 | |
| 59 | #### Bundle ID (select/combobox) |
| 60 | - Label: `Bundle ID` |
| 61 | - This is a `<select>` dropdown. The options load asynchronously after platform selection. |
| 62 | - Wait for the dropdown to finish loading (it shows "Loading..." initially). |
| 63 | - Select by matching the label text which includes both the name and identifier: |
| 64 | `"My App - com.example.app"` |
| 65 | |
| 66 | #### SKU (text input) |
| 67 | - Label: `SKU` |
| 68 | |
| 69 | #### User Access (radio buttons) -- REQUIRED |
| 70 | - **This field is required.** The Create button stays disabled until one option is selected. |
| 71 | - Options: `Limited Access` or `Full Access`. |
| 72 | - These are custom radio buttons with `<span>` overlays. |
| 73 | - **Known issue:** Accessibility-based clicks may be intercepted by the overlay `<span>`. |
| 74 | - **Workaround:** Use `scrollIntoView` on the radio element first, then click the radio ref directly. This bypasses the overlay interception. |
| 75 | |
| 76 | ### 5. Click Create |
| 77 | - The "Create" button is disabled until all required fields are filled **and** User Access is selected. |
| 78 | - After clicking, the button text changes to "Creating" while processing. |
| 79 | - Wait for navigation to the new app's page (URL pattern: `/apps/<APP_ID>/...`). |
| 80 | |
| 81 | ### 6. Verify creation via API |
| 82 | ```bash |
| 83 | asc apps view --id "APP_ID" --output json --pretty |
| 84 | # or |
| 85 | asc apps list --bundle-id "com.example.app" --output json |
| 86 | ``` |
| 87 | |
| 88 | ### 7. Hand off to post-create setup |
| 89 | ```bash |
| 90 | asc app-setup info set --app "APP_ID" --primary-locale "en-US" |
| 91 | asc app-setup categories set --app "APP_ID" --primary GAMES |
| 92 | asc pricing availability create \ |
| 93 | --app "APP_ID" \ |
| 94 | --territory "USA,GBR" \ |
| 95 | --available true \ |
| 96 | --available-in-new-territories true |
| 97 | ``` |
| 98 | |
| 99 | Use `asc pricing availability create` only for the first availability bootstrap. If app availability already exists, switch to `asc pricing availability edit --app "APP_ID" ...` for later territory changes. |
| 100 | |
| 101 | ## Known UI Automation Issues |
| 102 | |
| 103 | ### "New App" is a dropdown menu, not a direct action |
| 104 | The first click opens a menu with "New App" and "New App Bundle". You must click the menu item, not just the button. |
| 105 | |
| 106 | ### User Access radio buttons have span overlays |
| 107 | Apple's custom radio buttons wrap the `<input type="radio">` in styled `<span>` elements. Direct ref-based clicks may fail with "click target intercepted". The fix is: |
| 108 | 1. Scroll the radio element into view (`scrollIntoView`). |
| 109 | 2. Click the radio ref directly (not via offset or label click). |
| 110 | |
| 111 | ### Bundle ID dropdown loads asynchronously |
| 112 | After selecting a platform, the Bundle ID dropdown shows "Loading..." and is disabled. Wait for it to become enabled and populated before selecting. |
| 113 | |
| 114 | ### browser_fill may not trigger form validation |
| 115 | Apple's Ember.js forms use custom change handlers. `browser_fill` (atomic set) may not trigger validation. If the Crea |