kappmaker 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +481 -33
  2. package/dist/cli.js +146 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/adapty-setup.js +5 -4
  5. package/dist/commands/adapty-setup.js.map +1 -1
  6. package/dist/commands/android-release-build.d.ts +7 -0
  7. package/dist/commands/android-release-build.js +51 -0
  8. package/dist/commands/android-release-build.js.map +1 -0
  9. package/dist/commands/config.js +11 -1
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/create-appstore-app.js +18 -1
  12. package/dist/commands/create-appstore-app.js.map +1 -1
  13. package/dist/commands/create-logo.js +16 -5
  14. package/dist/commands/create-logo.js.map +1 -1
  15. package/dist/commands/create-play-app.d.ts +2 -0
  16. package/dist/commands/create-play-app.js +399 -0
  17. package/dist/commands/create-play-app.js.map +1 -0
  18. package/dist/commands/create.js +138 -64
  19. package/dist/commands/create.js.map +1 -1
  20. package/dist/commands/enhance.js +12 -4
  21. package/dist/commands/enhance.js.map +1 -1
  22. package/dist/commands/fastlane-configure.d.ts +1 -0
  23. package/dist/commands/fastlane-configure.js +9 -0
  24. package/dist/commands/fastlane-configure.js.map +1 -0
  25. package/dist/commands/generate-keystore.d.ts +7 -0
  26. package/dist/commands/generate-keystore.js +14 -0
  27. package/dist/commands/generate-keystore.js.map +1 -0
  28. package/dist/commands/generate-screenshots.js +22 -7
  29. package/dist/commands/generate-screenshots.js.map +1 -1
  30. package/dist/commands/gpc.d.ts +29 -0
  31. package/dist/commands/gpc.js +174 -0
  32. package/dist/commands/gpc.js.map +1 -0
  33. package/dist/commands/publish.d.ts +10 -0
  34. package/dist/commands/publish.js +38 -0
  35. package/dist/commands/publish.js.map +1 -0
  36. package/dist/commands/refactor.d.ts +9 -0
  37. package/dist/commands/refactor.js +9 -0
  38. package/dist/commands/refactor.js.map +1 -0
  39. package/dist/commands/remove-bg.js +12 -4
  40. package/dist/commands/remove-bg.js.map +1 -1
  41. package/dist/commands/translate-screenshots.js +22 -8
  42. package/dist/commands/translate-screenshots.js.map +1 -1
  43. package/dist/commands/update-version.d.ts +5 -0
  44. package/dist/commands/update-version.js +21 -0
  45. package/dist/commands/update-version.js.map +1 -0
  46. package/dist/services/asc-monetization.service.js +39 -29
  47. package/dist/services/asc-monetization.service.js.map +1 -1
  48. package/dist/services/asc.service.d.ts +1 -1
  49. package/dist/services/asc.service.js +94 -12
  50. package/dist/services/asc.service.js.map +1 -1
  51. package/dist/services/fastlane-setup.service.d.ts +1 -0
  52. package/dist/services/fastlane-setup.service.js +50 -0
  53. package/dist/services/fastlane-setup.service.js.map +1 -0
  54. package/dist/services/fastlane.service.js +20 -8
  55. package/dist/services/fastlane.service.js.map +1 -1
  56. package/dist/services/firebase.service.js +48 -18
  57. package/dist/services/firebase.service.js.map +1 -1
  58. package/dist/services/gpc-data-safety.service.d.ts +11 -0
  59. package/dist/services/gpc-data-safety.service.js +160 -0
  60. package/dist/services/gpc-data-safety.service.js.map +1 -0
  61. package/dist/services/gpc-monetization.service.d.ts +18 -0
  62. package/dist/services/gpc-monetization.service.js +244 -0
  63. package/dist/services/gpc-monetization.service.js.map +1 -0
  64. package/dist/services/gpc.service.d.ts +87 -0
  65. package/dist/services/gpc.service.js +338 -0
  66. package/dist/services/gpc.service.js.map +1 -0
  67. package/dist/services/gradle.service.d.ts +0 -3
  68. package/dist/services/gradle.service.js +0 -24
  69. package/dist/services/gradle.service.js.map +1 -1
  70. package/dist/services/keystore.service.d.ts +6 -0
  71. package/dist/services/keystore.service.js +44 -0
  72. package/dist/services/keystore.service.js.map +1 -0
  73. package/dist/services/publish.service.d.ts +10 -0
  74. package/dist/services/publish.service.js +59 -0
  75. package/dist/services/publish.service.js.map +1 -0
  76. package/dist/services/refactor.service.d.ts +3 -0
  77. package/dist/services/refactor.service.js +207 -0
  78. package/dist/services/refactor.service.js.map +1 -0
  79. package/dist/services/version.service.d.ts +10 -0
  80. package/dist/services/version.service.js +75 -0
  81. package/dist/services/version.service.js.map +1 -0
  82. package/dist/templates/Fastfile.txt +209 -0
  83. package/dist/templates/data-safety-template.json +5483 -0
  84. package/dist/templates/googleplay-config.json +71 -0
  85. package/dist/types/googleplay.d.ts +113 -0
  86. package/dist/types/googleplay.js +2 -0
  87. package/dist/types/googleplay.js.map +1 -0
  88. package/dist/types/index.d.ts +1 -0
  89. package/dist/utils/config.d.ts +1 -0
  90. package/dist/utils/config.js +5 -0
  91. package/dist/utils/config.js.map +1 -1
  92. package/package.json +2 -2
package/README.md CHANGED
@@ -7,6 +7,7 @@ A single `kappmaker create` command can:
7
7
  - Create a Firebase project, register Android + iOS apps, enable authentication, and download SDK configs
8
8
  - Generate an AI-powered app logo with automatic background removal
9
9
  - Create an App Store Connect listing with metadata, categories, age rating, subscriptions, privacy declarations, and review contact info
10
+ - Configure an existing Google Play Console app — store listings, subscriptions, one-time in-app products, and the data safety declaration — via a built-in wrapper around the Play Publisher API (no external CLI, no extra dependencies)
10
11
  - Set up Adapty subscription products, paywalls, and placements for both iOS and Android
11
12
  - Refactor Gradle package names and application IDs
12
13
  - Set up the build environment (Android SDK, CocoaPods)
@@ -49,16 +50,44 @@ kappmaker config init
49
50
  Or set keys individually:
50
51
 
51
52
  ```bash
52
- kappmaker config set falApiKey <your-key> # Required for AI features (logo, screenshots, etc.)
53
- kappmaker config set imgbbApiKey <your-key> # Required for screenshot translation/generation
54
- kappmaker config set openaiApiKey <your-key> # Required for generate-screenshots
53
+ kappmaker config set falApiKey <your-key> # For AI features (logo, screenshots) — or prompted on first use
54
+ kappmaker config set imgbbApiKey <your-key> # For screenshot translation/generation — or prompted on first use
55
+ kappmaker config set openaiApiKey <your-key> # For generate-screenshots — or prompted on first use
55
56
  kappmaker config set templateRepo <your-repo> # Use your own template (default: KAppMaker)
56
57
  ```
57
58
 
58
59
  See [all config keys](#config-keys) and [external services setup](#external-services--api-keys) for details.
59
60
 
61
+ ## Claude Code Skill
62
+
63
+ If you use [Claude Code](https://claude.ai/code), you can install the `/kappmaker` skill to run any CLI command through natural language — with automatic prerequisite checks, guided setup, and inline error recovery.
64
+
65
+ **Install:**
66
+
67
+ ```bash
68
+ npx skills add KAppMaker/KAppMaker-CLI --skill kappmaker
69
+ ```
70
+
71
+ Or via the Claude Code plugin system:
72
+
73
+ ```
74
+ /plugin marketplace add KAppMaker/KAppMaker-CLI
75
+ /plugin install kappmaker@KAppMaker-CLI
76
+ ```
77
+
78
+ **Use:**
79
+
80
+ ```
81
+ /kappmaker create MyApp
82
+ /kappmaker generate screenshots for my fitness app
83
+ /kappmaker set up App Store Connect
84
+ ```
85
+
86
+ Claude will check your config, verify API keys are set, and walk you through any missing prerequisites before running the command.
87
+
60
88
  ## Table of Contents
61
89
 
90
+ - [Claude Code Skill](#claude-code-skill)
62
91
  - [Configuration](#configuration)
63
92
  - [Commands Overview](#commands-overview)
64
93
  - [Features](#features)
@@ -68,10 +97,17 @@ See [all config keys](#config-keys) and [external services setup](#external-serv
68
97
  - [`create <app-name>`](#create-app-name)
69
98
  - [`create-logo`](#create-logo)
70
99
  - [`create-appstore-app`](#create-appstore-app)
100
+ - [`gpc`](#gpc) — Google Play Console management
71
101
  - [`adapty setup`](#adapty-setup)
72
102
  - [Image Tools](#image-tools)
73
103
  - [`translate-screenshots`](#translate-screenshots-source-dir)
74
104
  - [`generate-screenshots`](#generate-screenshots)
105
+ - [`fastlane configure`](#fastlane-configure)
106
+ - [`publish`](#publish)
107
+ - [`generate-keystore`](#generate-keystore)
108
+ - [`android-release-build`](#android-release-build)
109
+ - [`refactor`](#refactor)
110
+ - [`update-version`](#update-version)
75
111
  - [Config Reference](#config-reference)
76
112
  - [Project Structure](#project-structure)
77
113
 
@@ -79,15 +115,27 @@ See [all config keys](#config-keys) and [external services setup](#external-serv
79
115
 
80
116
  | Command | Description |
81
117
  |---------|-------------|
82
- | [`kappmaker create <app-name>`](#create-app-name) | Full end-to-end app setup (Firebase, logo, App Store, Adapty, release build) |
118
+ | [`kappmaker create <app-name>`](#create-app-name) | Full end-to-end app setup (Firebase, logo, App Store Connect, Google Play Console, Adapty, release build) |
83
119
  | [`kappmaker create-logo`](#create-logo) | Generate an app logo with AI (fal.ai) |
84
120
  | [`kappmaker create-appstore-app`](#create-appstore-app) | Set up an app on App Store Connect (metadata, subscriptions, privacy) |
121
+ | [`kappmaker gpc setup`](#gpc) | Set up an existing app on Google Play Console (listings, subscriptions, IAPs, data safety) |
122
+ | [`kappmaker gpc listings push`](#gpc) | Push store listings from the Google Play config file |
123
+ | [`kappmaker gpc subscriptions list/push`](#gpc) | List or push subscriptions on Google Play Console |
124
+ | [`kappmaker gpc iap list/push`](#gpc) | List or push one-time in-app products on Google Play Console |
125
+ | [`kappmaker gpc data-safety push`](#gpc) | Push data safety declaration on Google Play Console |
126
+ | [`kappmaker gpc app-check --package <pkg>`](#gpc) | Check if a package exists on Google Play Console |
85
127
  | [`kappmaker adapty setup`](#adapty-setup) | Set up Adapty products, paywalls, and placements |
86
128
  | [`kappmaker image-split <image>`](#image-split-source) | Split a grid image into individual tiles |
87
129
  | [`kappmaker image-remove-bg <image>`](#image-remove-bg-source) | Remove background from an image (fal.ai) |
88
130
  | [`kappmaker image-enhance <image>`](#image-enhance-source) | Upscale and enhance image quality (fal.ai) |
89
131
  | [`kappmaker translate-screenshots [dir]`](#translate-screenshots-source-dir) | Translate screenshots to multiple locales (fal.ai) |
90
132
  | [`kappmaker generate-screenshots`](#generate-screenshots) | Generate marketing screenshots with AI (OpenAI + fal.ai) |
133
+ | [`kappmaker fastlane configure`](#fastlane-configure) | Set up Fastlane in the mobile app directory |
134
+ | [`kappmaker publish`](#publish) | Build and upload to Google Play and/or App Store via Fastlane |
135
+ | [`kappmaker generate-keystore`](#generate-keystore) | Generate an Android signing keystore for Play Store releases |
136
+ | [`kappmaker android-release-build`](#android-release-build) | Build a signed Android release AAB |
137
+ | [`kappmaker refactor`](#refactor) | Refactor package names, application ID, bundle ID, and app name |
138
+ | [`kappmaker update-version`](#update-version) | Bump Android and iOS version codes and version name |
91
139
  | [`kappmaker config`](#config) | Manage CLI settings, API keys, and global defaults |
92
140
 
93
141
  ## Features
@@ -99,18 +147,20 @@ These commands are standalone and don't depend on any specific boilerplate:
99
147
  - **AI logo generation** — Generate logo variations with fal.ai, pick your favorite, auto-remove background
100
148
  - **AI screenshot generation** — Generate marketing screenshots from a text description (8 style presets)
101
149
  - **Screenshot translation** — Translate app screenshots to 48+ locales in parallel
102
- - **App Store Connect setup** — Register bundle ID, create app, set metadata, categories, age rating, subscriptions, privacy, and review info
150
+ - **App Store Connect setup** — Register bundle ID (with Sign in with Apple, In-App Purchases, and Push Notifications capabilities enabled automatically), create app, set metadata, categories, age rating, subscriptions, privacy, and review info — fully automated, no manual App Store Connect steps needed
151
+ - **Google Play Console setup** — Push store listings, subscriptions (new monetization API), one-time in-app products, and the data safety declaration via a built-in wrapper around the Play Publisher API — no external CLI, no extra dependencies
103
152
  - **Adapty subscription setup** — Create products, paywalls, and placements for iOS and Android
153
+ - **Version bumping** — Increment Android and iOS version codes and names in one command
104
154
  - **Image tools** — Split grids, remove backgrounds, enhance quality
105
155
 
106
156
  ### KAppMaker boilerplate-specific
107
157
 
108
158
  The `create` command runs the full end-to-end setup. Some steps assume the [KAppMaker](https://kappmaker.com) project structure and will be skipped with a warning if you use a custom template:
109
159
 
110
- - **Gradle refactor** — Renames package name and app ID using a custom Gradle task (`refactorPackage`) built into the KAppMaker template
160
+ - **Package refactor** — Renames package name, app ID, and display name using the TypeScript refactor service (also available standalone via `kappmaker refactor`)
111
161
  - **Firebase SDK config placement** — Downloads `google-services.json` and `GoogleService-Info.plist` to KAppMaker-specific paths (falls back to `Assets/` for custom templates)
112
162
  - **Build environment** — Creates `local.properties` and runs CocoaPods in the `MobileApp/` directory
113
- - **Android release build** — Runs Fastlane `first_time_build` lane defined in the KAppMaker template
163
+ - **Android release build** — Generates keystore and builds signed AAB (also available standalone via `kappmaker android-release-build`)
114
164
  - **Git remotes** — Renames origin to upstream (designed for the "fork from template" workflow)
115
165
  - **Screenshot translation default path** — Defaults to `MobileApp/distribution/ios/appstore_metadata/screenshots/en-US` (falls back to parent of source directory)
116
166
 
@@ -126,6 +176,7 @@ The `create` command runs the full end-to-end setup. Some steps assume the [KApp
126
176
  - **Android SDK** — installed at `~/Library/Android/sdk` (configurable)
127
177
  - **asc CLI** (optional, for App Store Connect) — `brew install asc`
128
178
  - **Adapty CLI** (optional, for Adapty setup) — `npm install -g adapty`
179
+ - **No extra CLI for Google Play Console** — `kappmaker gpc` talks to the Play Publisher API directly via Node's built-in `fetch` and `crypto`; all it needs is the service-account JSON path set in `googleServiceAccountPath`
129
180
 
130
181
  ## External Services & API Keys
131
182
 
@@ -138,7 +189,7 @@ The CLI integrates with several external services for AI image generation, app s
138
189
  **How to get your key:**
139
190
  1. Sign up at [fal.ai](https://fal.ai)
140
191
  2. Go to [Dashboard > Keys](https://fal.ai/dashboard/keys) and create an API key
141
- 3. `kappmaker config set falApiKey <your-key>`
192
+ 3. `kappmaker config set falApiKey <your-key>` — or skip this and the CLI will prompt you the first time you run a command that needs it
142
193
 
143
194
  ### ImgBB — Image Hosting
144
195
 
@@ -147,7 +198,7 @@ The CLI integrates with several external services for AI image generation, app s
147
198
  **How to get your key:**
148
199
  1. Sign up at [imgbb.com](https://imgbb.com)
149
200
  2. Go to [api.imgbb.com](https://api.imgbb.com/) and get your free API key
150
- 3. `kappmaker config set imgbbApiKey <your-key>`
201
+ 3. `kappmaker config set imgbbApiKey <your-key>` — or prompted on first use
151
202
 
152
203
  ### OpenAI — Prompt Generation
153
204
 
@@ -156,11 +207,11 @@ The CLI integrates with several external services for AI image generation, app s
156
207
  **How to get your key:**
157
208
  1. Sign up at [platform.openai.com](https://platform.openai.com)
158
209
  2. Go to [API Keys](https://platform.openai.com/api-keys) and create a new key
159
- 3. `kappmaker config set openaiApiKey <your-key>`
210
+ 3. `kappmaker config set openaiApiKey <your-key>` — or prompted on first use
160
211
 
161
- ### App Store Connect CLI (asc) — iOS App Management
212
+ ### App Store Connect CLI (asc) — iOS App Management & Publishing
162
213
 
163
- **Used for:** Creating apps, setting metadata, categories, subscriptions, privacy declarations, and review info on App Store Connect.
214
+ **Used for:** Creating apps, setting metadata, categories, subscriptions, privacy declarations, and review info on App Store Connect (`create-appstore-app`). The same API key credentials are also used by `publish --platform ios` to build and upload IPAs via Fastlane.
164
215
 
165
216
  **How to set up:**
166
217
  1. Install: `brew install asc`
@@ -174,6 +225,8 @@ The CLI integrates with several external services for AI image generation, app s
174
225
  ```
175
226
  Or run `kappmaker config appstore-defaults --init` for interactive setup.
176
227
 
228
+ > **Note:** `kappmaker publish --platform ios` uses `ascKeyId`, `ascIssuerId`, and `ascPrivateKeyPath` to automatically generate the Fastlane-format publisher JSON — no separate credentials needed.
229
+
177
230
  ### Adapty CLI — Subscription Management
178
231
 
179
232
  **Used for:** Setting up in-app subscription products, paywalls, and placements across iOS and Android via Adapty's backend.
@@ -191,6 +244,47 @@ The CLI integrates with several external services for AI image generation, app s
191
244
  1. Install: `npm install -g firebase-tools`
192
245
  2. The `create` command handles login and project creation interactively.
193
246
 
247
+ ### Google Play Publisher — Android Store Uploads + Play Console Management
248
+
249
+ **Used for:**
250
+ - Building and uploading Android AABs to Google Play Store via `kappmaker publish --platform android` (Fastlane)
251
+ - Configuring store listings, subscriptions, in-app products, and the data safety declaration via `kappmaker gpc ...` (direct Publisher API call, no external CLI)
252
+
253
+ Both flows share the same service account JSON key — set it once, use it everywhere.
254
+
255
+ **How to set up:**
256
+
257
+ 1. Go to [Google Cloud Console](https://console.cloud.google.com) and create a new project (or select existing)
258
+ 2. Open **APIs & Services > Library**, search for **Google Play Android Developer API**, and enable it
259
+ 3. Go to **IAM & Admin > Service Accounts**, create a new service account (skip role assignment)
260
+ 4. Open the service account, go to **Keys**, click **Add key > Create new key > JSON**, and download it
261
+ 5. Open [Google Play Console](https://play.google.com/console), go to **Settings > Users and permissions**
262
+ 6. Click **Invite new user** with the service account email (`...@...iam.gserviceaccount.com`) and grant permissions for your app(s)
263
+ 7. Save the JSON key file and configure:
264
+ ```bash
265
+ kappmaker config set googleServiceAccountPath /path/to/google-service-app-publisher.json
266
+ ```
267
+
268
+ > **Note:** Google Play does not allow creating new apps via any public API — you must create the app manually once in [Play Console](https://play.google.com/console/u/0/developers) before `kappmaker gpc` can configure it.
269
+
270
+ ### App Store Publisher — iOS Store Uploads
271
+
272
+ **Used for:** Building and uploading iOS IPAs to App Store Connect, managing App Store metadata and screenshots via `kappmaker publish --platform ios`.
273
+
274
+ The `publish` command reuses the same App Store Connect API key credentials used by `create-appstore-app` (`ascKeyId`, `ascIssuerId`, `ascPrivateKeyPath`) and automatically generates the Fastlane-format publisher JSON.
275
+
276
+ **How to set up** (if not already configured for `create-appstore-app`):
277
+
278
+ 1. Open [App Store Connect > Users and Access > Integrations](https://appstoreconnect.apple.com/access/integrations/api)
279
+ 2. Create an API key with **App Manager** access and download the `.p8` file
280
+ 3. Note the **Key ID** and **Issuer ID**
281
+ 4. Configure:
282
+ ```bash
283
+ kappmaker config set ascKeyId <your-key-id>
284
+ kappmaker config set ascIssuerId <your-issuer-id>
285
+ kappmaker config set ascPrivateKeyPath /path/to/AuthKey.p8
286
+ ```
287
+
194
288
  ---
195
289
 
196
290
  ## `create <app-name>`
@@ -209,15 +303,16 @@ kappmaker create Remimi
209
303
  | 2 | Firebase login | Opens browser for authentication |
210
304
  | 3 | Create Firebase project | `<appname>-app` (skips if exists) |
211
305
  | 4 | Create Firebase apps | Android + iOS apps (reuses existing if found) |
212
- | 5 | Enable anonymous auth | Via Identity Toolkit REST API (warns on failure) |
213
- | 6 | Download SDK configs | `google-services.json` + `GoogleService-Info.plist` (falls back to `Assets/` for custom templates) |
306
+ | 5 | Enable anonymous auth | If brand-new project, prompts user to click "Get started" in Firebase Console, then enables via API |
307
+ | 6 | Download SDK configs | `google-services.json` + `GoogleService-Info.plist` (verifies package match, falls back to `Assets/`) |
214
308
  | 7 | Logo generation | *Optional* — AI logo + automatic background removal |
215
- | 8 | App Store Connect | *Optional* full app setup (metadata, subs, privacy) |
216
- | 9 | Adapty setup | *Optional* — products, paywalls, placements |
217
- | 10 | Gradle refactor | Sets app name + application ID; *skipped with warning if `refactorPackage` task not found* |
218
- | 11 | Build environment | Creates `local.properties`, installs CocoaPods; *skipped with warning if `gradlew`/`Podfile` not found* |
219
- | 12 | Git remotes | Renames origin to upstream |
220
- | 13 | Android release build | Fastlane build, prints AAB path; *skipped with warning if `Fastfile` not found* |
309
+ | 8 | Package refactor | Renames packages, IDs, app name across all modules (composeApp, designsystem, libs) |
310
+ | 9 | Build environment | `local.properties`, CocoaPods, generates signing keystore if missing |
311
+ | 10 | Git remotes | Renames origin to upstream |
312
+ | | *Pre-store reminder* | *Prompts user to create Google Play Console app; App Store Connect is created automatically* |
313
+ | 11 | App Store Connect | *Optional* full app setup (metadata, subs, privacy); app created automatically via `asc web apps create` |
314
+ | 12 | Google Play Console | *Optional* — Fastlane builds + uploads AAB to internal track, then runs full gpc setup |
315
+ | 13 | Adapty setup | *Optional* — products, paywalls, placements (links to ASC + Play products created in 11-12) |
221
316
 
222
317
  **Options:**
223
318
 
@@ -246,7 +341,7 @@ kappmaker create-logo --output ./custom/path/logo.png
246
341
 
247
342
  **Output:** `Assets/app_logo.png` + `Assets/logo_variations.png`
248
343
 
249
- Requires: `kappmaker config set falApiKey <your-key>`
344
+ Requires a fal.ai API key (prompted on first use if not set, or set manually: `kappmaker config set falApiKey <your-key>`)
250
345
 
251
346
  | Flag | Description | Default |
252
347
  |------|-------------|---------|
@@ -275,8 +370,8 @@ kappmaker create-appstore-app --config ./my-config.json
275
370
 
276
371
  1. Validate asc CLI and authentication
277
372
  2. Load config (from file or interactive prompts)
278
- 3. Register Bundle ID
279
- 4. Find or create app
373
+ 3. Register Bundle ID + enable capabilities (Sign in with Apple, In-App Purchases, Push Notifications). Name follows Apple convention: `XC com measify myapp` for `com.measify.myapp`
374
+ 4. Find or create app (fully automated via `asc web apps create` — no manual App Store Connect step needed)
280
375
  5. Set content rights
281
376
  6. Create app version (1.0.0)
282
377
  7. Set categories
@@ -325,6 +420,181 @@ During interactive setup, the CLI asks if the app accesses user content (AI imag
325
420
 
326
421
  ---
327
422
 
423
+ ## `gpc`
424
+
425
+ Google Play Console management — a tight wrapper around the official Google Play Android Publisher API. All subcommands authenticate via the service account JSON at `googleServiceAccountPath` (same one used by `publish --platform android`). **No external CLI and no extra npm dependencies** — the JWT flow and HTTPS calls are implemented with Node's built-in `crypto` and `fetch`.
426
+
427
+ > **Note:** Google Play does not allow creating new apps via any public API. Create the app manually once in [Play Console](https://play.google.com/console/u/0/developers), then use these commands to configure it.
428
+
429
+ ### `gpc setup`
430
+
431
+ Full end-to-end configuration (11 steps) — the Google Play parallel to `create-appstore-app`.
432
+
433
+ ```bash
434
+ kappmaker gpc setup
435
+ kappmaker gpc setup --config ./my-config.json
436
+ ```
437
+
438
+ **What it does:**
439
+
440
+ 1. Validate service account + obtain access token
441
+ 2. Load config (`./Assets/googleplay-config.json` or interactive prompts). **Auto-detects Play's actual default language** via a throwaway edit probe and rewrites `config.app.default_language` + the matching listing locale if your config drifted from reality. Also migrates legacy product IDs and legacy data-safety placeholders. Also reads tracks state to verify an APK/AAB is uploaded.
442
+ 3. Review summary and confirm
443
+ 4. Verify app exists on Play Console (fails fast with a deep link if not — Google does not allow app creation via the public API)
444
+ 5. Start a Play Console edit (only if the default-language listing has a title — otherwise steps 5-7 are skipped cleanly)
445
+ 6. Update app details (default language + contact website/email/phone)
446
+ 7. Update store listings per locale (title, short/full description, video); commits the edit
447
+ 8. **Pre-flight build check**, then create subscriptions via the new monetization API (`POST /subscriptions` with `productId` + `regionsVersion.version` as query params, base plans in body in DRAFT state, then `basePlans:activate` each one). Idempotent — existing product IDs are skipped. **Subscription listings are auto-cloned into Play's default language if missing.** Skipped with a clear message if no build is uploaded to any track (Google rejects monetization writes in that case).
448
+ 9. Create one-time in-app products via the **new** monetization API (`PATCH /onetimeproducts/{id}?allowMissing=true` + `purchaseOptions:batchUpdateStates` to activate). Idempotent via `GET /oneTimeProducts`. Replaces the legacy `/inappproducts` endpoint that returns 403 on migrated apps.
449
+ 10. Update the data safety declaration: converts `data_safety` JSON → Google's CSV format using a bundled canonical template + KAppMaker defaults matching the iOS App Store privacy set, then posts it via `POST /dataSafety` with `{ safetyLabels: "<csv>" }`. Respects `data_safety_csv_path` as an escape hatch for pre-exported CSVs.
450
+ 11. Print a checklist of policy declarations that the Publisher API does NOT expose (content rating / IARC, target audience, ads, health apps, financial features, government apps, news apps, gambling, COVID-19 tracing, app access, advertising ID, families compliance, app pricing tier) with a deep link to Play Console's App content page. All verified against Google's v3 discovery document — none have REST endpoints.
451
+
452
+ ### `gpc listings push`
453
+
454
+ Push just the store listings section from the config file (useful after editing copy).
455
+
456
+ ```bash
457
+ kappmaker gpc listings push
458
+ kappmaker gpc listings push --config ./my-config.json
459
+ ```
460
+
461
+ Runs a single edit transaction: updates app details → updates every listing locale → commits.
462
+
463
+ ### `gpc subscriptions list`
464
+
465
+ Read-only — lists existing subscription product IDs on Play Console.
466
+
467
+ ```bash
468
+ kappmaker gpc subscriptions list --package com.example.myapp
469
+ kappmaker gpc subscriptions list # uses app.package_name from the config file
470
+ ```
471
+
472
+ ### `gpc subscriptions push`
473
+
474
+ Create or reuse subscriptions from the config file. Idempotent — already-existing product IDs are skipped, and base plans are activated even for reused subscriptions.
475
+
476
+ ```bash
477
+ kappmaker gpc subscriptions push
478
+ ```
479
+
480
+ Uses the **new** monetization API (`applications/{pkg}/subscriptions` + `basePlans:activate`). Auto-generated IDs:
481
+
482
+ | Field | Format | Example ($6.99 weekly) |
483
+ |---|---|---|
484
+ | `productId` (subscription) | `{appname}.premium.{period}.v1` | `myapp.premium.weekly.v1` |
485
+ | `basePlanId` | `autorenew-{period}-{priceDigits}-v1` | `autorenew-weekly-699-v1` |
486
+ | Subscription title | `{AppName} Premium {PeriodLabel}` | `MyApp Premium Weekly` |
487
+
488
+ These align 1-to-1 with what `adapty setup` writes to `android_product_id` and `android_base_plan_id`, so Adapty links the products automatically without any extra configuration.
489
+
490
+ ### `gpc iap list`
491
+
492
+ Read-only — lists existing one-time in-app product SKUs on Play Console.
493
+
494
+ ```bash
495
+ kappmaker gpc iap list --package com.example.myapp
496
+ kappmaker gpc iap list
497
+ ```
498
+
499
+ ### `gpc iap push`
500
+
501
+ Create or reuse one-time in-app products from the config file. Idempotent — already-existing product IDs are skipped.
502
+
503
+ ```bash
504
+ kappmaker gpc iap push
505
+ ```
506
+
507
+ Uses the **new** monetization API: `PATCH /applications/{pkg}/onetimeproducts/{id}?allowMissing=true` to create/update the product, then `purchaseOptions:batchUpdateStates` with an `activatePurchaseOptionRequest` to activate the default purchase option so it's available to buyers. Replaces the legacy `/inappproducts` endpoint, which Google now rejects with "Please migrate to the new publishing API" on migrated apps.
508
+
509
+ ### `gpc data-safety push`
510
+
511
+ Push only the data safety declaration. Faster than running the full `setup` when you're iterating on the privacy answers.
512
+
513
+ ```bash
514
+ kappmaker gpc data-safety push
515
+ ```
516
+
517
+ **How it works under the hood:** Google's `POST /applications/{pkg}/dataSafety` does not take structured JSON — it takes a CSV file (the same one Play Console exports from Policy → App content → Data safety → Export to CSV), wrapped in `{ safetyLabels: "<csv>" }`. KAppMaker lets you stay in JSON and converts internally.
518
+
519
+ **Two ways to configure it in `Assets/googleplay-config.json`:**
520
+
521
+ 1. **Structured JSON (recommended)** — `data_safety.answers` overlay on top of KAppMaker defaults:
522
+
523
+ **Account creation:** "My app does not allow users to create an account" (`PSL_ACM_NONE`).
524
+
525
+ **Data deletion:** skipped entirely (the question is optional).
526
+
527
+ **Data types collected:**
528
+
529
+ | Data type | Play Question / Response |
530
+ |---|---|
531
+ | User IDs | `PSL_DATA_TYPES_PERSONAL/PSL_USER_ACCOUNT` |
532
+ | Device ID | `PSL_DATA_TYPES_IDENTIFIERS/PSL_DEVICE_ID` |
533
+ | Crash logs | `PSL_DATA_TYPES_APP_PERFORMANCE/PSL_CRASH_LOGS` |
534
+ | Diagnostics | `PSL_DATA_TYPES_APP_PERFORMANCE/PSL_PERFORMANCE_DIAGNOSTICS` |
535
+ | Other performance | `PSL_DATA_TYPES_APP_PERFORMANCE/PSL_OTHER_PERFORMANCE` |
536
+ | App interactions | `PSL_DATA_TYPES_APP_ACTIVITY/PSL_USER_INTERACTION` |
537
+
538
+ **Data handling (same for ALL data types above):**
539
+ - Collected only, **not shared** with third parties
540
+ - **Processed ephemerally** (YES)
541
+ - **Collection is required** — users can't turn it off
542
+ - Purposes: Analytics (+ App functionality for Device ID)
543
+
544
+ **Security:** encrypted in transit = YES.
545
+
546
+ Example config (just use the default — override if you need to add data types or change handling):
547
+ ```json
548
+ "data_safety": {
549
+ "apply_defaults": true,
550
+ "answers": {}
551
+ }
552
+ ```
553
+
554
+ To override a specific answer, add keys to `answers`. Keys are either `QuestionID` (for single-answer rows) or `QuestionID/ResponseID` (for multi-choice rows). Values are `true` / `false` / URL string / `null`:
555
+ ```json
556
+ "data_safety": {
557
+ "apply_defaults": true,
558
+ "answers": {
559
+ "PSL_DATA_TYPES_PERSONAL/PSL_USER_ACCOUNT": true,
560
+ "PSL_DATA_TYPES_LOCATION/PSL_APPROX_LOCATION": true
561
+ }
562
+ }
563
+ ```
564
+
565
+ Internally, KAppMaker loads a canonical 783-row template (extracted from the well-maintained [fastlane-plugin-google_data_safety](https://github.com/owenbean400/fastlane-plugin-google_data_safety)), applies defaults + your overrides, emits a filled CSV, and uploads it via `POST /dataSafety`.
566
+
567
+ 2. **Escape hatch: CSV file** — if you already exported a real CSV from Play Console and filled it in:
568
+ ```json
569
+ "data_safety_csv_path": "Assets/data-safety.csv"
570
+ ```
571
+ When this field is set and the file exists, it takes priority over the JSON block and is uploaded verbatim.
572
+
573
+ **Important:** Review the summary Play Console shows after the push before publishing. Google's conditional question logic may reject some answers — paste the error and I'll adjust the defaults.
574
+
575
+ ### `gpc app-check`
576
+
577
+ Quick read-only probe to verify that an app exists on Play Console. Useful for CI scripts and before running destructive operations.
578
+
579
+ ```bash
580
+ kappmaker gpc app-check --package com.example.myapp
581
+ ```
582
+
583
+ Exits 0 if found, 2 if missing (prints the Play Console deep link).
584
+
585
+ ### Config
586
+
587
+ All `gpc` subcommands except `app-check` load `./Assets/googleplay-config.json` by default. The first run of `kappmaker gpc setup` creates it interactively.
588
+
589
+ | Flag | Description | Default |
590
+ |------|-------------|---------|
591
+ | `--config <path>` | Path to JSON config file | `./Assets/googleplay-config.json` |
592
+ | `--package <name>` | (list commands) Override the package name from config | — |
593
+
594
+ **Alias:** `kappmaker create-play-app` is kept as a shortcut for `kappmaker gpc setup` (the entire 11-step flow is also what the top-level `kappmaker create` calls under step 8 when you answer yes to the Google Play Console prompt).
595
+
596
+ ---
597
+
328
598
  ## `adapty setup`
329
599
 
330
600
  Sets up Adapty subscription products, paywalls, and placements using the [Adapty CLI](https://github.com/adaptyteam/adapty-cli).
@@ -348,12 +618,12 @@ kappmaker adapty setup --config ./my-config.json
348
618
 
349
619
  ### Default products
350
620
 
351
- | Product | Period | Price | iOS Product ID | Android Base Plan ID |
352
- |---------|--------|-------|----------------|---------------------|
353
- | Weekly Premium | `weekly` | $6.99 | `{appname}.premium.weekly.v1.699.v1` | `autorenew-weekly-price-v1` |
354
- | Yearly Premium | `annual` | $29.99 | `{appname}.premium.yearly.v1.2999.v1` | `autorenew-yearly-price-v1` |
621
+ | Product | Period | Price | iOS Product ID | Android Product ID | Android Base Plan ID |
622
+ |---------|--------|-------|----------------|--------------------|-----------------------|
623
+ | Weekly Premium | `weekly` | $6.99 | `{appname}.premium.weekly.v1.699.v1` | `{appname}.premium.weekly.v1` | `autorenew-weekly-699-v1` |
624
+ | Yearly Premium | `annual` | $29.99 | `{appname}.premium.yearly.v1.2999.v1` | `{appname}.premium.yearly.v1` | `autorenew-yearly-2999-v1` |
355
625
 
356
- iOS product IDs match the App Store Connect format so they align across both systems.
626
+ iOS product IDs match the App Store Connect format, and Android IDs match what `kappmaker gpc setup` writes to Google Play Console — so all three systems link automatically without extra configuration.
357
627
 
358
628
  ### Default paywalls and placements
359
629
 
@@ -370,7 +640,7 @@ iOS product IDs match the App Store Connect format so they align across both sys
370
640
 
371
641
  ## Image Tools
372
642
 
373
- AI-powered image commands. Require a fal.ai API key: `kappmaker config set falApiKey <your-key>`
643
+ AI-powered image commands. A fal.ai API key is prompted on first use if not already configured.
374
644
 
375
645
  ### `image-split <source>`
376
646
 
@@ -529,6 +799,164 @@ Requires: `falApiKey`, `openaiApiKey`, and `imgbbApiKey` (if using reference ima
529
799
 
530
800
  ---
531
801
 
802
+ ## `fastlane configure`
803
+
804
+ Sets up Fastlane in the mobile app directory. Creates `Gemfile`, `fastlane/Fastfile`, and runs `bundle install`.
805
+
806
+ ```bash
807
+ kappmaker fastlane configure
808
+ ```
809
+
810
+ Run from the project root (containing `MobileApp/`) or inside `MobileApp/` directly.
811
+
812
+ **What it creates:**
813
+ - `Gemfile` — Ruby gem dependencies (fastlane)
814
+ - `fastlane/Fastfile` — Build and upload lanes for Android (Play Store) and iOS (App Store)
815
+
816
+ If files already exist, they are skipped (not overwritten).
817
+
818
+ **Prerequisite for:** `kappmaker publish`
819
+
820
+ ---
821
+
822
+ ## `publish`
823
+
824
+ Builds and uploads your app to Google Play and/or App Store using Fastlane.
825
+
826
+ ```bash
827
+ kappmaker publish # Both platforms
828
+ kappmaker publish --platform android # Android only
829
+ kappmaker publish --platform ios # iOS only
830
+ kappmaker publish --platform android --platform ios # Both explicitly
831
+ kappmaker publish --platform android --track internal # Android internal track
832
+ kappmaker publish --upload-metadata --upload-screenshots # With metadata
833
+ ```
834
+
835
+ Run from the project root (containing `MobileApp/`) or inside `MobileApp/` directly. Requires Fastlane via Bundler (`Gemfile` + `fastlane/Fastfile`).
836
+
837
+ **Prerequisites:**
838
+ - **Android:** Google Play service account JSON — see [Google Play Publisher setup](#google-play-publisher--android-store-uploads)
839
+ - **iOS:** App Store Connect API key — see [App Store Publisher setup](#app-store-publisher--ios-store-uploads). The CLI generates the Fastlane-format publisher JSON automatically from your `ascKeyId`/`ascIssuerId`/`ascPrivateKeyPath` config.
840
+
841
+ | Flag | Description | Default |
842
+ |------|-------------|---------|
843
+ | `--platform <name>` | Platform to publish: `android`, `ios` (repeatable) | Both |
844
+ | `--track <name>` | Android Play Store track (internal/alpha/beta/production) | `production` |
845
+ | `--upload-metadata` | Upload metadata (title, description) | `false` |
846
+ | `--upload-screenshots` | Upload screenshots | `false` |
847
+ | `--upload-images` | Upload images — icon, feature graphic (Android only) | `false` |
848
+ | `--submit-for-review` | Submit for review after upload | `true` |
849
+
850
+ ---
851
+
852
+ ## `generate-keystore`
853
+
854
+ Generates an Android signing keystore for Play Store releases. Creates `keystore.jks` and `keystore.properties` with a secure random password.
855
+
856
+ ```bash
857
+ kappmaker generate-keystore --organization "MyCompany"
858
+ kappmaker generate-keystore --first-name "John Doe" --organization "MyCompany"
859
+ kappmaker generate-keystore --output ./custom-keystore-dir
860
+ ```
861
+
862
+ Run from the project root (containing `MobileApp/`) or inside `MobileApp/` directly.
863
+
864
+ **Output** (default: `distribution/android/keystore/` inside MobileApp):
865
+ - `keystore.jks` — the signing keystore
866
+ - `keystore.properties` — password, alias, and store file path
867
+
868
+ At least one of `--first-name` or `--organization` is required.
869
+
870
+ | Flag | Description | Required |
871
+ |------|-------------|----------|
872
+ | `--first-name <name>` | Developer name for keystore | One of these |
873
+ | `--organization <name>` | Organization name for keystore | is required |
874
+ | `--output <dir>` | Output directory for keystore files | No |
875
+
876
+ ---
877
+
878
+ ## `android-release-build`
879
+
880
+ Builds a signed Android release AAB. Automatically generates a keystore if one doesn't exist yet.
881
+
882
+ ```bash
883
+ kappmaker android-release-build
884
+ kappmaker android-release-build --organization "MyCompany"
885
+ kappmaker android-release-build --output ./my-output
886
+ ```
887
+
888
+ Run from the project root (containing `MobileApp/`) or inside `MobileApp/` directly. Requires `gradlew` in the mobile app directory.
889
+
890
+ **What it does:**
891
+ 1. Generates keystore if `distribution/android/keystore/keystore.properties` doesn't exist
892
+ 2. Runs `./gradlew :composeApp:bundleRelease`
893
+ 3. Copies the AAB to the output directory
894
+
895
+ **Output:** `distribution/android/app-release.aab` (or custom `--output` path)
896
+
897
+ | Flag | Description | Default |
898
+ |------|-------------|---------|
899
+ | `--organization <name>` | Organization for keystore generation | From config |
900
+ | `--first-name <name>` | Developer name for keystore generation | Empty |
901
+ | `--output <dir>` | Output directory for AAB | `distribution/android` |
902
+
903
+ ---
904
+
905
+ ## `refactor`
906
+
907
+ Refactors package names, application ID, bundle ID, and app name across the entire project. Implemented in TypeScript — no Gradle build system required.
908
+
909
+ ```bash
910
+ kappmaker refactor --app-id com.example.myapp --app-name MyApp
911
+ kappmaker refactor --app-id com.example.myapp --app-name MyApp --skip-package-rename
912
+ ```
913
+
914
+ Run from the project root (containing `MobileApp/`) or from inside `MobileApp/` directly.
915
+
916
+ **Full refactor (default):**
917
+ 1. Renames Kotlin package names in all source sets (commonMain, androidMain, iosMain, etc.)
918
+ 2. Moves package directories to match the new package structure
919
+ 3. Updates Gradle build files, Firebase configs, iOS project files, and GitHub workflows
920
+ 4. Updates the app display name in manifests, settings, and platform-specific files
921
+
922
+ **Skip-package-rename mode (`--skip-package-rename`):**
923
+ Only updates `applicationId` / bundle ID, Firebase configs, iOS files, GitHub workflows, and app name — keeps Kotlin package directories intact. Useful for creating multiple apps from one codebase without merge conflicts.
924
+
925
+ | Flag | Description | Required |
926
+ |------|-------------|----------|
927
+ | `--app-id <id>` | New applicationId / bundleId (e.g., `com.example.myapp`) | Yes |
928
+ | `--app-name <name>` | New display name (e.g., `MyApp`) | Yes |
929
+ | `--old-app-id <id>` | Current applicationId to replace (default: `com.measify.kappmaker`) | No |
930
+ | `--old-app-name <name>` | Current app name to replace (default: `KAppMakerAllModules`) | No |
931
+ | `--skip-package-rename` | Keep Kotlin package dirs, only update IDs and app name | No |
932
+
933
+ ---
934
+
935
+ ## `update-version`
936
+
937
+ Bumps Android and iOS version codes and optionally sets a new version name. Run from the project root (containing `MobileApp/`) or from inside `MobileApp/` directly.
938
+
939
+ ```bash
940
+ kappmaker update-version # Increment patch: 1.2.3 → 1.2.4, versionCode +1
941
+ kappmaker update-version -v 2.0.0 # Set explicit version name, versionCode +1
942
+ ```
943
+
944
+ **What it updates:**
945
+
946
+ | Platform | File | Fields |
947
+ |----------|------|--------|
948
+ | Android | `composeApp/build.gradle.kts` | `versionCode`, `versionName` |
949
+ | iOS | `iosApp/iosApp.xcodeproj/project.pbxproj` | `CURRENT_PROJECT_VERSION`, `MARKETING_VERSION` |
950
+ | iOS | `iosApp/iosApp/Info.plist` | `CFBundleVersion`, `CFBundleShortVersionString` |
951
+
952
+ If a platform's files are missing, that platform is skipped with a warning.
953
+
954
+ | Flag | Description | Default |
955
+ |------|-------------|---------|
956
+ | `-v, --version <name>` | Set explicit version name (e.g., `2.0.0`) | Auto-increment patch |
957
+
958
+ ---
959
+
532
960
  ## Config Reference
533
961
 
534
962
  Configuration is stored at `~/.config/kappmaker/config.json`.
@@ -561,7 +989,8 @@ kappmaker config adapty-defaults --save ./config.json # Save as global defaul
561
989
  | `ascKeyId` | App Store Connect API Key ID | — |
562
990
  | `ascIssuerId` | App Store Connect Issuer ID | — |
563
991
  | `ascPrivateKeyPath` | Path to `.p8` private key | — |
564
- | `appleId` | Apple ID email (for privacy setup) | — |
992
+ | `appleId` | Apple ID email (for app creation & privacy setup) | — |
993
+ | `googleServiceAccountPath` | Google Play service account JSON — used by both Fastlane publish and `kappmaker gpc` | `~/credentials/google-service-app-publisher.json` |
565
994
 
566
995
  ### Global defaults
567
996
 
@@ -581,15 +1010,23 @@ src/
581
1010
  index.ts # Entry point
582
1011
  cli.ts # Command registration (Commander.js)
583
1012
  commands/
584
- create.ts # Full app setup (13-step orchestrator)
1013
+ create.ts # Full app setup (13-step orchestrator: Firebase + logo + refactor + build + ASC + GPC + Adapty)
585
1014
  create-logo.ts # AI logo generation
586
1015
  create-appstore-app.ts # App Store Connect setup (13-step orchestrator)
1016
+ create-play-app.ts # Google Play Console setup (11-step orchestrator, aliased by `gpc setup`)
1017
+ gpc.ts # kappmaker gpc subcommands (setup, listings, subscriptions, iap, data-safety, app-check)
587
1018
  adapty-setup.ts # Adapty setup (8-step orchestrator)
588
1019
  split.ts # Grid image splitter
589
1020
  remove-bg.ts # Background removal
590
1021
  enhance.ts # Image quality enhancement
591
1022
  translate-screenshots.ts # Screenshot translation
592
1023
  generate-screenshots.ts # AI screenshot generation
1024
+ fastlane-configure.ts # Set up Fastlane (Gemfile + Fastfile + bundle install)
1025
+ publish.ts # Build and upload to Play Store / App Store
1026
+ generate-keystore.ts # Generate Android signing keystore
1027
+ android-release-build.ts # Build signed Android release AAB
1028
+ refactor.ts # Package/app name refactoring
1029
+ update-version.ts # Bump Android + iOS version codes and version name
593
1030
  config.ts # Config management
594
1031
  services/
595
1032
  firebase.service.ts # Firebase CLI wrapper + anonymous auth
@@ -597,14 +1034,22 @@ src/
597
1034
  openai.service.ts # OpenAI API (prompt generation)
598
1035
  asc.service.ts # App Store Connect CLI wrapper
599
1036
  asc-monetization.service.ts # ASC pricing, subscriptions, IAP
1037
+ gpc.service.ts # Google Play Publisher API wrapper (JWT auth, edits, listings, data safety) — no external CLI
1038
+ gpc-monetization.service.ts # Play new monetization API (subscriptions + base plans + onetimeproducts, NOT legacy inappproducts)
1039
+ gpc-data-safety.service.ts # JSON → CSV converter for Play Data Safety form (uses bundled canonical template)
600
1040
  adapty.service.ts # Adapty CLI wrapper
601
1041
  git.service.ts # Git operations
602
- gradle.service.ts # Gradle build operations
1042
+ fastlane-setup.service.ts # Fastlane scaffolding (Gemfile + Fastfile)
1043
+ publish.service.ts # Android/iOS publishing via Fastlane
1044
+ keystore.service.ts # Android keystore generation
1045
+ gradle.service.ts # Gradle build helpers (local.properties, clean & build)
603
1046
  ios.service.ts # CocoaPods setup
604
- fastlane.service.ts # Fastlane build + AAB finder
1047
+ fastlane.service.ts # Android release build (keystore + gradle) + AAB finder
605
1048
  logo.service.ts # Logo prompt builder + image extraction
606
1049
  screenshot.service.ts # Screenshot grid operations + Fastlane output
607
1050
  screenshot-styles.ts # Screenshot style prompts (8 styles)
1051
+ refactor.service.ts # Package/app name refactoring logic
1052
+ version.service.ts # Android + iOS version reading/writing
608
1053
  utils/
609
1054
  logger.ts # Chalk-based logging
610
1055
  exec.ts # Command execution (execa + ora)
@@ -613,9 +1058,12 @@ src/
613
1058
  prompt.ts # Interactive prompts
614
1059
  templates/
615
1060
  appstore-config.json # Default App Store Connect config
1061
+ googleplay-config.json # Default Google Play Console config
1062
+ data-safety-template.json # Canonical Play Data Safety form schema (783 rows, 217 Q IDs)
616
1063
  adapty-config.json # Default Adapty config
617
1064
  types/
618
1065
  index.ts # Shared interfaces
619
1066
  appstore.ts # App Store Connect types
1067
+ googleplay.ts # Google Play Console types
620
1068
  adapty.ts # Adapty types
621
1069
  ```