Play console steps without an API as agent plans: play-store-settings (App category; play listing cannot set it), play-app-content (every card in order, one owner batch) and its cards (privacy policy, ads, sign in details, advertising ID, government, financial, health), play-production-countries and play-production-release; IARC plan with the Terms of Use agreement, follow-ups (console.contentRating.details, products[].randomRewards, social) and the Summary's final Save; config play.category / countries / managedPublishing, console.appContent; check, validate, play status and play release reminders; inPageLoop helper and material checkbox clicks; App Privacy published signal; first IAPs via apple iap-submit --with-version. Pitfalls 27, 28
This commit is contained in:
parent
dbd9f2973c
commit
b7bfe89151
37 changed files with 1624 additions and 121 deletions
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: console-autofill
|
||||
description: Fill App Store Connect and Google Play Console forms that have no API (New App, App Privacy, Play Create app, the IARC content rating, Target audience and content plus Ads; the App Store age rating is guidance because the API sets it). Agent-first by default - `storebound console plan <form> --json` (MCP console_plan) gives the start URL, steps, answer sheet with the console's exact labels, never-press list and verified UI facts; you drive the page with your own browser tool (Claude in Chrome, a built-in browser, Playwright), stop before the final button and tell the owner what to press, then `storebound console verify <form>` (MCP console_verify). `storebound console fill` is the optional scripted fast path. Answers come only from storebound.config.ts. Never sign in, submit, publish, accept agreements or grant permissions. Use when the user wants help filling one of these console forms, asks what to answer in them, or wants the answers as a checklist.
|
||||
description: Fill App Store Connect and Google Play Console forms that have no API (New App, App Privacy, Play Create app, IARC content rating, every Play App content card, Play Store settings category, first production release countries and send-for-review). Agent-first by default - `storebound console plan <form> --json` (MCP console_plan) gives the start URL, steps, answer sheet with the console's exact labels, never-press list and verified UI facts; you drive the page with your own browser tool, stop before the final button and tell the owner what to press, then `storebound console verify <form>` (MCP console_verify). `storebound console fill` is the optional scripted fast path. Answers come only from storebound.config.ts. Never sign in, submit, publish, accept agreements or grant permissions. Use when the user wants help filling one of these console forms, asks what to answer in them, or wants the answers as a checklist.
|
||||
---
|
||||
|
||||
# Console forms without an API
|
||||
|
|
@ -30,7 +30,16 @@ the UI shows. This is the primary mode.
|
|||
`label` (curly quotes as shown, `curlyQuotes: true`), `action` (tick / untick / pick / type / choose) and `where`;
|
||||
- `buttons.neverPress` (Publish, Submit, Create, Create app, Send, Release, "Definitions and Examples", "?", the
|
||||
final Save of a form ...), `buttons.final` and `buttons.allowed` (navigation and draft saves);
|
||||
- `uiFacts` (verified facts per form, see below), `driving` and `verify` (the command and what to capture).
|
||||
- `uiFacts` (verified facts per form, see below), `driving`, `inPageLoop` (a ready-made in-page helper, see 5) and
|
||||
`verify` (the command and what to capture).
|
||||
|
||||
Forms: `apple-app-record`, `apple-age-rating`, `apple-app-privacy`, `play-app-record`, `play-content-rating`,
|
||||
`play-target-audience` (these also have the scripted `console fill`), and agent-only Play pages:
|
||||
`play-store-settings` (the App category: the Play API has no category field, so `play listing` leaves it "Not
|
||||
selected"), `play-app-content` (every App content card in order, its page, its plan and ONE batch of owner
|
||||
questions), its cards `play-privacy-policy`, `play-ads`, `play-sign-in-details`, `play-advertising-id`,
|
||||
`play-government-apps`, `play-financial-features`, `play-health-apps`, and the first production release:
|
||||
`play-production-countries` and `play-production-release`. `storebound console plan` lists them.
|
||||
2. Collect the `ask-owner` answers of every form you will fill in ONE question to the owner before you start (AGENTS.md
|
||||
rule 5) and write them into the config, so the plan has them. Never guess them; leave them empty if the owner
|
||||
wants to answer in the page.
|
||||
|
|
@ -38,16 +47,21 @@ the UI shows. This is the primary mode.
|
|||
4. Follow `steps`. Read the page (text or accessibility tree) before each action, click by visible text, set each
|
||||
answer as the sheet says, wait for the next step to render. If the page differs from the plan, adapt (the console
|
||||
changes), but never press anything in `buttons.neverPress` and never tick an agreement.
|
||||
5. Long flows (App Privacy with many data types): one evaluate call times out around 45 s, so start an in-page async
|
||||
loop and poll it:
|
||||
5. Long flows (App Privacy with many data types, the IARC questionnaire, App content): one Runtime.evaluate call
|
||||
times out at about 45 s on big console pages, so never loop over many controls in one call. Paste the plan's
|
||||
`inPageLoop` once per page (one short call; it defines `window.__sb`), start the job and poll in short calls:
|
||||
```js
|
||||
window.__log = []; window.__run = (async () => { /* for each step: wait for it, act, */ window.__log.push('Device ID: purposes set'); /* ... */ window.__log.push('done'); })().catch(e => window.__log.push('stopped: ' + e.message));
|
||||
window.__sb.run([{ role: 'radio', label: 'No', within: '<question text>' }, { role: 'checkbox', label: '<box label>', want: true }])
|
||||
// then, every 2-5 s: window.__log.slice(-20), window.__done
|
||||
```
|
||||
then read `window.__log` every few seconds until it says `done` or `stopped`. Never click past a step you have not
|
||||
read; on an unknown step, stop the loop and look.
|
||||
The helper finds each control by its label (aria-label, else the nearest parent with non-empty innerText), clicks
|
||||
the inner `[role=radio]` / `[role=checkbox]` of a material control and reads it back; it never clicks buttons and
|
||||
refuses agreements. Press Next / Save yourself afterwards. Never click past a step you have not read.
|
||||
6. Stop before `buttons.final` and tell the owner exactly what to press (App Privacy: review the summary, press
|
||||
Publish; Play Create app: tick the two declarations, press Create app; content rating: Submit; target audience:
|
||||
Save; New App: Create).
|
||||
Publish, then Publish in the "Publish Your App Privacy Responses?" dialog; Play Create app: tick the two
|
||||
declarations, press Create app; content rating: the Summary's Save (not Submit); target audience and the other
|
||||
App content cards: Save; Play production: "Submit N changes for review", then "Send changes for review"; New App:
|
||||
Create).
|
||||
7. `storebound console verify <form> --from-text -` (MCP: `console_verify` with `text`) with what `verify.capture`
|
||||
says: App Privacy the page's `innerText`, Play Create app the JSON of the capture snippet. Exit 1 / mismatches:
|
||||
fix them in the page (or the config), verify again. `apple-app-record` and `apple-age-rating` verify from the API
|
||||
|
|
@ -72,6 +86,32 @@ the UI shows. This is the primary mode.
|
|||
click the inner `[role=radio]` with a JS click, then check `aria-checked="true"` and that no "Select …" hint is
|
||||
left. Text inputs set by `form_input` are fine. After Create app the app lives at
|
||||
`/console/u/0/developers/<developerId>/app/<appId>/app-dashboard`: put the id in `play.appId`.
|
||||
- **Play material radios and checkboxes** (Create app, App content, IARC, 2026-10-12): `<material-radio>` /
|
||||
`<material-checkbox>`; click the inner `[role=radio]` / `[role=checkbox]` (or the `<input>`) with a JS click and read
|
||||
`aria-checked` back. Their labels sit in sibling nodes: read the nearest parent with non-empty `innerText`.
|
||||
- **Play Store settings** (2026-10-12): `/app/<appId>/store-settings` > the FIRST Edit (App category) > App or game >
|
||||
the Category dropdown's `[role=option]` with exactly the category name (`play.category`) > Save.
|
||||
- **Play App content** (2026-10-12): `/app-content/overview`; each card has a button aria-label="Start <Name>
|
||||
declaration". Pages: privacy-policy, ads-declaration, testing-credentials (Sign in details), ad-id-declaration,
|
||||
government-apps, finance (2 steps; the last has "My app doesn't provide any financial features"; Next, Save),
|
||||
health (2 steps; the last step's "Other" box was the no-features answer on that run; Next, Save),
|
||||
target-audience-content (age checkboxes; with 13+ only it went straight to the Summary, no appeal question; Save),
|
||||
content-rating-overview > "Start questionnaire" > content-rating-iarc-questionnaire.
|
||||
- **IARC questionnaire** (2026-10-12): page 1 has the email, the category radio and an IARC Terms of Use checkbox (an
|
||||
agreement: the owner ticks it, never you). Then ONE long page of sections; each Yes reveals follow-ups (Violence:
|
||||
humans / non-humans, setting, childlike style, reactions, presentation, blood level, historical war, innocent
|
||||
characters, fierce sounds; Digital Purchases: digital goods, then loot boxes, then player trading; Miscellaneous:
|
||||
user interaction then block / report / moderation / friends-only, location sharing, Nazi symbols, Korea history,
|
||||
terrorism, crimes). The answers come from `console.contentRating.answers` and `.details`, `products[].randomRewards`
|
||||
and `social`. Save, then Next to the Summary with per-authority ratings; its final button is **Save**, not Submit
|
||||
(the owner's). Example: PEGI 7, ESRB E10+, USK 12, ClassInd 18 (paid random items), Google Play 7+.
|
||||
- **App Privacy Publish** (2026-10-12): a `<dialog>` "Publish Your App Privacy Responses?" with Cancel / Publish (the
|
||||
owner's); afterwards the page shows "Published a few seconds ago by …", which `console verify` reads.
|
||||
- **Play first production release** (2026-10-12): countries are console-only (`edits.countryAvailability` is
|
||||
read-only): tracks/production > Countries / regions > Edit countries / regions > "Select all rows" > Save. Then
|
||||
Releases > Edit release > Next > Save; Publishing overview > "Submit N changes for review" > "Send changes for
|
||||
review" (the owner's; a JS `.click()` did nothing, it needs a real click). Managed publishing is off by default:
|
||||
approved means live.
|
||||
- **After Play Create app, an owner step:** a service account's app-level permissions do NOT cover apps created
|
||||
later. Granting them is the owner's (a permission grant; auto mode blocks it too): give the exact path together
|
||||
with the Create app button, Users and permissions > the service account > Add app > the new app > Admin (or the
|
||||
|
|
@ -247,7 +287,7 @@ content", "Create and set up your app"):
|
|||
| New App (App Store) | + and New App (Cancel only to leave a team without the bundle id) | **Create**: creates the app record for good |
|
||||
| Age rating (guide only) | nothing (`storebound apple appinfo` sets it by API) | Set Up / Next / Done, if the owner wants to look |
|
||||
| Create app (Play) | Create app on the app list (opens the form); Check availability next to the package name (read-only) | the two **declarations** (agreements, never ticked) and **Create app** in the form: creates the app |
|
||||
| Content rating (Play) | Start; **Save draft** then Next on each page (a draft: IARC gets nothing before Submit; the owner agreed) | **Submit** on the Summary: sends the questionnaire to IARC |
|
||||
| Content rating (Play) | Start; **Save draft** then Next on each page (a draft: IARC gets nothing before the Summary's Save; the owner agreed) | the **IARC Terms of Use** box (an agreement) and **Save** on the Summary (not "Submit", verified 2026-10-12): sends the questionnaire to IARC |
|
||||
| Target audience (Play) | Start / Manage, Next between the pages | **Save** on the last page: stores the declaration, which Google then reviews |
|
||||
|
||||
Mid-way storebound stops only for an uncertain answer (see 6). A navigation button is never the owner's: when the
|
||||
|
|
@ -257,8 +297,9 @@ console page changed so that storebound cannot find it, it says so and you click
|
|||
|
||||
Every `[check]` answer, linked-to-identity and tracking for each App Privacy data type (unless `appPrivacy.types`
|
||||
answers them), Developer's Advertising or Marketing, the IARC answers, the target
|
||||
ages, Play's Free or paid and its declarations, and pressing the final button (App Privacy Publish, IARC Submit,
|
||||
Target audience Save, New App Create, Play Create app).
|
||||
ages, Play's Free or paid and its declarations, the IARC Terms of Use box, the Sign in details username and password,
|
||||
and pressing the final button (App Privacy Publish, the IARC Summary's Save, each App content card's Save, New App
|
||||
Create, Play Create app, Play's Send changes for review).
|
||||
|
||||
## Out of scope
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue