@daemux/store-automator
v0.10.98
Published
Full App Store & Google Play automation for Flutter apps with Claude Code agents
Maintainers
Readme
@daemux/store-automator
Full App Store & Google Play automation for Flutter apps and native iOS (Swift/SwiftUI) apps with Claude Code agents.
What It Does
This package installs three Claude Code agents and a complete CI/CD template suite that automates the entire app store publishing workflow:
- appstore-reviewer -- Reviews metadata, screenshots, and tests compliance with Apple App Store and Google Play guidelines
- appstore-meta-creator -- Creates all store metadata texts (names, descriptions, keywords) for all available languages
- app-designer -- Designs complete app UI, creates ASO-optimized store screenshots, and designs marketing web pages -- all in Stitch MCP
Plus CI/CD templates for GitHub Actions, Fastlane, web pages, and scripts.
Requirements
- Claude CLI installed
- Node.js >= 18
- A Flutter project or a native iOS (Swift/SwiftUI) Xcode project
Project-type-specific templates:
- Flutter iOS/Android:
templates/github/workflows/ios-release.yml+android-release.yml - Native iOS:
templates/github/workflows/ios-native-release.yml(uses thedaemux/daemux-plugins/.github/actions/ios-native-testflightcomposite action — requires only ASC API key secrets, no Fastlane/Match setup)
Installation
Project (default): Full install into your Flutter project -- agents, CI/CD templates, MCP servers, and interactive setup:
cd your-flutter-project
npx --yes @daemux/store-automatorThe installer runs an interactive setup with five sections:
- App Identity -- App name, bundle ID, package name, SKU, Apple ID
- Credentials -- App Store Connect API key, Google Play service account, Android keystore, Match code signing
- Store Settings -- iOS categories/pricing, Android track/rollout, metadata languages
- Web Settings -- Domain, colors, company info, legal jurisdiction
- MCP Tokens -- Stitch and Cloudflare API keys (optional)
All values are written to ci.config.yaml. The installer also configures .mcp.json, installs .claude/CLAUDE.md, copies CI/CD templates, and configures .claude/settings.json.
Re-running the installer reads existing ci.config.yaml values as defaults, so you can update individual fields without re-entering everything.
Global (agents only): Install the plugin into ~/.claude for use across all projects, without touching the current directory:
npx --yes @daemux/store-automator --globalGlobal install:
- Registers the marketplace and installs the plugin at user scope
- Writes
~/.claude/CLAUDE.mdwith agent configurations - Adds required env vars and statusLine to
~/.claude/settings.json
Global install does NOT:
- Create
ci.config.yaml,fastlane/,scripts/,web/,Gemfile,.github/workflows/, or any other project files - Write or modify
.mcp.jsonin the current directory - Run any interactive prompts or post-install guides
Use project install for any Flutter app you are actually publishing. Global install is for agent-only access from arbitrary directories.
After Installation (project scope only)
- Add any credential files not configured during the guided setup:
creds/AuthKey.p8-- Apple App Store Connect API keycreds/play-service-account.json-- Google Play service accountcreds/upload-keystore.jks-- Android upload keystore
- Verify
ci.config.yamlhas all required values filled in - Start Claude Code and use the agents
Manual Setup (project scope only)
If postinstall was skipped (CI environment), run manually:
npx store-automatorCLI Reference
General Options
| Flag | Description |
|------|-------------|
| -g, --global | Install globally (~/.claude) instead of project scope |
| -u, --uninstall | Uninstall plugin and remove files |
| --postinstall | Run as postinstall hook (auto-detected) |
| -v, --version | Show version number |
| -h, --help | Show help |
App Identity
| Flag | Description |
|------|-------------|
| --app-name=NAME | App display name |
| --bundle-id=ID | Bundle ID / Package Name (e.g., com.company.app) |
| --sku=SKU | App Store Connect SKU |
| --apple-id=EMAIL | Apple Developer Account email |
Credentials
| Flag | Description |
|------|-------------|
| --key-id=ID | App Store Connect Key ID |
| --issuer-id=ID | App Store Connect Issuer ID |
| --keystore-password=PASS | Android keystore password |
| --match-deploy-key-path=PATH | Path to Match deploy key |
| --match-git-url=URL | Match certificates Git URL (SSH) |
iOS Store Settings
| Flag | Description |
|------|-------------|
| --primary-category=CAT | Primary category (e.g., UTILITIES) |
| --secondary-category=CAT | Secondary category (e.g., PRODUCTIVITY) |
| --price-tier=N | Price tier (0 = free) |
| --submit-for-review=BOOL | Auto-submit for review (true/false) |
| --automatic-release=BOOL | Auto-release after approval (true/false) |
Android Store Settings
| Flag | Description |
|------|-------------|
| --track=TRACK | Release track (internal/alpha/beta/production) |
| --rollout-fraction=N | Rollout fraction (0.0-1.0) |
| --in-app-update-priority=N | In-app update priority (0-5) |
Web Settings
| Flag | Description |
|------|-------------|
| --domain=DOMAIN | Web domain (e.g., myapp-pages.workers.dev) |
| --cf-project-name=NAME | Cloudflare Pages project name |
| --tagline=TEXT | App tagline |
| --primary-color=HEX | Primary color (e.g., #2563EB) |
| --secondary-color=HEX | Secondary color (e.g., #7C3AED) |
| --company-name=NAME | Company name |
| --contact-email=EMAIL | Contact email |
| --support-email=EMAIL | Support email |
| --jurisdiction=TEXT | Legal jurisdiction (e.g., Delaware, USA) |
Languages
| Flag | Description |
|------|-------------|
| --languages=LANGS | Comma-separated language codes (e.g., en-US,de-DE,ja) |
MCP Tokens
| Flag | Description |
|------|-------------|
| --stitch-key=KEY | Stitch MCP API key |
| --cloudflare-token=TOKEN | Cloudflare API token |
| --cloudflare-account-id=ID | Cloudflare account ID |
GitHub Actions CI
| Flag | Description |
|------|-------------|
| --github-actions | GitHub Actions CI mode (requires --bundle-id, --match-deploy-key, --match-git-url) |
| --match-deploy-key=PATH | Path to Match deploy key file |
| --match-git-url=URL | Git URL for Match certificates repo (SSH) |
Full Non-Interactive Example
Pass all flags to skip every interactive prompt:
npx @daemux/store-automator \
--app-name="My Amazing App" \
--bundle-id=com.mycompany.amazingapp \
--sku=MY_AMAZING_APP \
[email protected] \
--key-id=ABC123DEF4 \
--issuer-id=12345678-1234-1234-1234-123456789012 \
--keystore-password=my-secure-password \
--match-deploy-key-path=creds/match_deploy_key \
[email protected]:mycompany/certificates.git \
--primary-category=UTILITIES \
--secondary-category=PRODUCTIVITY \
--price-tier=0 \
--submit-for-review=true \
--automatic-release=true \
--track=internal \
--rollout-fraction=1.0 \
--in-app-update-priority=3 \
--domain=amazingapp-pages.account-subdomain.workers.dev \
--cf-project-name=amazingapp-pages \
--tagline="The best utility app ever" \
--primary-color="#2563EB" \
--secondary-color="#7C3AED" \
--company-name="My Company LLC" \
[email protected] \
[email protected] \
--jurisdiction="Delaware, USA" \
--languages=en-US,de-DE,ja \
--stitch-key=sk-stitch-xxx \
--cloudflare-token=cf-token-xxx \
--cloudflare-account-id=abc123def456ci.config.yaml Reference
The installer writes all configuration to ci.config.yaml. Below is the full structure with the corresponding CLI flag for each field.
flutter_root: "." # Subdirectory if Flutter project is not at repo root
credentials:
apple:
p8_key_path: creds/AuthKey.p8 # Path to AuthKey .p8 file (manual)
key_id: "" # --key-id
issuer_id: "" # --issuer-id
google:
service_account_json_path: creds/play-service-account.json # Manual
android:
keystore_password: "" # --keystore-password
match:
deploy_key_path: "" # --match-deploy-key-path
git_url: "" # --match-git-url
app:
name: "" # --app-name
bundle_id: "" # --bundle-id
package_name: "" # --bundle-id (same value)
sku: "" # --sku
apple_id: "" # --apple-id
ios:
primary_category: "UTILITIES" # --primary-category
secondary_category: "PRODUCTIVITY" # --secondary-category
price_tier: 0 # --price-tier
submit_for_review: true # --submit-for-review
automatic_release: true # --automatic-release
android:
track: "internal" # --track
rollout_fraction: "1.0" # --rollout-fraction
in_app_update_priority: 3 # --in-app-update-priority
metadata:
languages: # --languages (comma-separated)
- en-US
web:
domain: "" # --domain
cloudflare_project_name: "" # --cf-project-name
tagline: "" # --tagline
primary_color: "#2563EB" # --primary-color
secondary_color: "#7C3AED" # --secondary-color
company_name: "" # --company-name
contact_email: "" # --contact-email
support_email: "" # --support-email
jurisdiction: "" # --jurisdiction
app_store_url: "" # Filled after first iOS publish
google_play_url: "" # Filled after first Android publishUninstall
Project uninstall: Removes CI templates, ci.config.yaml, .mcp.json entries, .claude/CLAUDE.md, and settings from the current project. Marketplace files remain in ~/.claude/plugins/.
npx --yes @daemux/store-automator --uninstallGlobal uninstall: Removes the plugin from ~/.claude and clears the marketplace. Does NOT touch the current project's ci.config.yaml, CI templates, or .mcp.json.
npx --yes @daemux/store-automator --global --uninstallAgents
appstore-meta-creator
Creates all metadata texts for both Apple App Store and Google Play in all configured languages. Outputs to fastlane/metadata/ios/ and fastlane/metadata/android/.
app-designer
Designs complete app UI screens, creates ASO-optimized store screenshots for all required device sizes, and designs the marketing web page. All work done in a single Stitch MCP project. Researches competitors for ASO optimization. Outputs screenshots to fastlane/screenshots/.
appstore-reviewer
Reviews all metadata, screenshots, privacy policy, and IAP configuration against Apple and Google guidelines. Returns APPROVED or REJECTED with specific issues.
CI/CD Templates (project scope only)
The package installs these templates to your project:
| File | Purpose |
|------|---------|
| ci.config.yaml | Per-project configuration (credentials, app identity, settings) |
| scripts/check_changed.sh | Git-based change detection for conditional uploads |
| scripts/manage_version_ios.py | Automatic iOS version management |
| fastlane/ | iOS and Android Fastlane configurations |
| web/ | Marketing, privacy, terms, and support page templates |
| Gemfile | Ruby gems for Fastlane |
Workflow (project scope only)
- Install the package (interactive setup fills
ci.config.yaml) - Add any remaining credential files
- Use
app-designerto design app UI + create screenshots + design web page - Use
appstore-meta-creatorto generate metadata - Use
appstore-reviewerto verify compliance - Push to GitHub -- GitHub Actions builds and publishes automatically
MCP Servers (project scope only)
The package configures these MCP servers in .mcp.json:
| Server | Purpose | Required Token |
|--------|---------|---------------|
| playwright | Browser automation for testing web pages | None |
| mobile-mcp | Mobile device automation | None |
| stitch | AI design tool for screenshot generation | STITCH_API_KEY |
| cloudflare | Cloudflare Pages deployment | CLOUDFLARE_API_TOKEN + Account ID |
Idempotency (project scope only)
The installer is idempotent. Re-running it reads existing values from ci.config.yaml as defaults for each prompt. This means you can:
- Update a single field by re-running and pressing Enter through unchanged fields
- Add credentials you skipped during the first run
- Change store settings without losing other configuration
CLI flags override both the existing config and the interactive prompt for that field.
License
MIT
