@daemux/store-automator 0.10.13 → 0.10.15

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.
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "App Store & Google Play automation for Flutter apps",
8
- "version": "0.10.13"
8
+ "version": "0.10.15"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "store-automator",
13
13
  "source": "./plugins/store-automator",
14
14
  "description": "3 agents for app store publishing: reviewer, meta-creator, media-designer",
15
- "version": "0.10.13",
15
+ "version": "0.10.15",
16
16
  "keywords": [
17
17
  "flutter",
18
18
  "app-store",
package/README.md CHANGED
@@ -8,7 +8,7 @@ This package installs three Claude Code agents and a complete CI/CD template sui
8
8
 
9
9
  - **appstore-reviewer** -- Reviews metadata, screenshots, and tests compliance with Apple App Store and Google Play guidelines
10
10
  - **appstore-meta-creator** -- Creates all store metadata texts (names, descriptions, keywords) for all available languages
11
- - **app-designer** -- Designs complete app UI, creates ASO-optimized store screenshots, and designs marketing web pages all in Stitch MCP
11
+ - **app-designer** -- Designs complete app UI, creates ASO-optimized store screenshots, and designs marketing web pages -- all in Stitch MCP
12
12
 
13
13
  Plus CI/CD templates for GitHub Actions, Fastlane, web pages, and scripts.
14
14
 
@@ -25,21 +25,31 @@ cd your-flutter-project
25
25
  npm install @daemux/store-automator@latest
26
26
  ```
27
27
 
28
- The postinstall script will:
28
+ The postinstall script runs an interactive setup with five sections:
29
29
 
30
- 1. Prompt for bundle ID and MCP server tokens (Stitch, Cloudflare)
31
- 2. Configure `.mcp.json` with MCP servers (Playwright, mobile-mcp, Stitch, Cloudflare)
32
- 3. Install the plugin marketplace and register agents
33
- 4. Copy `CLAUDE.md` template to `.claude/CLAUDE.md`
34
- 5. Copy CI/CD templates (Fastlane, scripts, web pages, ci.config.yaml)
35
- 6. Configure `.claude/settings.json` with required env vars
30
+ 1. **App Identity** -- App name, bundle ID, package name, SKU, Apple ID
31
+ 2. **Credentials** -- Guided steps for App Store Connect API key, Google Play service account, Android keystore, and Match code signing
32
+ 3. **Store Settings** -- iOS categories/pricing, Android track/rollout, metadata languages
33
+ 4. **Web Settings** -- Domain, colors, company info, legal jurisdiction
34
+ 5. **MCP Tokens** -- Stitch and Cloudflare API keys (optional, press Enter to skip)
35
+
36
+ All values are written to `ci.config.yaml`. The installer also:
37
+
38
+ - Configures `.mcp.json` with MCP servers (Playwright, mobile-mcp, Stitch, Cloudflare)
39
+ - Installs `.claude/CLAUDE.md` with your app name and agent configurations
40
+ - Copies CI/CD templates (Fastlane, scripts, web pages, GitHub Actions)
41
+ - Configures `.claude/settings.json` with required env vars
42
+ - Runs post-install guides for GitHub repo setup, secrets, and Firebase
43
+
44
+ Re-running the installer reads existing `ci.config.yaml` values as defaults, so you can update individual fields without re-entering everything.
36
45
 
37
46
  ## After Installation
38
47
 
39
- 1. Fill `ci.config.yaml` with your app details (bundle ID, credentials paths, etc.)
40
- 2. Add credential files:
48
+ 1. Add any credential files not configured during the guided setup:
41
49
  - `creds/AuthKey.p8` -- Apple App Store Connect API key
42
50
  - `creds/play-service-account.json` -- Google Play service account
51
+ - `creds/upload-keystore.jks` -- Android upload keystore
52
+ 2. Verify `ci.config.yaml` has all required values filled in
43
53
  3. Start Claude Code and use the agents
44
54
 
45
55
  ## Manual Setup
@@ -50,6 +60,186 @@ If postinstall was skipped (CI environment), run manually:
50
60
  npx store-automator
51
61
  ```
52
62
 
63
+ ## CLI Reference
64
+
65
+ ### General Options
66
+
67
+ | Flag | Description |
68
+ |------|-------------|
69
+ | `-g`, `--global` | Install globally (~/.claude) instead of project scope |
70
+ | `-u`, `--uninstall` | Uninstall plugin and remove files |
71
+ | `--postinstall` | Run as postinstall hook (auto-detected) |
72
+ | `-v`, `--version` | Show version number |
73
+ | `-h`, `--help` | Show help |
74
+
75
+ ### App Identity
76
+
77
+ | Flag | Description |
78
+ |------|-------------|
79
+ | `--app-name=NAME` | App display name |
80
+ | `--bundle-id=ID` | Bundle ID / Package Name (e.g., com.company.app) |
81
+ | `--sku=SKU` | App Store Connect SKU |
82
+ | `--apple-id=EMAIL` | Apple Developer Account email |
83
+
84
+ ### Credentials
85
+
86
+ | Flag | Description |
87
+ |------|-------------|
88
+ | `--key-id=ID` | App Store Connect Key ID |
89
+ | `--issuer-id=ID` | App Store Connect Issuer ID |
90
+ | `--keystore-password=PASS` | Android keystore password |
91
+ | `--match-deploy-key-path=PATH` | Path to Match deploy key |
92
+ | `--match-git-url=URL` | Match certificates Git URL (SSH) |
93
+
94
+ ### iOS Store Settings
95
+
96
+ | Flag | Description |
97
+ |------|-------------|
98
+ | `--primary-category=CAT` | Primary category (e.g., UTILITIES) |
99
+ | `--secondary-category=CAT` | Secondary category (e.g., PRODUCTIVITY) |
100
+ | `--price-tier=N` | Price tier (0 = free) |
101
+ | `--submit-for-review=BOOL` | Auto-submit for review (true/false) |
102
+ | `--automatic-release=BOOL` | Auto-release after approval (true/false) |
103
+
104
+ ### Android Store Settings
105
+
106
+ | Flag | Description |
107
+ |------|-------------|
108
+ | `--track=TRACK` | Release track (internal/alpha/beta/production) |
109
+ | `--rollout-fraction=N` | Rollout fraction (0.0-1.0) |
110
+ | `--in-app-update-priority=N` | In-app update priority (0-5) |
111
+
112
+ ### Web Settings
113
+
114
+ | Flag | Description |
115
+ |------|-------------|
116
+ | `--domain=DOMAIN` | Web domain (e.g., myapp-pages.pages.dev) |
117
+ | `--cf-project-name=NAME` | Cloudflare Pages project name |
118
+ | `--tagline=TEXT` | App tagline |
119
+ | `--primary-color=HEX` | Primary color (e.g., #2563EB) |
120
+ | `--secondary-color=HEX` | Secondary color (e.g., #7C3AED) |
121
+ | `--company-name=NAME` | Company name |
122
+ | `--contact-email=EMAIL` | Contact email |
123
+ | `--support-email=EMAIL` | Support email |
124
+ | `--jurisdiction=TEXT` | Legal jurisdiction (e.g., Delaware, USA) |
125
+
126
+ ### Languages
127
+
128
+ | Flag | Description |
129
+ |------|-------------|
130
+ | `--languages=LANGS` | Comma-separated language codes (e.g., en-US,de-DE,ja) |
131
+
132
+ ### MCP Tokens
133
+
134
+ | Flag | Description |
135
+ |------|-------------|
136
+ | `--stitch-key=KEY` | Stitch MCP API key |
137
+ | `--cloudflare-token=TOKEN` | Cloudflare API token |
138
+ | `--cloudflare-account-id=ID` | Cloudflare account ID |
139
+
140
+ ### GitHub Actions CI
141
+
142
+ | Flag | Description |
143
+ |------|-------------|
144
+ | `--github-actions` | GitHub Actions CI mode (requires --bundle-id, --match-deploy-key, --match-git-url) |
145
+ | `--match-deploy-key=PATH` | Path to Match deploy key file |
146
+ | `--match-git-url=URL` | Git URL for Match certificates repo (SSH) |
147
+
148
+ ## Full Non-Interactive Example
149
+
150
+ Pass all flags to skip every interactive prompt:
151
+
152
+ ```bash
153
+ npx @daemux/store-automator \
154
+ --app-name="My Amazing App" \
155
+ --bundle-id=com.mycompany.amazingapp \
156
+ --sku=MY_AMAZING_APP \
157
+ --apple-id=developer@mycompany.com \
158
+ --key-id=ABC123DEF4 \
159
+ --issuer-id=12345678-1234-1234-1234-123456789012 \
160
+ --keystore-password=my-secure-password \
161
+ --match-deploy-key-path=creds/match_deploy_key \
162
+ --match-git-url=git@github.com:mycompany/certificates.git \
163
+ --primary-category=UTILITIES \
164
+ --secondary-category=PRODUCTIVITY \
165
+ --price-tier=0 \
166
+ --submit-for-review=true \
167
+ --automatic-release=true \
168
+ --track=internal \
169
+ --rollout-fraction=1.0 \
170
+ --in-app-update-priority=3 \
171
+ --domain=amazingapp-pages.pages.dev \
172
+ --cf-project-name=amazingapp-pages \
173
+ --tagline="The best utility app ever" \
174
+ --primary-color="#2563EB" \
175
+ --secondary-color="#7C3AED" \
176
+ --company-name="My Company LLC" \
177
+ --contact-email=hello@mycompany.com \
178
+ --support-email=support@mycompany.com \
179
+ --jurisdiction="Delaware, USA" \
180
+ --languages=en-US,de-DE,ja \
181
+ --stitch-key=sk-stitch-xxx \
182
+ --cloudflare-token=cf-token-xxx \
183
+ --cloudflare-account-id=abc123def456
184
+ ```
185
+
186
+ ## ci.config.yaml Reference
187
+
188
+ The installer writes all configuration to `ci.config.yaml`. Below is the full structure with the corresponding CLI flag for each field.
189
+
190
+ ```yaml
191
+ flutter_root: "." # Subdirectory if Flutter project is not at repo root
192
+
193
+ credentials:
194
+ apple:
195
+ p8_key_path: creds/AuthKey.p8 # Path to AuthKey .p8 file (manual)
196
+ key_id: "" # --key-id
197
+ issuer_id: "" # --issuer-id
198
+ google:
199
+ service_account_json_path: creds/play-service-account.json # Manual
200
+ android:
201
+ keystore_password: "" # --keystore-password
202
+ match:
203
+ deploy_key_path: "" # --match-deploy-key-path
204
+ git_url: "" # --match-git-url
205
+
206
+ app:
207
+ name: "" # --app-name
208
+ bundle_id: "" # --bundle-id
209
+ package_name: "" # --bundle-id (same value)
210
+ sku: "" # --sku
211
+ apple_id: "" # --apple-id
212
+
213
+ ios:
214
+ primary_category: "UTILITIES" # --primary-category
215
+ secondary_category: "PRODUCTIVITY" # --secondary-category
216
+ price_tier: 0 # --price-tier
217
+ submit_for_review: true # --submit-for-review
218
+ automatic_release: true # --automatic-release
219
+
220
+ android:
221
+ track: "internal" # --track
222
+ rollout_fraction: "1.0" # --rollout-fraction
223
+ in_app_update_priority: 3 # --in-app-update-priority
224
+
225
+ metadata:
226
+ languages: # --languages (comma-separated)
227
+ - en-US
228
+
229
+ web:
230
+ domain: "" # --domain
231
+ cloudflare_project_name: "" # --cf-project-name
232
+ tagline: "" # --tagline
233
+ primary_color: "#2563EB" # --primary-color
234
+ secondary_color: "#7C3AED" # --secondary-color
235
+ company_name: "" # --company-name
236
+ contact_email: "" # --contact-email
237
+ support_email: "" # --support-email
238
+ jurisdiction: "" # --jurisdiction
239
+ app_store_url: "" # Filled after first iOS publish
240
+ google_play_url: "" # Filled after first Android publish
241
+ ```
242
+
53
243
  ## Usage
54
244
 
55
245
  ### Global Install
@@ -94,8 +284,8 @@ The package installs these templates to your project:
94
284
 
95
285
  ## Workflow
96
286
 
97
- 1. Install the package
98
- 2. Fill `ci.config.yaml`
287
+ 1. Install the package (interactive setup fills `ci.config.yaml`)
288
+ 2. Add any remaining credential files
99
289
  3. Use `app-designer` to design app UI + create screenshots + design web page
100
290
  4. Use `appstore-meta-creator` to generate metadata
101
291
  5. Use `appstore-reviewer` to verify compliance
@@ -112,40 +302,15 @@ The package configures these MCP servers in `.mcp.json`:
112
302
  | stitch | AI design tool for screenshot generation | `STITCH_API_KEY` |
113
303
  | cloudflare | Cloudflare Pages deployment | `CLOUDFLARE_API_TOKEN` + Account ID |
114
304
 
115
- ## Non-interactive Install
305
+ ## Idempotency
116
306
 
117
- For CI/CD environments or scripted setups, pass tokens as CLI flags to skip interactive prompts:
307
+ The installer is idempotent. Re-running it reads existing values from `ci.config.yaml` as defaults for each prompt. This means you can:
118
308
 
119
- ```bash
120
- npx @daemux/store-automator \
121
- --bundle-id=com.company.app \
122
- --stitch-key=YOUR_STITCH_KEY \
123
- --cloudflare-token=YOUR_CF_TOKEN \
124
- --cloudflare-account-id=YOUR_CF_ACCOUNT_ID
125
- ```
309
+ - Update a single field by re-running and pressing Enter through unchanged fields
310
+ - Add credentials you skipped during the first run
311
+ - Change store settings without losing other configuration
126
312
 
127
- Any tokens provided via flags will skip the corresponding interactive prompt. If all three tokens are provided, the entire interactive session is skipped. The bundle ID, if provided, is automatically written to `bundle_id` and `package_name` in `ci.config.yaml`.
128
-
129
- ## CLI Options
130
-
131
- ```
132
- Usage: npx @daemux/store-automator [options]
133
-
134
- Options:
135
- -g, --global Install globally (~/.claude) instead of project scope
136
- -u, --uninstall Uninstall plugin and remove files
137
- --postinstall Run as postinstall hook (auto-detected)
138
- -v, --version Show version number
139
- -h, --help Show help
140
-
141
- App Configuration:
142
- --bundle-id=ID Bundle ID / Package Name (e.g., com.company.app)
143
-
144
- MCP Token Flags (skip interactive prompts):
145
- --stitch-key=KEY Stitch MCP API key
146
- --cloudflare-token=TOKEN Cloudflare API token
147
- --cloudflare-account-id=ID Cloudflare account ID
148
- ```
313
+ CLI flags override both the existing config and the interactive prompt for that field.
149
314
 
150
315
  ## License
151
316
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daemux/store-automator",
3
- "version": "0.10.13",
3
+ "version": "0.10.15",
4
4
  "description": "Full App Store & Google Play automation for Flutter apps with Claude Code agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "store-automator",
3
- "version": "0.10.13",
3
+ "version": "0.10.15",
4
4
  "description": "App Store & Google Play automation agents for Flutter app publishing",
5
5
  "author": {
6
6
  "name": "Daemux"
@@ -63,24 +63,26 @@ if [ $FASTLANE_EXIT -ne 0 ]; then
63
63
  echo "::warning title=Google Play Draft App::First manual release required. See job summary for instructions."
64
64
  if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then
65
65
  cat >> "$GITHUB_STEP_SUMMARY" << 'SUMMARY'
66
- ## :warning: Google Play Draft App - Manual Action Required
67
-
68
- Metadata upload could not be committed because the app is still in **draft state** on Google Play.
69
-
70
- ### How to fix:
71
-
72
- 1. Go to [Google Play Console](https://play.google.com/console)
73
- 2. Select your app
74
- 3. Navigate to **Release > Production** (or **Internal testing**)
75
- 4. Click **Create new release**
76
- 5. The AAB was already uploaded by CI -- select it
77
- 6. Fill in release notes
78
- 7. Complete **Store listing** (description, screenshots -- already uploaded by CI)
79
- 8. Complete **Content rating** questionnaire
80
- 9. Complete **Pricing & distribution** settings
81
- 10. Click **Review release** then **Start rollout**
82
-
83
- > After the first manual release, all subsequent CI metadata uploads will commit successfully without this error.
66
+ ## :warning: Google Play Draft App — First-Time Setup Required
67
+
68
+ Metadata and screenshots were uploaded by CI but **could not be saved** because the app hasn't completed its initial setup on Google Play Console. This is a [Google Play API limitation](https://developers.google.com/android-publisher/edits) — all API edits are rejected until the first manual release.
69
+
70
+ ### One-time setup steps:
71
+
72
+ 1. Go to [Google Play Console](https://play.google.com/console) → Select your app
73
+ 2. **Dashboard** Complete all required setup tasks shown in the checklist
74
+ 3. **Store listing** Create your default store listing (title, description, screenshots)
75
+ - *Note: CI uploaded this data but it was discarded. After completing setup, re-run CI to auto-upload.*
76
+ 4. **Content rating** Complete the content rating questionnaire
77
+ 5. **App pricing** Set pricing and distribution countries
78
+ 6. **Release** Go to **Testing Internal testing** (or **Production**)
79
+ - Click **Create new release**
80
+ - The AAB was already uploaded by CI — select it
81
+ - Add release notes
82
+ - Click **Review release** → **Start rollout**
83
+
84
+ ### After first release:
85
+ All subsequent CI runs will automatically upload metadata, screenshots, and new builds without manual intervention. Re-trigger the CI workflow after completing the steps above.
84
86
  SUMMARY
85
87
  fi
86
88
  ci_skip "App is in draft status — manual first release required on Google Play Console"