@daemux/store-automator 0.10.18 → 0.10.20
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/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/templates/CLAUDE.md.template +3 -0
- package/templates/fastlane/data_safety.csv.example +105 -0
- package/templates/scripts/ci/android/upload-metadata.sh +30 -2
|
@@ -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.20"
|
|
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.20",
|
|
16
16
|
"keywords": [
|
|
17
17
|
"flutter",
|
|
18
18
|
"app-store",
|
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
|
|
|
@@ -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
|
|
|
@@ -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,
|
|
@@ -72,7 +72,7 @@ Metadata and screenshots were uploaded by CI but **could not be saved** because
|
|
|
72
72
|
1. Go to [Google Play Console](https://play.google.com/console) → Select your app
|
|
73
73
|
2. **Dashboard** → Complete all required setup tasks shown in the checklist
|
|
74
74
|
3. **Store listing** → Create your default store listing (title, description, screenshots)
|
|
75
|
-
- *
|
|
75
|
+
- *Copy-paste the values from the **Store Listing** table below, then re-run CI after setup to auto-upload future changes.*
|
|
76
76
|
4. **Content rating** → Complete the content rating questionnaire
|
|
77
77
|
5. **App pricing** → Set pricing and distribution countries
|
|
78
78
|
6. **First release** → Go to **Testing → Internal testing** → Click **Create new release**
|
|
@@ -84,8 +84,36 @@ Metadata and screenshots were uploaded by CI but **could not be saved** because
|
|
|
84
84
|
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.
|
|
85
85
|
SUMMARY
|
|
86
86
|
|
|
87
|
-
# --- Append
|
|
87
|
+
# --- Append store listing table (read from metadata files) ---
|
|
88
88
|
META_DIR="$PROJECT_ROOT/fastlane/metadata/en-US"
|
|
89
|
+
_app_name="" _short_desc="" _full_desc=""
|
|
90
|
+
[ -s "$META_DIR/title.txt" ] && _app_name=$(cat "$META_DIR/title.txt")
|
|
91
|
+
[ -s "$META_DIR/short_description.txt" ] && _short_desc=$(cat "$META_DIR/short_description.txt")
|
|
92
|
+
[ -s "$META_DIR/full_description.txt" ] && _full_desc=$(cat "$META_DIR/full_description.txt")
|
|
93
|
+
|
|
94
|
+
if [ -n "$_app_name" ] || [ -n "$_short_desc" ] || [ -n "$_full_desc" ]; then
|
|
95
|
+
{
|
|
96
|
+
echo ""
|
|
97
|
+
echo "### Store Listing (copy-paste into Google Play Console)"
|
|
98
|
+
echo ""
|
|
99
|
+
if [ -n "$_app_name" ] || [ -n "$_short_desc" ]; then
|
|
100
|
+
echo "| Field | Value |"
|
|
101
|
+
echo "|-------|-------|"
|
|
102
|
+
[ -n "$_app_name" ] && echo "| App Name (max 30 chars) | \`$_app_name\` |"
|
|
103
|
+
[ -n "$_short_desc" ] && echo "| Short description (max 80 chars) | \`$_short_desc\` |"
|
|
104
|
+
fi
|
|
105
|
+
if [ -n "$_full_desc" ]; then
|
|
106
|
+
echo ""
|
|
107
|
+
echo "**Full description** (max 4000 chars):"
|
|
108
|
+
echo ""
|
|
109
|
+
echo "~~~"
|
|
110
|
+
echo "$_full_desc"
|
|
111
|
+
echo "~~~"
|
|
112
|
+
fi
|
|
113
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
# --- Append app URLs table (read from metadata files) ---
|
|
89
117
|
_privacy_url="" _support_url="" _marketing_url="" _support_email=""
|
|
90
118
|
[ -s "$META_DIR/privacy_url.txt" ] && _privacy_url=$(cat "$META_DIR/privacy_url.txt")
|
|
91
119
|
[ -s "$META_DIR/support_url.txt" ] && _support_url=$(cat "$META_DIR/support_url.txt")
|