/** The two platform indicator columns, in the shape `publish/complete` accepts them. */ export interface PlatformIndicators { primaryPlatform?: 'desktop' | 'mobile'; /** `null` is meaningful: the project declares no orientation, so the stored one is cleared. */ mobileOrientation?: 'portrait' | 'landscape' | null; } export interface PlatformIndicatorsResult { /** Spread straight into the `publish/complete` body. An absent key means "preserve". */ fields: PlatformIndicators; /** Creator-facing lines: what was read, or why something in the project files was ignored. */ notes: string[]; } /** * The platform indicators a publish syncs from the project's own work copy: which platform the * game is FOR (`primaryPlatform`, top level of game.json) and, for a phone game that only makes * sense one way up, `worldProfileData.mobileOrientation`. * * The parse itself lives in `project/platform-declaration.ts`, shared with `bitmagic verify`, * which boots the platform the same two fields declare. What stays HERE is the wire semantics, * which are publish's alone. * * The project files are the source of truth, exactly as they are in the web lane — the columns * are "indicators synced from game.json at publish, like `genre`" (migration 048). So a value * changed anywhere else is reverted by the creator's next publish, and the way to make a game * mobile is to edit `src/work/game.json`. * * Two asymmetries that are deliberate: * * - An ABSENT or unrecognised `primaryPlatform` omits the key rather than defaulting to * 'desktop'. Both columns are sticky at the `upsertGame` layer (an absent key preserves the * stored value), so "the project says nothing" and "the project says desktop" must not * collapse into the same wire message. * - A readable work copy that declares no orientation sends an explicit `null`, which CLEARS * the column. That is what makes deleting the field from world.json take effect; omitting * the key instead would make an orientation impossible to remove from here. Only a work copy * neither of whose files can be read omits the key. * * Best effort throughout, like `readFaviconOverride`: a missing, unreadable or malformed file * means "the project declares nothing", never an error. A catalog indicator must not be able to * fail a publish whose bundle is already uploaded. */ export declare function readPlatformIndicators(root: string): PlatformIndicatorsResult;