KiteSsotExtension

abstract class KiteSsotExtension

DSL for the kitessot plugin. Applied to the root project only.

Every identity field is optional. Identity reaches a platform only when its propagation toggle is enabled and the value is present. Source-tree migrations, compiler-policy changes, locale packaging filters, and branding are disabled by default and require an explicit opt-in.

App logo: opt in with propagateLogo, then set appLogoPngForeground and exactly one of appLogoPngBackground / appLogoBackgroundColor. Incomplete layer configuration fails only when propagation is enabled. Apple logo installation also requires syncIos. PNG inputs are capped at 32 MiB, 4,096 pixels per dimension, and 16,777,216 decoded pixels.

Constructors

Link copied to clipboard
constructor()

Properties

Link copied to clipboard

Android-only SDK options. See KiteSsotAndroidExtension. Accessed as kiteSsot { android { compileSdk = 36; minSdk = 26 } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios.

Link copied to clipboard
abstract val androidAppDirectory: DirectoryProperty

Typed directory that owns the Android application's src/main tree. By default the plugin resolves it from the uniquely selected/detected Android application project, including custom projectDir mappings.

Link copied to clipboard

Resolved Android identifier: bundleIdBase plus androidApplicationIdSuffix.

Link copied to clipboard
abstract val androidApplicationIdSuffix: Property<String>

Suffix appended to bundleIdBase for the Android applicationId. Unset means no suffix.

Link copied to clipboard
abstract val androidApplicationProjects: ListProperty<String>

Exact Android application project paths that may receive app-scoped identity, version, name, and locale-filter values. When empty, a sole detected application is selected automatically; multiple detected applications are accepted only while no app-scoped value needs a target. Android SDK and JVM policy remain global to compatible Android modules and are not restricted by this selector. The single Android logo output sink accepts at most one effective application; with no Android plugin it uses an explicit androidAppDirectory or the legacy directory fallback.

Link copied to clipboard
abstract val androidAppModule: Property<String>

Legacy Android application directory string. Prefer androidAppDirectory; retained as a compatibility fallback for builds without an application plugin.

Link copied to clipboard
abstract val appLogoAndroidSafeZoneRatio: Property<Double>

Fraction of the Android adaptive-icon canvas (108dp) that the foreground is scaled to. The FG is centred on a transparent canvas at this size, so smaller values mean more padding and less chance of the launcher's mask clipping corners.

Link copied to clipboard
abstract val appLogoBackgroundColor: Property<String>

Solid-colour background, as a hex string #RRGGBB or #AARRGGBB (Android convention — alpha first). Used in place of a BG PNG when the background is just a flat colour. A semi-transparent colour is flattened over white on both platforms (with a warning) so Android and iOS match.

Link copied to clipboard
abstract val appLogoPngBackground: RegularFileProperty

Background layer of the app logo, preferably a square PNG. Alpha is allowed but the BG should be effectively opaque — any transparency reads as white on the iOS flattened output. A flat-colour PNG works fine.

Link copied to clipboard
abstract val appLogoPngForeground: RegularFileProperty

Foreground layer of the app logo, preferably a square PNG with an alpha channel. Designed naturally — fill the canvas like an iOS marketing icon. The plugin handles Android's adaptive-icon safe zone automatically by centring the FG at appLogoAndroidSafeZoneRatio of the adaptive canvas (default 66/108 ~61.1%); for iOS and Android legacy fallbacks, the FG is aspect-fit into each platform's target canvas. A non-square source is contained (never stretched).

Link copied to clipboard
abstract val appName: Property<String>

Cross-platform app name. During explicit iOS synchronization, Apple uses this for PRODUCT_NAME, CFBundleName, and CFBundleDisplayName; diagnostics warn at 16+ characters because Apple recommends a shorter CFBundleName.

Link copied to clipboard
abstract val backupBeforeRewrite: Property<Boolean>

Copy a user-owned text target to <file>.kitessot.bak before its first rewrite and preserve first-contact iOS AppIcon files in the checksummed durable .kitessot/recovery area outside build/. Default true. Android legacy takeover always uses its checksummed recovery area when cleanupLegacyLogoArtifacts is enabled.

Link copied to clipboard

Runtime build-config codegen. See KiteSsotBuildConfigExtension. Accessed as kiteSsot { buildConfig { enabled = true } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios / android / web.

Link copied to clipboard
abstract val bundleIdBase: Property<String>

Reverse-DNS identifier stem used by androidApplicationId and iosBundleId. Platform suffixes are appended literally and the resolved identifiers are validated before a consuming adapter or migration runs.

Link copied to clipboard
val canonicalLocales: Provider<List<String>>

Canonical, de-duplicated supported resource-locale model used by every renderer.

Link copied to clipboard
abstract val cleanupLegacyLogoArtifacts: Property<Boolean>

Authorize takeover of pre-FG/BG artefacts, template collisions, and—before the first ownership manifest—unowned paths the current Android installer will claim. Default false. A complete enabled replacement logo is required. When true, kiteSsotSyncAndroidLogo validates/renders the replacement first, then backs up, takes over, and installs in one rollback-capable operation. kiteSsotCleanupLegacyAppLogoArtifacts remains an explicit backup/removal task for manual recovery workflows.

Link copied to clipboard
abstract val composeResourcesDirectory: DirectoryProperty

Optional explicit Compose resources directory used for locale discovery.

Link copied to clipboard
abstract val dryRun: Property<Boolean>

Preview switch for explicitly invoked migration/install tasks. Text tasks render unified-style diffs and binary installers list planned paths without writing. Generated build outputs ignore this flag. Prefer the read-only kiteSsotPlan task for an initial overview.

Link copied to clipboard
abstract val extraOptIns: ListProperty<String>

Extra opt-in marker FQNs appended to the interop defaults in the same explicitly selected Native compilation scope, e.g. extraOptIns.add("kotlin.experimental.ExperimentalObjCRefinement").

Link copied to clipboard
abstract val filterAndroidResources: Property<Boolean>

Apply Android packaging resource filters derived from locales. Dangerous optimization; default false.

Link copied to clipboard
abstract val interopProjectPaths: ListProperty<String>

Exact KMP project paths eligible for Native compiler-policy propagation. Empty falls back to resolvedSharedProjectPath; ambiguity or no selection is an error when propagateInteropOptIns is enabled.

Link copied to clipboard

iOS-only options (Info.plist feature flags). See KiteSsotIosExtension. Accessed as kiteSsot { ios { usesNonExemptEncryption = false } }.

Link copied to clipboard
abstract val iosAppDir: Property<String>

Legacy relative path. Prefer iosAppDirectory.

Link copied to clipboard
abstract val iosAppDirectory: DirectoryProperty

Typed iOS source tree used for narrowly scoped Swift migration. Defaults to iosApp below the root project.

Link copied to clipboard
abstract val iosAppIconDirectory: DirectoryProperty

Typed AppIcon.appiconset installation directory. Defaults to iosApp/iosApp/Assets.xcassets/AppIcon.appiconset below the root project.

Link copied to clipboard
abstract val iosAppiconsetPath: Property<String>

Path (relative to root project) to the iOS AppIcon.appiconset directory. Defaults to iosApp/iosApp/Assets.xcassets/AppIcon.appiconset. Override for non-standard Xcode group layouts.

Link copied to clipboard
abstract val iosBuildNumber: Property<String>

Apple build number (CFBundleVersion): one to three numeric components, with widths 4/2/2 and a positive first component. Deliberately independent from Android versionCodeOverride.

Link copied to clipboard
val iosBundleId: Provider<String>

Resolved Apple identifier: bundleIdBase plus iosBundleSuffix.

Link copied to clipboard
abstract val iosBundleSuffix: Property<String>

Suffix appended to bundleIdBase for the iOS bundle id. Unset means no suffix.

Link copied to clipboard
abstract val iosInfoPlistFile: RegularFileProperty

Typed source XML Info.plist selected for explicit sanitization. Defaults to iosApp/iosApp/Info.plist below the root project.

Link copied to clipboard
abstract val iosInfoPlistPath: Property<String>

Legacy relative path. Prefer iosInfoPlistFile.

Link copied to clipboard
abstract val iosMarketingVersion: Property<String>

Apple marketing version (CFBundleShortVersionString). Defaults to versionName and is Apple-validated when iOS version synchronization is enabled.

Link copied to clipboard
abstract val iosPbxprojFile: RegularFileProperty

Typed source project.pbxproj selected for explicit iOS migration. Defaults to iosApp/iosApp.xcodeproj/project.pbxproj below the root project.

Link copied to clipboard
abstract val iosPodfileFile: RegularFileProperty

Typed Podfile selected for an explicit shared-module migration. Defaults to iosApp/Podfile below the root project.

Link copied to clipboard
abstract val iosPodfilePath: Property<String>

Legacy relative path. Prefer iosPodfileFile.

Link copied to clipboard
abstract val iosPreviousSharedModuleName: Property<String>

Previous CocoaPods/Swift module identifier for an explicit iOS reference migration. Set together with iosSharedModuleName. The plugin never guesses this value from a Podfile.

Link copied to clipboard
abstract val iosProjectPath: Property<String>

Legacy relative path. Prefer iosPbxprojFile.

Link copied to clipboard
abstract val iosSharedModuleName: Property<String>

New CocoaPods/Swift module identifier for an explicit iOS reference migration. Set together with iosPreviousSharedModuleName. This is an identifier, not a Gradle project path or filesystem directory.

Link copied to clipboard
abstract val javaVersion: Property<Int>

Java source/target compatibility for classic AGP application/library modules, plus root-global Kotlin JVM target alignment where KGP is visible. The alignment reaches every detected project applying Kotlin Multiplatform, Kotlin/JVM, or Kotlin Android and is not scoped by application, shared, interop, or web selectors. AGP's KMP-native Android library DSL exposes no Java compileOptions, so only its Kotlin compilation can be configured by that module. No default.

Link copied to clipboard
abstract val locales: ListProperty<String>

Canonical platform-resource locale tags: 2–3 letter language with optional script, region, and variants. General BCP-47 extensions/private-use tags do not map consistently across Android/Xcode and are rejected. Legacy Android qualifiers are accepted and normalized. Defaults to discovery of exact locale-only resource directories (values-en, values-pt-rBR, or values-b+sr+Latn) when a shared project/directory can be resolved. Configuration accepts at most 1,000 entries, each at most 255 characters, before canonicalization.

Link copied to clipboard
abstract val oldSharedModuleName: Property<String>

Legacy compatibility input for iosPreviousSharedModuleName. New builds should use the semantically scoped iOS property instead.

Link copied to clipboard
abstract val propagateAndroidSdk: Property<Boolean>

Propagate the android { } SDK knobs (compileSdk/minSdk/targetSdk/ndkVersion). Default true.

Link copied to clipboard
abstract val propagateAppName: Property<Boolean>

Propagate a present appName to selected platform consumers. Default true.

Link copied to clipboard
abstract val propagateBundleId: Property<Boolean>

Propagate resolved platform bundle/application identifiers. Default true.

Link copied to clipboard
abstract val propagateInteropOptIns: Property<Boolean>

Propagate the interop opt-in markers (ExperimentalForeignApi, ExperimentalObjCName, ExperimentalNativeApi) to Kotlin/Native compilations in interopProjectPaths (or the selected shared project). Default false. Add your own via extraOptIns.

Link copied to clipboard
abstract val propagateLocaleList: Property<Boolean>

Add requested locale metadata to enabled platform consumers. Default true.

Link copied to clipboard
abstract val propagateLogo: Property<Boolean>

Enable explicitly invoked logo installers. Default false. Android requires this toggle alone; the Apple installer additionally requires syncIos.

Link copied to clipboard
abstract val propagateSharedModule: Property<Boolean>

Enable the explicit Podfile/Swift shared-module reference migration under syncIos. Default false.

Link copied to clipboard
abstract val propagateVersion: Property<Boolean>

Propagate present platform release versions and build numbers. Default true.

Link copied to clipboard

Effective absolute shared-project selector, including the legacy module-name fallback.

Link copied to clipboard
abstract val sanitizeIosProject: Property<Boolean>

Ensure the iOS Info.plist has the SSOT-pointing keys the sync task relies on. Effective only with syncIos. Default false. Run explicitly after reviewing the plan/check output.

Link copied to clipboard
abstract val sharedModule: Property<String>

Legacy shared module directory/name. Optional. Prefer sharedProjectPath and composeResourcesDirectory when directory, Gradle project, CocoaPod, and Swift framework names differ.

Link copied to clipboard
abstract val sharedProjectPath: Property<String>

Absolute Gradle project path that owns shared/common generated source, for example :shared.

Link copied to clipboard
abstract val syncIos: Property<Boolean>

Explicit opt-in for source-tree iOS migration tasks. Default false; ordinary builds never invoke them.

Link copied to clipboard
val versionCode: Provider<Int>

versionCode: validated versionCodeOverride when set, otherwise derived from versionName via "1" + three zero-padded dot segments. The derivation requires exactly three canonical numeric components in 0..999 (see deriveVersionCode).

Link copied to clipboard
abstract val versionCodeOverride: Property<Int>

Explicit Android versionCode. When set, it is used verbatim and the derivation from versionName is bypassed. Set this when versionName is not a plain numeric x.y.z or when you want full control. Values are validated against Google Play's 1..2_100_000_000 range.

Link copied to clipboard
abstract val versionName: Property<String>

Cross-platform human-readable release version. Android uses it as versionName; Apple iosMarketingVersion defaults to it. Canonical numeric x.y.z is also required when deriving versionCode. When an enabled consumer uses the value, it must be non-blank, contain no control characters, and contain at most 255 characters.

Link copied to clipboard

Browser Kotlin/JS options. wasmJs and Node-only targets are unsupported. See KiteSsotWebExtension. Accessed as kiteSsot { web { generateIoWorker = true } }. Created as a child extension by KiteSsotPlugin.apply for the same reason as ios / android.

Functions

Link copied to clipboard
fun android(action: Action<in KiteSsotAndroidExtension>)

Configure the nested Android SDK/release model.

Link copied to clipboard

Configure optional common Kotlin constants generation.

Link copied to clipboard
fun ios(action: Action<in KiteSsotIosExtension>)

Configure the nested Apple-specific model.

Link copied to clipboard
fun web(action: Action<in KiteSsotWebExtension>)

Configure optional browser Kotlin/JS source generation.