Audit fixes: edit lifecycle, stdout hygiene, env/config precedence, A…
…PI contract bugs
Cross-cutting
- Edits created by a command are discarded on Close unless committed or
explicitly kept, so failed commands no longer leave stale edits; edits
obtained via --edit-id are never deleted implicitly (diff used to delete them)
- Status/progress/debug messages go to stderr; stdout carries only the payload
- GPC_OUTPUT, GPC_DEBUG, GPC_TIMEOUT and .gpc.yaml output/track/timeout are
honored (flag > env > project config); init's track key now feeds uploads
- Empty list results print [] instead of nothing
Commands
- tracks: --rollout (matching bundles upload) with --rollout-percentage kept
as a deprecated alias; partial rollout implies inProgress and contradictory
combinations are rejected; halt/complete error when nothing is staged;
dry-run no longer creates a real edit
- products: set required updateMask; create requires --file (purchaseOptions)
- offers: set required offerId on create and updateMask on update; --confirm
on activate/deactivate/update; paginate list
- external-transactions: set required externalTransactionId; accept bare IDs
- listings: only a 404 creates a new listing; sync merges into existing
listings and trims file contents
- images: sync requires --confirm, skips empty dirs, natural-sorts uploads;
promoGraphic removed (not an AppImageType)
- testing: only 404 falls back to an empty tester list; --confirm on remove;
empty/duplicate entries dropped; help states Google Groups only
- availability: --include-rest defaults to false; only the active release
is retargeted
- reviews/subscriptions/products/device-tiers/apps/voided purchases/error
issues: pagination
- vitals: date window uses America/Los_Angeles midnight; overview tolerates
missing metric sets; errors issues gets --days; tzdata embedded
- purchases: auto_renewing reflects autoRenewEnabled; product-id optional
for subscription-status; --include-subscriptions for voided list
- users: invite subcommand; grant explains 404
- diff: real added/removed/changed comparison against a throwaway baseline
- doctor: honors --config/--profile, counts warnings, --verbose adds details
- setup: input is no longer lowercased (paths, package names)
- auth: validates service-account JSON on login, sorted list, delete resets
default, --name not --profile in docs
- stats: GitHub releases paginated, deterministic platform order
- deobfuscation: nil guard, file-type sanity check
- devices: placeholder data labelled as static
Docs/install
- README and docs/commands.md match the real flags (--rollout, --emails,
--credentials-base64, --name, --id, --confirm)
- install.sh handles the .exe binary name on Windows