Onboarding live apps without owner questions for what the stores and the code prove: storebound onboard imports the live products and subscriptions with USD / base prices (catalog diff clean), contact values, the App Review contact and demo account (credentials.json, masked), sign-in for review from Apple's review detail and auth code, and the account deletion page from the app's site; App Store keywords count characters (live fields up to 265 bytes accepted); validate accepts the 6.5-inch iPhone set and Play's default-language graphics fallback; Play Reporting API off gives the project's enable link and apps list falls back to local apps; accounts default <profile>; store-only apps (apps add --store --app-id) shown read-only in the desktop (pitfalls 43-52)

This commit is contained in:
CRTkafa 2026-10-13 07:25:01 +08:00
parent d2ce185441
commit e5f148e534
55 changed files with 1648 additions and 158 deletions

View file

@ -38,6 +38,40 @@ machine in `~/.storebound`, shared by the CLI and the app.
`storebound://open` link, so a folder added in the terminal is selected without a question.
- **Desktop:** a folder whose `package.json` pins another storebound version shows "This project uses storebound X,
the app runs Y". `storebound-desktop --version`. `ws desktop import / export` carry the accounts' profile names.
Onboarding apps that are already live, without owner questions for what the stores and the code prove (lessons
43-52, from setting storebound up on 6 live apps):
- **`storebound onboard [--write]`** (MCP `onboard`, dry run by default). Read-only on both stores, never changes a
store price. Imports the live one-time products and subscriptions of both stores into `products` / `subscriptions`:
ids, type, listings per language, usd = the US price (else Play's own USD price for new regions), Apple's price
schedule base territory as an override when it is not the USA, an item on one store only kept with `platforms`;
`catalog diff` comes out clean. An item with no USD price anywhere is named with its base price, not left out
silently. Fills app.contactEmail / website / supportUrl / privacyPolicyUrl / marketingUrl from Play's app details and
App Store Connect where the config holds a template value (real values that differ are reported and kept); the App
Review contact goes into `.storebound/credentials.json` `reviewContact` (masked in output, the phone never printed).
Sign-in for review is decided from Apple's review detail (`demoAccountRequired`; a demo account set there is imported
into `reviewDemoAccount`, never printed) and the code's auth signals, never a default yes. With accounts and no
`accounts.deletionUrl` it looks for the deletion page on the app's own site (/delete-account, /account/delete,
/delete, /account-deletion, links in the privacy policy that mention deletion); not found stays a finding. Then the
owner questions that are left, in one batch.
- **App Store keywords count characters, not bytes.** Live READY_FOR_SALE fields hold Thai 95 characters / 265
bytes, Turkish 100 / 105, Polish 99 / 105: `check`, `check --aso`, `listing check`, `listing translate` and
`aso suggest` count characters again (lesson 4 was wrong; lesson 43).
- **`validate`:** a live app with only the 6.5" iPhone set (APP_IPHONE_65) passes, App Store Connect accepts it for
the 6.9" requirement; a 6.9" set is a recommendation (also the two 13" iPad types). Play: a non-default language
without its own icon / feature graphic uses the default language's (a note), only the default language's missing
graphics block.
- **Play Reporting API off:** the finding names the Cloud project and the exact link to enable
`playdeveloperreporting.googleapis.com` for it (`apps check`, `apps list`, `health`, `validate`); `apps list` no
longer fails but lists the Play apps of this machine's app folders and store-only entries.
- **`storebound accounts default <profile>`** (`--clear`): the machine's default credential profile, a pointer file in
the credentials folder, shown in `accounts list`. Order: env > the profile a project names > the project's own keys
> this default > the only profile (or the one named `default`).
- **Store-only apps:** `storebound apps add --store apple|play --app-id <id> --account <profile>` adds an app that is
live but has no project on this machine to `~/.storebound/projects.json` (`storeApps`); `apps folders` shows it as
"no local project", `apps remove apple:<id>` takes it out. The desktop shows it read-only ("Store only": status,
reviews, analytics) under the account with that profile, and keeps the entries when it writes the folder list.
- `ws` children get the app's own account choice when the workspace names no account (before: no profile at all).
Fixes from a real first release of a second game (Capacitor 8 monorepo, lessons 35 to 37):