store-only apps edit their listing on the store (storebound listing live / set: old -> new per field with the checks, a PATCH of only the edited fields; serve listing.set is the one store-only write, its token bound to the store ids; policy.rs STORE_ONLY_WRITES, write_with_confirm for store targets); screenshot captions per language and scene edited as a text edit of the shots copy JSON (JSON files keep their layout); Play content rating, target audience and App content answers in App info; docs/console-parity.md after the editors (73 rows: 55 complete, 18 with the reason) and tests/console-parity.test.ts keeping it honest

This commit is contained in:
CRTkafa 2026-10-14 00:53:38 +08:00
parent 3cea2af4e1
commit 7ac028421a
33 changed files with 852 additions and 157 deletions

View file

@ -170,8 +170,9 @@ host state file (`overrides_set`, every key checked in `workspace.rs`).
`store:ios:<account>:<app id>:<bundle>;android:<account>:<package>`.
- The host checks the target and the account kinds, and passes `virtual: { name, apple, play }`. The sidecar writes
a minimal `storebound.config.json` (store ids, placeholder links) into its temp folder.
- Only `apple.status`, `play.status`, `health`, `reviews.list`, `apple.testflight_status` and `apple.ppo_status` work
this way (tabs Releases, Health, Reviews, TestFlight, Growth), and `portfolio.status` takes store-only entries.
- Only `apple.status`, `play.status`, `health`, `reviews.list`, `apple.testflight_status`, `apple.ppo_status` and
`listing.live` work this way (tabs Releases, Listings, Health, Reviews, TestFlight, Growth), plus the one write
`listing.set` (listing text per language, see "Editors"), and `portfolio.status` takes store-only entries.
- "Link a folder", "Start an app folder here" or "Import from fastlane" turn it into a full app.
### Settings
@ -218,8 +219,14 @@ is [console-parity.md](console-parity.md).
first, then the native dialog, then the real run. Price changes of live products stay the owner's price decision.
- **Pull from the store** (`play.listing_pull`, `apple.listing_pull`): the live texts into the files, the diff in the
dialog first; unsaved edits stay pending on top.
- **Store-only apps** (no folder) stay read-only in the window: a store write sends what the files hold (see
console-parity.md).
- **Store-only apps** (no folder) get a Listings tab too: the live texts per language (`listing.live` = `storebound
listing live`), edited with the same counters and checks and applied straight to the store per language
(`listing.set` = `storebound listing set`: the store's dry run in the window, the native dialog, a PATCH of only the
edited fields). It is the one write a store-only app may run (`VIRTUAL_WRITES` in serve.ts, `STORE_ONLY_WRITES` in
policy.rs); its token is bound to the store ids instead of a folder. URLs, contact, catalog and art need an app
folder (they send what its config holds).
- **Captions:** the screenshot captions per language and scene (the shots copy file) are edited in Store art as a
text edit of the JSON (its own layout, one scene per line, stays).
- `tests/edit.test.ts` (round trips, checks, dry run, CLI), `apps/desktop/tests/edits.test.ts` (unsaved edits, undo),
and the boot check's editor case (edit a field, counter and limit check, review, save: the fixture file changes by
one line, the config keeps its comments, Apply shows the dry run per language).