@daemux/store-automator 0.10.17 → 0.10.19
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.
- package/.claude-plugin/marketplace.json +2 -2
- package/README.md +2 -2
- package/bin/cli.mjs +1 -1
- package/package.json +1 -1
- package/plugins/store-automator/.claude-plugin/plugin.json +1 -1
- package/plugins/store-automator/agents/appstore-meta-creator.md +48 -1
- package/plugins/store-automator/agents/devops.md +5 -5
- package/templates/CLAUDE.md.template +4 -1
- package/templates/ci.config.yaml.template +1 -1
- package/templates/fastlane/data_safety.csv.example +105 -0
- package/templates/web/deploy-cloudflare.mjs +1 -1
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "App Store & Google Play automation for Flutter apps",
|
|
8
|
-
"version": "0.10.
|
|
8
|
+
"version": "0.10.19"
|
|
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.
|
|
15
|
+
"version": "0.10.19",
|
|
16
16
|
"keywords": [
|
|
17
17
|
"flutter",
|
|
18
18
|
"app-store",
|
package/README.md
CHANGED
|
@@ -113,7 +113,7 @@ npx store-automator
|
|
|
113
113
|
|
|
114
114
|
| Flag | Description |
|
|
115
115
|
|------|-------------|
|
|
116
|
-
| `--domain=DOMAIN` | Web domain (e.g., myapp-pages.
|
|
116
|
+
| `--domain=DOMAIN` | Web domain (e.g., myapp-pages.workers.dev) |
|
|
117
117
|
| `--cf-project-name=NAME` | Cloudflare Pages project name |
|
|
118
118
|
| `--tagline=TEXT` | App tagline |
|
|
119
119
|
| `--primary-color=HEX` | Primary color (e.g., #2563EB) |
|
|
@@ -168,7 +168,7 @@ npx @daemux/store-automator \
|
|
|
168
168
|
--track=internal \
|
|
169
169
|
--rollout-fraction=1.0 \
|
|
170
170
|
--in-app-update-priority=3 \
|
|
171
|
-
--domain=amazingapp-pages.
|
|
171
|
+
--domain=amazingapp-pages.workers.dev \
|
|
172
172
|
--cf-project-name=amazingapp-pages \
|
|
173
173
|
--tagline="The best utility app ever" \
|
|
174
174
|
--primary-color="#2563EB" \
|
package/bin/cli.mjs
CHANGED
|
@@ -111,7 +111,7 @@ Android Store Settings:
|
|
|
111
111
|
--in-app-update-priority=N In-app update priority (0-5)
|
|
112
112
|
|
|
113
113
|
Web Settings:
|
|
114
|
-
--domain=DOMAIN Web domain (e.g., myapp-pages.
|
|
114
|
+
--domain=DOMAIN Web domain (e.g., myapp-pages.workers.dev)
|
|
115
115
|
--cf-project-name=NAME Cloudflare Pages project name
|
|
116
116
|
--tagline=TEXT App tagline
|
|
117
117
|
--primary-color=HEX Primary color (e.g., #2563EB)
|
package/package.json
CHANGED
|
@@ -14,7 +14,8 @@ You are a senior ASO (App Store Optimization) specialist and localization expert
|
|
|
14
14
|
4. TRANSLATE to all other configured languages using parallel sub-agents
|
|
15
15
|
5. SAVE all files to fastlane/metadata/ in the correct directory structure
|
|
16
16
|
6. GENERATE fastlane/app_rating_config.json based on app content analysis
|
|
17
|
-
7.
|
|
17
|
+
7. GENERATE fastlane/data_safety.csv based on app data collection analysis
|
|
18
|
+
8. Verify character limits are respected in every language
|
|
18
19
|
|
|
19
20
|
## Files You Create
|
|
20
21
|
|
|
@@ -80,6 +81,47 @@ Analyze the app's content (screens, features, user interactions) and generate a
|
|
|
80
81
|
|
|
81
82
|
Apple string values: "NONE", "INFREQUENT_MILD", "FREQUENT_INTENSE". Google string values: "NO", "MILD", "MODERATE", "STRONG".
|
|
82
83
|
|
|
84
|
+
### Data Safety Config (fastlane/data_safety.csv)
|
|
85
|
+
|
|
86
|
+
Analyze the app's data collection practices (authentication, messaging, payments, analytics, crash reporting, etc.) and generate a CSV declaring what data is collected, shared, its purpose, and security practices.
|
|
87
|
+
|
|
88
|
+
**Format:** Two columns -- `question_id` and `response`. Each row maps a question identifier to `true`, `false`, or empty (for optional URL fields). The file is parsed by `scripts/update_data_safety.py` and uploaded via the Google Play Developer API.
|
|
89
|
+
|
|
90
|
+
**Sections to cover:**
|
|
91
|
+
|
|
92
|
+
| Section Prefix | Description |
|
|
93
|
+
|---------------|-------------|
|
|
94
|
+
| `DATA_COLLECTED` | Top-level flag, then `DATA_COLLECTED_{CATEGORY}` and `DATA_COLLECTED_{CATEGORY}_{TYPE}` for each data type collected |
|
|
95
|
+
| `DATA_SHARED` | Top-level flag, then `DATA_SHARED_{CATEGORY}` for each category -- set `false` if data is not shared with third parties |
|
|
96
|
+
| `DATA_USAGE_{TYPE}_COLLECTION_PURPOSE_{PURPOSE}` | Purpose of collection per data type (APP_FUNCTIONALITY, ANALYTICS, ACCOUNT_MANAGEMENT, ADVERTISING, FRAUD_PREVENTION, PERSONALIZATION, DEVELOPER_COMMUNICATIONS) |
|
|
97
|
+
| `SECURITY_PRACTICES_DATA_ENCRYPTED_IN_TRANSIT` | Whether all data is encrypted in transit |
|
|
98
|
+
| `SECURITY_PRACTICES_DATA_DELETION_REQUEST` | Whether users can request data deletion |
|
|
99
|
+
| `SECURITY_PRACTICES_DATA_DELETION_REQUEST_URL` | URL for deletion requests (leave response empty if not applicable) |
|
|
100
|
+
|
|
101
|
+
**Data type categories:** PERSONAL_INFO (NAME, EMAIL, ADDRESS, PHONE), FINANCIAL_INFO (PURCHASE_HISTORY, CREDIT_INFO), LOCATION (APPROXIMATE, PRECISE), MESSAGES (EMAILS, SMS, OTHER_MESSAGES), PHOTOS_AND_VIDEOS, AUDIO, FILES_AND_DOCS, CALENDAR, CONTACTS, APP_ACTIVITY (APP_INTERACTIONS, IN_APP_SEARCH_HISTORY, INSTALLED_APPS, OTHER_USER_GENERATED_CONTENT, OTHER_ACTIONS), APP_INFO_AND_PERFORMANCE (CRASH_LOGS, DIAGNOSTICS, OTHER), DEVICE_OR_OTHER_IDS, HEALTH_AND_FITNESS, WEB_BROWSING.
|
|
102
|
+
|
|
103
|
+
**Analysis checklist:**
|
|
104
|
+
1. Authentication method -- what personal info is collected (email, name, phone)
|
|
105
|
+
2. Core features -- what user content is generated (messages, photos, files)
|
|
106
|
+
3. Payments/subscriptions -- purchase history, financial info
|
|
107
|
+
4. Analytics SDKs (Firebase Analytics, etc.) -- app interactions, device IDs
|
|
108
|
+
5. Crash reporting (Crashlytics, Sentry, etc.) -- crash logs, diagnostics
|
|
109
|
+
6. Location services -- approximate or precise location
|
|
110
|
+
7. Third-party sharing -- is any collected data shared externally
|
|
111
|
+
8. Security -- encryption in transit, data deletion capability
|
|
112
|
+
|
|
113
|
+
```csv
|
|
114
|
+
question_id,response
|
|
115
|
+
DATA_COLLECTED,true
|
|
116
|
+
DATA_COLLECTED_PERSONAL_INFO,true
|
|
117
|
+
DATA_COLLECTED_PERSONAL_INFO_EMAIL,true
|
|
118
|
+
DATA_SHARED,false
|
|
119
|
+
DATA_SHARED_PERSONAL_INFO,false
|
|
120
|
+
DATA_USAGE_PERSONAL_INFO_EMAIL_COLLECTION_PURPOSE_ACCOUNT_MANAGEMENT,true
|
|
121
|
+
SECURITY_PRACTICES_DATA_ENCRYPTED_IN_TRANSIT,true
|
|
122
|
+
SECURITY_PRACTICES_DATA_DELETION_REQUEST,true
|
|
123
|
+
```
|
|
124
|
+
|
|
83
125
|
## Apple ASO Guidelines
|
|
84
126
|
|
|
85
127
|
### Name (name.txt)
|
|
@@ -182,6 +224,7 @@ af, am, ar, hy-AM, az-AZ, eu-ES, be, bn-BD, bg, my-MM, ca, zh-HK, zh-CN, zh-TW,
|
|
|
182
224
|
```
|
|
183
225
|
fastlane/
|
|
184
226
|
app_rating_config.json
|
|
227
|
+
data_safety.csv
|
|
185
228
|
metadata/
|
|
186
229
|
ios/
|
|
187
230
|
copyright.txt
|
|
@@ -218,6 +261,10 @@ fastlane/
|
|
|
218
261
|
- copyright.txt has current year
|
|
219
262
|
- Release notes are specific to the actual version changes
|
|
220
263
|
- app_rating_config.json exists with all categories populated (no null values)
|
|
264
|
+
- data_safety.csv exists with header `question_id,response` and covers all collected data types
|
|
265
|
+
- data_safety.csv has matching DATA_SHARED entries for every DATA_COLLECTED category
|
|
266
|
+
- data_safety.csv has DATA_USAGE purpose entries for every collected data type
|
|
267
|
+
- data_safety.csv includes SECURITY_PRACTICES entries for encryption and deletion
|
|
221
268
|
|
|
222
269
|
## Output Footer
|
|
223
270
|
|
|
@@ -220,10 +220,10 @@ Set via environment variables or `.mcp.json`:
|
|
|
220
220
|
After deployment:
|
|
221
221
|
1. Check the output URL is accessible
|
|
222
222
|
2. Verify each page loads correctly:
|
|
223
|
-
- `https://<project>.
|
|
224
|
-
- `https://<project>.
|
|
225
|
-
- `https://<project>.
|
|
226
|
-
- `https://<project>.
|
|
223
|
+
- `https://<project>.workers.dev/marketing.html`
|
|
224
|
+
- `https://<project>.workers.dev/privacy.html`
|
|
225
|
+
- `https://<project>.workers.dev/terms.html`
|
|
226
|
+
- `https://<project>.workers.dev/support.html`
|
|
227
227
|
3. Confirm template variables were replaced (no `${VAR}` in output)
|
|
228
228
|
4. Update store metadata URLs if this is the first deployment:
|
|
229
229
|
- `fastlane/metadata/ios/{locale}/privacy_url.txt`
|
|
@@ -237,7 +237,7 @@ OPERATION: Deploy Cloudflare Pages
|
|
|
237
237
|
PROJECT: [cloudflare-project-name]
|
|
238
238
|
RESULT: Success | Failed
|
|
239
239
|
URL: [deployment-url]
|
|
240
|
-
PRODUCTION: https://[project].
|
|
240
|
+
PRODUCTION: https://[project].workers.dev
|
|
241
241
|
|
|
242
242
|
Pages deployed:
|
|
243
243
|
- [page]: [status]
|
|
@@ -49,6 +49,9 @@ name.txt, subtitle.txt, description.txt, keywords.txt, promotional_text.txt, rel
|
|
|
49
49
|
**Android** (fastlane/metadata/android/{locale}/):
|
|
50
50
|
title.txt, short_description.txt, full_description.txt, changelogs/default.txt
|
|
51
51
|
|
|
52
|
+
### fastlane/data_safety.csv
|
|
53
|
+
Google Play Data Safety declarations in `question_id,response` CSV format. Declares what data the app collects, shares, its purpose, and security practices. Generated by the appstore-meta-creator agent and uploaded via `scripts/update_data_safety.py`. See `templates/fastlane/data_safety.csv.example` for format reference.
|
|
54
|
+
|
|
52
55
|
### fastlane/iap_config.json
|
|
53
56
|
IAP and subscription configuration. Durations: ONE_WEEK to ONE_YEAR. Intro offers: FREE, PAY_AS_YOU_GO, PAY_UP_FRONT.
|
|
54
57
|
|
|
@@ -257,7 +260,7 @@ Implement Flutter app matching designs. Set up Firebase. Fill ci.config.yaml. Ad
|
|
|
257
260
|
appstore-meta-creator generates texts. Fill fastlane/iap_config.json if needed.
|
|
258
261
|
|
|
259
262
|
### Phase 4: Web Pages + Deployment
|
|
260
|
-
app-designer designs marketing page in Stitch MCP. Develop web pages. Deploy via Cloudflare Pages (*.
|
|
263
|
+
app-designer designs marketing page in Stitch MCP. Develop web pages. Deploy via Cloudflare Pages (*.workers.dev domain sufficient).
|
|
261
264
|
|
|
262
265
|
### Phase 5: Finalize and CI/CD
|
|
263
266
|
Create .gitignore (.claude/.tasks/, Flutter ignores; do NOT ignore *.g.dart). Push to private repo. GitHub Actions auto-triggers on push.
|
|
@@ -45,7 +45,7 @@ metadata:
|
|
|
45
45
|
|
|
46
46
|
# === WEB PAGES ===
|
|
47
47
|
web:
|
|
48
|
-
domain: "yourapp-pages.
|
|
48
|
+
domain: "yourapp-pages.workers.dev" # *.workers.dev domain is sufficient, no custom DNS needed
|
|
49
49
|
cloudflare_project_name: "yourapp-pages"
|
|
50
50
|
tagline: "Your app tagline here"
|
|
51
51
|
primary_color: "#2563EB"
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Google Play Data Safety CSV
|
|
2
|
+
#
|
|
3
|
+
# This file declares your app's data collection and sharing practices for
|
|
4
|
+
# the Google Play Data Safety section. It is read by scripts/update_data_safety.py
|
|
5
|
+
# and uploaded via the Google Play Developer API.
|
|
6
|
+
#
|
|
7
|
+
# FORMAT:
|
|
8
|
+
# question_id,response
|
|
9
|
+
#
|
|
10
|
+
# Each row maps a question identifier to a response value.
|
|
11
|
+
# Responses are typically "true" or "false". Leave the response empty
|
|
12
|
+
# for optional fields that do not apply (e.g., a URL field).
|
|
13
|
+
#
|
|
14
|
+
# SECTIONS:
|
|
15
|
+
# DATA_COLLECTED_* -- Which data types the app collects
|
|
16
|
+
# DATA_SHARED_* -- Which data types are shared with third parties
|
|
17
|
+
# DATA_USAGE_* -- Purpose of collection for each data type
|
|
18
|
+
# SECURITY_PRACTICES_* -- Encryption, deletion, and other security measures
|
|
19
|
+
#
|
|
20
|
+
# DATA TYPE CATEGORIES (append to DATA_COLLECTED_ or DATA_SHARED_):
|
|
21
|
+
# PERSONAL_INFO -- Name, email, address, phone, etc.
|
|
22
|
+
# PERSONAL_INFO_NAME
|
|
23
|
+
# PERSONAL_INFO_EMAIL
|
|
24
|
+
# PERSONAL_INFO_ADDRESS
|
|
25
|
+
# PERSONAL_INFO_PHONE
|
|
26
|
+
# FINANCIAL_INFO -- Payment info, purchase history, etc.
|
|
27
|
+
# FINANCIAL_INFO_PURCHASE_HISTORY
|
|
28
|
+
# FINANCIAL_INFO_CREDIT_INFO
|
|
29
|
+
# LOCATION -- Approximate or precise location
|
|
30
|
+
# LOCATION_APPROXIMATE
|
|
31
|
+
# LOCATION_PRECISE
|
|
32
|
+
# WEB_BROWSING -- Web browsing history
|
|
33
|
+
# MESSAGES -- Emails, SMS, other messages
|
|
34
|
+
# MESSAGES_EMAILS
|
|
35
|
+
# MESSAGES_SMS
|
|
36
|
+
# MESSAGES_OTHER_MESSAGES
|
|
37
|
+
# PHOTOS_AND_VIDEOS -- Photos or videos
|
|
38
|
+
# AUDIO -- Voice/sound recordings
|
|
39
|
+
# FILES_AND_DOCS -- Files and documents
|
|
40
|
+
# CALENDAR -- Calendar events
|
|
41
|
+
# CONTACTS -- Contact list
|
|
42
|
+
# APP_ACTIVITY -- App interactions, search history, etc.
|
|
43
|
+
# APP_ACTIVITY_APP_INTERACTIONS
|
|
44
|
+
# APP_ACTIVITY_IN_APP_SEARCH_HISTORY
|
|
45
|
+
# APP_ACTIVITY_INSTALLED_APPS
|
|
46
|
+
# APP_ACTIVITY_OTHER_USER_GENERATED_CONTENT
|
|
47
|
+
# APP_ACTIVITY_OTHER_ACTIONS
|
|
48
|
+
# APP_INFO_AND_PERFORMANCE -- Crash logs, diagnostics, other performance data
|
|
49
|
+
# APP_INFO_AND_PERFORMANCE_CRASH_LOGS
|
|
50
|
+
# APP_INFO_AND_PERFORMANCE_DIAGNOSTICS
|
|
51
|
+
# APP_INFO_AND_PERFORMANCE_OTHER
|
|
52
|
+
# DEVICE_OR_OTHER_IDS -- Device or other identifiers
|
|
53
|
+
# HEALTH_AND_FITNESS -- Health and fitness data
|
|
54
|
+
#
|
|
55
|
+
# COLLECTION PURPOSE SUFFIXES (append to DATA_USAGE_{TYPE}_COLLECTION_PURPOSE_):
|
|
56
|
+
# APP_FUNCTIONALITY
|
|
57
|
+
# ANALYTICS
|
|
58
|
+
# DEVELOPER_COMMUNICATIONS
|
|
59
|
+
# ADVERTISING
|
|
60
|
+
# FRAUD_PREVENTION
|
|
61
|
+
# PERSONALIZATION
|
|
62
|
+
# ACCOUNT_MANAGEMENT
|
|
63
|
+
#
|
|
64
|
+
# SECURITY PRACTICES:
|
|
65
|
+
# SECURITY_PRACTICES_DATA_ENCRYPTED_IN_TRANSIT -- All data encrypted in transit
|
|
66
|
+
# SECURITY_PRACTICES_DATA_DELETION_REQUEST -- Users can request data deletion
|
|
67
|
+
# SECURITY_PRACTICES_DATA_DELETION_REQUEST_URL -- URL for deletion requests (optional)
|
|
68
|
+
#
|
|
69
|
+
# EXAMPLE: A chat app with Firebase Auth, messaging, purchases, analytics, and crashlytics
|
|
70
|
+
#
|
|
71
|
+
question_id,response
|
|
72
|
+
DATA_COLLECTED,true
|
|
73
|
+
DATA_COLLECTED_PERSONAL_INFO,true
|
|
74
|
+
DATA_COLLECTED_PERSONAL_INFO_NAME,true
|
|
75
|
+
DATA_COLLECTED_PERSONAL_INFO_EMAIL,true
|
|
76
|
+
DATA_COLLECTED_FINANCIAL_INFO,true
|
|
77
|
+
DATA_COLLECTED_FINANCIAL_INFO_PURCHASE_HISTORY,true
|
|
78
|
+
DATA_COLLECTED_MESSAGES,true
|
|
79
|
+
DATA_COLLECTED_MESSAGES_OTHER_MESSAGES,true
|
|
80
|
+
DATA_COLLECTED_APP_ACTIVITY,true
|
|
81
|
+
DATA_COLLECTED_APP_ACTIVITY_APP_INTERACTIONS,true
|
|
82
|
+
DATA_COLLECTED_APP_INFO_AND_PERFORMANCE,true
|
|
83
|
+
DATA_COLLECTED_APP_INFO_AND_PERFORMANCE_CRASH_LOGS,true
|
|
84
|
+
DATA_COLLECTED_APP_INFO_AND_PERFORMANCE_DIAGNOSTICS,true
|
|
85
|
+
DATA_COLLECTED_DEVICE_OR_OTHER_IDS,true
|
|
86
|
+
DATA_SHARED,false
|
|
87
|
+
DATA_SHARED_PERSONAL_INFO,false
|
|
88
|
+
DATA_SHARED_FINANCIAL_INFO,false
|
|
89
|
+
DATA_SHARED_MESSAGES,false
|
|
90
|
+
DATA_SHARED_APP_ACTIVITY,false
|
|
91
|
+
DATA_SHARED_APP_INFO_AND_PERFORMANCE,false
|
|
92
|
+
DATA_SHARED_DEVICE_OR_OTHER_IDS,false
|
|
93
|
+
DATA_USAGE_PERSONAL_INFO_NAME_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
94
|
+
DATA_USAGE_PERSONAL_INFO_NAME_COLLECTION_PURPOSE_ANALYTICS,false
|
|
95
|
+
DATA_USAGE_PERSONAL_INFO_EMAIL_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
96
|
+
DATA_USAGE_PERSONAL_INFO_EMAIL_COLLECTION_PURPOSE_ACCOUNT_MANAGEMENT,true
|
|
97
|
+
DATA_USAGE_FINANCIAL_INFO_PURCHASE_HISTORY_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
98
|
+
DATA_USAGE_MESSAGES_OTHER_MESSAGES_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
99
|
+
DATA_USAGE_APP_ACTIVITY_APP_INTERACTIONS_COLLECTION_PURPOSE_ANALYTICS,true
|
|
100
|
+
DATA_USAGE_APP_INFO_CRASH_LOGS_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
101
|
+
DATA_USAGE_APP_INFO_DIAGNOSTICS_COLLECTION_PURPOSE_APP_FUNCTIONALITY,true
|
|
102
|
+
DATA_USAGE_DEVICE_OR_OTHER_IDS_COLLECTION_PURPOSE_ANALYTICS,true
|
|
103
|
+
SECURITY_PRACTICES_DATA_ENCRYPTED_IN_TRANSIT,true
|
|
104
|
+
SECURITY_PRACTICES_DATA_DELETION_REQUEST,true
|
|
105
|
+
SECURITY_PRACTICES_DATA_DELETION_REQUEST_URL,
|
|
@@ -235,7 +235,7 @@ async function main() {
|
|
|
235
235
|
console.log(result.success ? "\nDeployment successful!" : "\nDeployment created:");
|
|
236
236
|
console.log(` URL: ${url}`);
|
|
237
237
|
if (result.success) {
|
|
238
|
-
console.log(` Production: https://${projectName}.
|
|
238
|
+
console.log(` Production: https://${projectName}.workers.dev`);
|
|
239
239
|
}
|
|
240
240
|
} else {
|
|
241
241
|
console.log("\nDeployment response:", JSON.stringify(result, null, 2));
|