mysigner 0.1.1 → 0.1.3

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.githooks/pre-commit +15 -0
  3. data/.githooks/pre-push +21 -0
  4. data/.github/workflows/ci.yml +29 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +55 -0
  7. data/.rubocop_todo.yml +112 -0
  8. data/CHANGELOG.md +96 -0
  9. data/Gemfile +5 -3
  10. data/Gemfile.lock +38 -8
  11. data/README.md +87 -17
  12. data/Rakefile +5 -3
  13. data/bin/console +4 -3
  14. data/bin/setup +3 -0
  15. data/exe/mysigner +2 -1
  16. data/lib/mysigner/build/android_executor.rb +46 -52
  17. data/lib/mysigner/build/android_parser.rb +33 -40
  18. data/lib/mysigner/build/configurator.rb +17 -16
  19. data/lib/mysigner/build/detector.rb +39 -50
  20. data/lib/mysigner/build/error_analyzer.rb +70 -68
  21. data/lib/mysigner/build/executor.rb +30 -37
  22. data/lib/mysigner/build/parser.rb +18 -18
  23. data/lib/mysigner/cli/auth_commands.rb +735 -752
  24. data/lib/mysigner/cli/build_commands.rb +697 -721
  25. data/lib/mysigner/cli/concerns/actionable_suggestions.rb +208 -154
  26. data/lib/mysigner/cli/concerns/api_helpers.rb +46 -54
  27. data/lib/mysigner/cli/concerns/error_handlers.rb +247 -237
  28. data/lib/mysigner/cli/concerns/helpers.rb +12 -1
  29. data/lib/mysigner/cli/diagnostic_commands.rb +659 -635
  30. data/lib/mysigner/cli/resource_commands.rb +1266 -822
  31. data/lib/mysigner/cli/validate_commands.rb +161 -0
  32. data/lib/mysigner/cli.rb +5 -1
  33. data/lib/mysigner/client.rb +27 -19
  34. data/lib/mysigner/config.rb +93 -56
  35. data/lib/mysigner/export/exporter.rb +32 -36
  36. data/lib/mysigner/signing/certificate_checker.rb +18 -23
  37. data/lib/mysigner/signing/keystore_manager.rb +34 -39
  38. data/lib/mysigner/signing/validator.rb +38 -40
  39. data/lib/mysigner/signing/wizard.rb +329 -342
  40. data/lib/mysigner/upload/app_store_automation.rb +51 -49
  41. data/lib/mysigner/upload/app_store_submission.rb +87 -92
  42. data/lib/mysigner/upload/play_store_uploader.rb +98 -115
  43. data/lib/mysigner/upload/uploader.rb +101 -109
  44. data/lib/mysigner/version.rb +3 -1
  45. data/lib/mysigner.rb +13 -11
  46. data/mysigner.gemspec +36 -33
  47. data/test_manual.rb +37 -36
  48. metadata +38 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8cd24e9a29c341d204f6cc2d9c5cde99c6248b655bf004fa370daa78abc9cd1
4
- data.tar.gz: 92e37eff120a9a3ca8325d40b720c2878339735a368fae5cbe917017682825d7
3
+ metadata.gz: 4297e99c0337f28d14aea62d52242a57db707a59a23ad2d2890271c9759c3ac1
4
+ data.tar.gz: 56078eddbf0b0a103a27378abcaa8de232774e1185c8b410a19ec9c3160b08ab
5
5
  SHA512:
6
- metadata.gz: b81c29b7b84b9357d0419c9333d0f8b769e475366fb5d73d5baa278c7d37e0e5f2a788b2e742f9dff731a5df821de09f1b651498ec496520b7600988d60c22de
7
- data.tar.gz: f035dbf8191e61be0f411a3ed8f8894f1cb725ed3b804f3dc6a33e9be466870af2a74cb150e1551b42a4e3862b6cd4feb9858c27d0a3e36fcea72a55a372df74
6
+ metadata.gz: 6ff3e8130cba10fa931e4f89d9de87fb4acafa37203d572f709021534b0a2dce6ae7cdcc26608a641e21835e6808671702ae73b6635f84e5787f302b5b8e92df
7
+ data.tar.gz: e7ffb3d8fe8b00ca4d3fe179a97d95a37982f67789f17048132d2be18c6eb23ef574e1a20783d72173002c9bd9ee063dec3206219af13dea6769f787f293d5cb
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ echo "==> Running RuboCop on staged Ruby files..."
5
+
6
+ # Get staged .rb files only
7
+ STAGED_RB_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.rb$' || true)
8
+
9
+ if [ -n "$STAGED_RB_FILES" ]; then
10
+ bundle exec rubocop --force-exclusion $STAGED_RB_FILES
11
+ else
12
+ echo " No staged Ruby files, skipping RuboCop."
13
+ fi
14
+
15
+ echo "==> All pre-commit checks passed!"
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+
3
+ echo "==> Running RSpec test suite before push..."
4
+ OUTPUT=$(bundle exec rspec --format progress 2>&1)
5
+ echo "$OUTPUT"
6
+
7
+ # Check for failures in the RSpec summary line, not exit code
8
+ # (CLI tests invoke exit(1) which leaks through Thor and taints the process exit code)
9
+ if echo "$OUTPUT" | grep -qE "[1-9][0-9]* failures?"; then
10
+ echo "==> Tests FAILED! Push aborted."
11
+ exit 1
12
+ fi
13
+
14
+ if echo "$OUTPUT" | grep -q "0 failures"; then
15
+ echo "==> All tests passed! Pushing..."
16
+ exit 0
17
+ fi
18
+
19
+ # If we can't parse the output, something went wrong
20
+ echo "==> Could not determine test results. Push aborted."
21
+ exit 1
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ lint:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: "3.2"
16
+ bundler-cache: true
17
+ - name: RuboCop
18
+ run: bundle exec rubocop
19
+
20
+ test:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: ruby/setup-ruby@v1
25
+ with:
26
+ ruby-version: "3.2"
27
+ bundler-cache: true
28
+ - name: RSpec
29
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ *.gem
1
2
  /.bundle/
2
3
  /.yardoc
3
4
  /_yardoc/
data/.rubocop.yml ADDED
@@ -0,0 +1,55 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ inherit_mode:
4
+ merge:
5
+ - Exclude
6
+
7
+ AllCops:
8
+ TargetRubyVersion: 3.2
9
+ NewCops: enable
10
+ SuggestExtensions: false
11
+
12
+ Layout/LineLength:
13
+ Max: 150
14
+
15
+ # Metrics cops — relaxed for existing code, tighten incrementally
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+ Metrics/AbcSize:
19
+ Max: 60
20
+ Metrics/CyclomaticComplexity:
21
+ Max: 20
22
+ Metrics/PerceivedComplexity:
23
+ Max: 20
24
+ Metrics/ClassLength:
25
+ Max: 500
26
+ Metrics/ModuleLength:
27
+ Max: 500
28
+ Metrics/BlockLength:
29
+ Exclude:
30
+ - "spec/**/*"
31
+ - "*.gemspec"
32
+ Metrics/BlockNesting:
33
+ Max: 5
34
+ Metrics/ParameterLists:
35
+ Max: 6
36
+
37
+ Style/Documentation:
38
+ Enabled: false
39
+ Style/MultilineBlockChain:
40
+ Enabled: false
41
+ Style/SafeNavigationChainLength:
42
+ Enabled: false
43
+
44
+ Gemspec/DevelopmentDependencies:
45
+ Enabled: false
46
+
47
+ Naming/PredicateMethod:
48
+ Enabled: false
49
+ Naming/PredicatePrefix:
50
+ Enabled: false
51
+ Naming/AccessorMethodName:
52
+ Enabled: false
53
+
54
+ Lint/DuplicateBranch:
55
+ Enabled: false
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,112 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config --auto-gen-only-exclude`
3
+ # on 2026-03-31 15:30:27 UTC using RuboCop version 1.86.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 5
10
+ # This cop supports safe autocorrection (--autocorrect).
11
+ # Configuration parameters: Max, AllowHeredoc, AllowURI, AllowQualifiedName, URISchemes, AllowRBSInlineAnnotation, AllowCopDirectives, AllowedPatterns, SplitStrings.
12
+ # URISchemes: http, https
13
+ Layout/LineLength:
14
+ Exclude:
15
+ - 'lib/mysigner/cli/build_commands.rb'
16
+ - 'lib/mysigner/cli/resource_commands.rb'
17
+ - 'lib/mysigner/upload/app_store_automation.rb'
18
+ - 'mysigner.gemspec'
19
+ - 'spec/cli/ship_appstore_spec.rb'
20
+
21
+ # Offense count: 44
22
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
23
+ Metrics/AbcSize:
24
+ Exclude:
25
+ - 'lib/mysigner/build/error_analyzer.rb'
26
+ - 'lib/mysigner/cli/auth_commands.rb'
27
+ - 'lib/mysigner/cli/build_commands.rb'
28
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
29
+ - 'lib/mysigner/cli/resource_commands.rb'
30
+ - 'lib/mysigner/cli/validate_commands.rb'
31
+ - 'lib/mysigner/signing/validator.rb'
32
+ - 'lib/mysigner/signing/wizard.rb'
33
+ - 'lib/mysigner/upload/app_store_submission.rb'
34
+
35
+ # Offense count: 11
36
+ # Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
37
+ # AllowedMethods: refine
38
+ Metrics/BlockLength:
39
+ Exclude:
40
+ - 'spec/**/*'
41
+ - '*.gemspec'
42
+ - 'lib/mysigner/cli/auth_commands.rb'
43
+ - 'lib/mysigner/cli/build_commands.rb'
44
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
45
+ - 'lib/mysigner/cli/resource_commands.rb'
46
+ - 'lib/mysigner/cli/validate_commands.rb'
47
+
48
+ # Offense count: 5
49
+ # Configuration parameters: CountBlocks, CountModifierForms, Max.
50
+ Metrics/BlockNesting:
51
+ Exclude:
52
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
53
+
54
+ # Offense count: 1
55
+ # Configuration parameters: CountComments, Max, CountAsOne.
56
+ Metrics/ClassLength:
57
+ Exclude:
58
+ - 'lib/mysigner/signing/wizard.rb'
59
+
60
+ # Offense count: 25
61
+ # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
62
+ Metrics/CyclomaticComplexity:
63
+ Exclude:
64
+ - 'lib/mysigner/build/detector.rb'
65
+ - 'lib/mysigner/cli/auth_commands.rb'
66
+ - 'lib/mysigner/cli/build_commands.rb'
67
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
68
+ - 'lib/mysigner/cli/resource_commands.rb'
69
+ - 'lib/mysigner/cli/validate_commands.rb'
70
+ - 'lib/mysigner/signing/wizard.rb'
71
+
72
+ # Offense count: 43
73
+ # Configuration parameters: CountComments, Max, CountAsOne, AllowedMethods, AllowedPatterns.
74
+ Metrics/MethodLength:
75
+ Exclude:
76
+ - 'lib/mysigner/build/detector.rb'
77
+ - 'lib/mysigner/build/error_analyzer.rb'
78
+ - 'lib/mysigner/cli/auth_commands.rb'
79
+ - 'lib/mysigner/cli/build_commands.rb'
80
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
81
+ - 'lib/mysigner/cli/resource_commands.rb'
82
+ - 'lib/mysigner/cli/validate_commands.rb'
83
+ - 'lib/mysigner/signing/wizard.rb'
84
+ - 'lib/mysigner/upload/app_store_automation.rb'
85
+
86
+ # Offense count: 4
87
+ # Configuration parameters: CountComments, Max, CountAsOne.
88
+ Metrics/ModuleLength:
89
+ Exclude:
90
+ - 'lib/mysigner/cli/auth_commands.rb'
91
+ - 'lib/mysigner/cli/build_commands.rb'
92
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
93
+ - 'lib/mysigner/cli/resource_commands.rb'
94
+
95
+ # Offense count: 2
96
+ # Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
97
+ Metrics/ParameterLists:
98
+ Exclude:
99
+ - 'lib/mysigner/build/executor.rb'
100
+ - 'lib/mysigner/signing/keystore_manager.rb'
101
+
102
+ # Offense count: 26
103
+ # Configuration parameters: AllowedMethods, AllowedPatterns, Max.
104
+ Metrics/PerceivedComplexity:
105
+ Exclude:
106
+ - 'lib/mysigner/build/detector.rb'
107
+ - 'lib/mysigner/cli/auth_commands.rb'
108
+ - 'lib/mysigner/cli/build_commands.rb'
109
+ - 'lib/mysigner/cli/diagnostic_commands.rb'
110
+ - 'lib/mysigner/cli/resource_commands.rb'
111
+ - 'lib/mysigner/cli/validate_commands.rb'
112
+ - 'lib/mysigner/signing/wizard.rb'
data/CHANGELOG.md ADDED
@@ -0,0 +1,96 @@
1
+ # Changelog
2
+
3
+ All notable changes to My Signer CLI will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-01-23
9
+
10
+ ### Added
11
+
12
+ #### Build & Ship Commands
13
+ - `mysigner ship testflight` - Build iOS app and upload to TestFlight in one command
14
+ - `mysigner ship appstore` - Build iOS app and submit to App Store Connect
15
+ - `mysigner ship internal/alpha/beta/production --platform android` - Build and upload Android app to Google Play
16
+ - `mysigner submit` - Submit existing builds for App Store/Play Store review
17
+ - `mysigner build` - Build .xcarchive for iOS (advanced)
18
+ - `mysigner export` - Export archive to IPA (advanced)
19
+ - `mysigner upload testflight` - Upload existing IPA to TestFlight (advanced)
20
+
21
+ #### Android Support
22
+ - Full Android build and upload workflow
23
+ - Keystore management: `mysigner keystore list/upload/download/activate/delete`
24
+ - Automatic version code increment when uploading to Google Play
25
+ - Support for all Google Play tracks: internal, alpha, beta, production
26
+ - Native Android, React Native, Flutter, and Capacitor/Ionic project detection
27
+
28
+ #### iOS Features
29
+ - App Store submission with release types (AFTER_APPROVAL, MANUAL, SCHEDULED)
30
+ - Scheduled release support with `--scheduled-date`
31
+ - Build processing wait with polling
32
+ - Automatic team ID detection from My Signer API
33
+ - Support for Native iOS, React Native, Flutter, and Capacitor/Ionic projects
34
+
35
+ #### Diagnostics & Onboarding
36
+ - `mysigner doctor` - Comprehensive health check with auto-fix capabilities
37
+ - Checks Xcode, Command Line Tools, upload tools
38
+ - Validates My Signer configuration and credentials
39
+ - Checks signing identity in keychain
40
+ - Verifies App Store Connect credentials (with interactive setup)
41
+ - Checks disk space, network connectivity
42
+ - Detects iOS and Android projects
43
+ - Auto-creates provisioning profiles when missing
44
+ - Generates CSR for certificate creation
45
+ - `mysigner doctor --platform ios` - Check iOS setup only
46
+ - `mysigner doctor --platform android` - Check Android setup only (Java, Android SDK, Gradle, keystores)
47
+ - `mysigner onboard` - Guided setup wizard for new users
48
+
49
+ #### Core Commands
50
+ - `mysigner login` - Authenticate with API token
51
+ - `mysigner logout` - Clear stored credentials
52
+ - `mysigner status` - Check connection and show organization stats
53
+ - `mysigner orgs` - List accessible organizations
54
+ - `mysigner switch` - Switch active organization
55
+ - `mysigner config show/set` - Manage configuration
56
+
57
+ #### Resource Management
58
+ - **Devices**: `mysigner devices`, `mysigner device detect/add/update`
59
+ - **Profiles**: `mysigner profiles`, `mysigner profile download/delete`
60
+ - **Certificates**: `mysigner certificates`, `mysigner certificate check/download`
61
+ - **Bundle IDs**: `mysigner bundleid list/register`
62
+
63
+ #### Sync
64
+ - `mysigner sync` - Sync from App Store Connect (iOS)
65
+ - `mysigner sync android` - Sync from Google Play
66
+ - `mysigner sync all` - Sync both platforms
67
+ - `--force` flag to force sync even if recently synced
68
+
69
+ #### Signing Configuration
70
+ - `mysigner signing configure` - Interactive wizard for manual signing setup
71
+ - Support for configuring specific targets or all targets
72
+ - Automatic profile matching and creation
73
+
74
+ ### Technical
75
+
76
+ - Thor-based CLI architecture with modular command structure
77
+ - Faraday HTTP client with retry and error handling
78
+ - Configuration stored in `~/.mysigner/config.yml`
79
+ - 90+ RSpec tests
80
+ - Support for multiple project types:
81
+ - Native iOS (.xcodeproj, .xcworkspace)
82
+ - Native Android (Gradle)
83
+ - React Native
84
+ - Flutter
85
+ - Capacitor/Ionic
86
+
87
+ ---
88
+
89
+ ## [Unreleased]
90
+
91
+ ### Planned
92
+ - `--json` flag for scripting output
93
+ - Pretty tables (TTY::Table)
94
+ - Progress spinners (TTY::Spinner)
95
+ - CI/CD templates for GitHub Actions and GitLab CI
96
+ - Phased release support for App Store
data/Gemfile CHANGED
@@ -1,7 +1,9 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in mysigner.gemspec
6
8
  gemspec
7
- gem "xcodeproj", "~> 1.27"
9
+ gem 'xcodeproj', '~> 1.27'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mysigner (0.1.1)
4
+ mysigner (0.1.3)
5
5
  base64 (~> 0.2)
6
6
  faraday (~> 2.14)
7
7
  faraday-retry (~> 2.2)
@@ -21,6 +21,7 @@ GEM
21
21
  rexml
22
22
  addressable (2.8.7)
23
23
  public_suffix (>= 2.0.2, < 7.0)
24
+ ast (2.4.3)
24
25
  atomos (0.1.3)
25
26
  base64 (0.3.0)
26
27
  bigdecimal (3.2.3)
@@ -31,14 +32,14 @@ GEM
31
32
  rexml
32
33
  declarative (0.0.20)
33
34
  diff-lcs (1.6.2)
34
- faraday (2.14.0)
35
+ faraday (2.14.1)
35
36
  faraday-net_http (>= 2.0, < 3.5)
36
37
  json
37
38
  logger
38
39
  faraday-follow_redirects (0.4.0)
39
40
  faraday (>= 1, < 3)
40
- faraday-net_http (3.4.1)
41
- net-http (>= 0.5.0)
41
+ faraday-net_http (3.4.2)
42
+ net-http (~> 0.5)
42
43
  faraday-retry (2.3.2)
43
44
  faraday (~> 2.0)
44
45
  google-apis-androidpublisher_v3 (0.91.0)
@@ -65,20 +66,30 @@ GEM
65
66
  signet (>= 0.16, < 2.a)
66
67
  hashdiff (1.2.1)
67
68
  io-console (0.8.1)
68
- json (2.15.0)
69
+ json (2.19.3)
69
70
  jwt (3.1.2)
70
71
  base64
72
+ language_server-protocol (3.17.0.5)
73
+ lint_roller (1.1.0)
71
74
  logger (1.7.0)
72
75
  mini_mime (1.1.5)
73
76
  multi_json (1.18.0)
74
77
  nanaimo (0.4.0)
75
- net-http (0.6.0)
76
- uri
78
+ net-http (0.9.1)
79
+ uri (>= 0.11.1)
77
80
  nkf (0.2.0)
78
81
  os (1.1.4)
82
+ parallel (1.27.0)
83
+ parser (3.3.11.1)
84
+ ast (~> 2.4.1)
85
+ racc
79
86
  plist (3.7.2)
87
+ prism (1.9.0)
80
88
  public_suffix (6.0.2)
89
+ racc (1.8.1)
90
+ rainbow (3.1.1)
81
91
  rake (13.3.0)
92
+ regexp_parser (2.11.3)
82
93
  reline (0.6.2)
83
94
  io-console (~> 0.5)
84
95
  representable (3.2.0)
@@ -100,6 +111,21 @@ GEM
100
111
  diff-lcs (>= 1.2.0, < 2.0)
101
112
  rspec-support (~> 3.13.0)
102
113
  rspec-support (3.13.6)
114
+ rubocop (1.86.0)
115
+ json (~> 2.3)
116
+ language_server-protocol (~> 3.17.0.2)
117
+ lint_roller (~> 1.1.0)
118
+ parallel (~> 1.10)
119
+ parser (>= 3.3.0.2)
120
+ rainbow (>= 2.2.2, < 4.0)
121
+ regexp_parser (>= 2.9.3, < 3.0)
122
+ rubocop-ast (>= 1.49.0, < 2.0)
123
+ ruby-progressbar (~> 1.7)
124
+ unicode-display_width (>= 2.4.0, < 4.0)
125
+ rubocop-ast (1.49.1)
126
+ parser (>= 3.3.7.2)
127
+ prism (~> 1.7)
128
+ ruby-progressbar (1.13.0)
103
129
  signet (0.21.0)
104
130
  addressable (~> 2.8)
105
131
  faraday (>= 0.17.5, < 3.a)
@@ -108,7 +134,10 @@ GEM
108
134
  thor (1.4.0)
109
135
  trailblazer-option (0.1.2)
110
136
  uber (0.1.0)
111
- uri (1.0.3)
137
+ unicode-display_width (3.2.0)
138
+ unicode-emoji (~> 4.1)
139
+ unicode-emoji (4.2.0)
140
+ uri (1.1.1)
112
141
  webmock (3.25.1)
113
142
  addressable (>= 2.8.0)
114
143
  crack (>= 0.3.2)
@@ -130,6 +159,7 @@ DEPENDENCIES
130
159
  mysigner!
131
160
  rake (~> 13.0)
132
161
  rspec (~> 3.0)
162
+ rubocop (~> 1.79)
133
163
  webmock (~> 3.24)
134
164
  xcodeproj (~> 1.27)
135
165
 
data/README.md CHANGED
@@ -69,9 +69,10 @@ bundle exec rake install
69
69
 
70
70
  ```bash
71
71
  mysigner login
72
- # Enter your API token when prompted
73
- # Enter your API URL (default: http://localhost:3000)
74
- # Select your organization
72
+ # Enter your API URL (default: https://mysigner.dev or localhost if available)
73
+ # Enter your email address
74
+ # Paste your API token
75
+ # The CLI validates the token and auto-detects its organization
75
76
  ```
76
77
 
77
78
  ### 3. Ship Your App
@@ -162,7 +163,7 @@ mysigner upload testflight IPA_PATH # Upload existing IPA
162
163
  mysigner doctor # Run health check (fixes common issues)
163
164
  mysigner doctor --platform ios # Check iOS setup only
164
165
  mysigner doctor --platform android # Check Android setup only
165
- mysigner status # Check connection and show stats
166
+ mysigner status # Check connection, credentials, and ASC setup
166
167
  ```
167
168
 
168
169
  ### Authentication
@@ -177,7 +178,7 @@ mysigner onboard # Guided setup wizard
177
178
 
178
179
  ```bash
179
180
  mysigner orgs # List accessible organizations
180
- mysigner org:switch ID # Switch active organization
181
+ mysigner switch # Switch active organization
181
182
  ```
182
183
 
183
184
  ### Devices
@@ -186,9 +187,9 @@ mysigner org:switch ID # Switch active organization
186
187
  mysigner devices # List all devices
187
188
  mysigner devices --platform ios # Filter by platform
188
189
  mysigner devices --search "iPhone" # Search devices
189
- mysigner device show ID # Show device details
190
+ mysigner device detect # Detect connected iOS devices
190
191
  mysigner device add NAME UDID # Register new device
191
- mysigner device rename ID "New Name" # Update device name
192
+ mysigner device update ID "New Name" # Update device name
192
193
  ```
193
194
 
194
195
  ### Provisioning Profiles
@@ -196,9 +197,7 @@ mysigner device rename ID "New Name" # Update device name
196
197
  ```bash
197
198
  mysigner profiles # List all profiles
198
199
  mysigner profiles --type development # Filter by type
199
- mysigner profile show ID # Show profile details
200
200
  mysigner profile download ID # Download .mobileprovision
201
- mysigner profile create # Create new profile (interactive)
202
201
  mysigner profile delete ID # Delete profile
203
202
  ```
204
203
 
@@ -207,16 +206,15 @@ mysigner profile delete ID # Delete profile
207
206
  ```bash
208
207
  mysigner certificates # List all certificates
209
208
  mysigner certificates --type development # Filter by type
210
- mysigner certificate show ID # Show certificate details
209
+ mysigner certificate check # Check local keychain certificates
211
210
  mysigner certificate download ID # Download .cer file
212
211
  ```
213
212
 
214
213
  ### Bundle IDs
215
214
 
216
215
  ```bash
217
- mysigner bundle-ids # List all bundle IDs
218
- mysigner bundle-ids --search "com.example" # Search bundle IDs
219
- mysigner bundle-id show ID # Show bundle ID details
216
+ mysigner bundleid list # List all bundle IDs
217
+ mysigner bundleid register com.example.app # Register a bundle ID
220
218
  ```
221
219
 
222
220
  ### Android Keystores
@@ -229,6 +227,76 @@ mysigner keystore activate ID # Set as active keystore
229
227
  mysigner keystore delete ID # Delete keystore
230
228
  ```
231
229
 
230
+ ### Google Play Credentials
231
+
232
+ ```bash
233
+ mysigner gp-credential list # List all credentials
234
+ mysigner gp-credential activate ID # Set as active credential
235
+ mysigner gp-credential test ID # Test Google Play connection
236
+ mysigner gp-credential delete ID # Delete credential
237
+ ```
238
+
239
+ ### App Store Releases
240
+
241
+ ```bash
242
+ mysigner release list # List release configurations
243
+ mysigner release list --bundle-id com.app # Filter by bundle ID
244
+ mysigner release show ID # Show release details
245
+ mysigner release create --bundle-id-id 42 # Create release config
246
+ mysigner release update ID --auto-submit # Update release config
247
+ mysigner release update ID --whats-new "Bug fixes"
248
+ ```
249
+
250
+ ### Google Play Tracks
251
+
252
+ ```bash
253
+ mysigner tracks com.example.app # List tracks for an app
254
+ mysigner tracks com.example.app --sort # Sort alphabetically
255
+ mysigner track com.example.app production # Show track details
256
+ mysigner track com.example.app beta # Show beta track details
257
+ ```
258
+
259
+ ### Android Apps
260
+
261
+ ```bash
262
+ mysigner android init # Detect and register Android app
263
+ mysigner android add com.example.app # Register app manually
264
+ mysigner android build # Build AAB file
265
+ mysigner android list # List registered Android apps
266
+ ```
267
+
268
+ ### Apps
269
+
270
+ ```bash
271
+ mysigner apps # List all apps (iOS + Android)
272
+ mysigner apps --platform ios # iOS apps only
273
+ mysigner apps --platform android # Android apps only
274
+ mysigner apps -q "myapp" # Search by name
275
+ ```
276
+
277
+ ### Merchant IDs
278
+
279
+ ```bash
280
+ mysigner merchant-ids # List Apple Pay Merchant IDs
281
+ mysigner merchant-id create IDENTIFIER # Create a Merchant ID
282
+ mysigner merchant-id delete IDENTIFIER # Delete a Merchant ID
283
+ ```
284
+
285
+ ### App Groups
286
+
287
+ ```bash
288
+ mysigner app-groups # List App Groups
289
+ mysigner app-group register IDENTIFIER # Register an App Group
290
+ mysigner app-group delete IDENTIFIER # Delete an App Group
291
+ ```
292
+
293
+ ### Validate Signing
294
+
295
+ ```bash
296
+ mysigner validate -b com.example.app -t development # Validate signing config
297
+ mysigner validate --type appstore # Auto-detect bundle ID
298
+ ```
299
+
232
300
  ### Sync
233
301
 
234
302
  ```bash
@@ -276,15 +344,18 @@ mysigner config set KEY VAL # Update configuration value
276
344
  - ✅ Config management (`~/.mysigner/config.yml`)
277
345
  - ✅ API client (Faraday with retry & error handling)
278
346
  - ✅ Core commands (login, logout, config, status, orgs, switch, onboard)
279
- - ✅ Resource commands (devices, profiles, certificates, bundle-ids)
347
+ - ✅ Resource commands (devices, profiles, certificates, bundleid)
280
348
  - ✅ **iOS Build & Ship** (`mysigner ship testflight`, `mysigner ship appstore`)
281
349
  - ✅ **Android Build & Ship** (`mysigner ship internal/alpha/beta/production`)
282
350
  - ✅ Android keystore management (`mysigner keystore upload/download/activate`)
351
+ - ✅ Google Play credential management (`mysigner gp-credential list/activate/test/delete`)
283
352
  - ✅ Automatic version code increment for Android
284
353
  - ✅ App Store submission with release types (AFTER_APPROVAL, MANUAL, SCHEDULED)
354
+ - ✅ App Store release configuration (`mysigner release list/show/create/update`)
355
+ - ✅ Server-side signing validation (`mysigner validate`)
285
356
  - ✅ Project detection (Native iOS/Android, React Native, Flutter, Capacitor/Ionic)
286
357
  - ✅ `mysigner doctor` health check with auto-fix capabilities
287
- - ✅ 90+ RSpec tests
358
+ - ✅ 260+ RSpec tests
288
359
  - ✅ Interactive prompts and wizards
289
360
 
290
361
  📅 **Future**:
@@ -292,7 +363,6 @@ mysigner config set KEY VAL # Update configuration value
292
363
  - Progress spinners (TTY::Spinner)
293
364
  - `--json` flag for scripting
294
365
  - CI/CD templates (GitHub Actions, GitLab CI)
295
- - Phased release support
296
366
 
297
367
  See the [main project roadmap](https://github.com/jurgenleka/my-signer/blob/main/ROADMAP.md) for detailed plans.
298
368
 
@@ -459,7 +529,7 @@ This is currently a private project. Contributions are not being accepted at thi
459
529
  ## Related Projects
460
530
 
461
531
  - **[My Signer API](https://github.com/jurgenleka/my-signer)** - The backend API and web dashboard
462
- - **[My Signer Docs](https://github.com/jurgenleka/my-signer/blob/main/PROJECT_DOCS.md)** - Documentation organization
532
+ - **[My Signer Docs](https://github.com/jurgenleka/my-signer/tree/main/app/views/docs)** - In-app documentation source
463
533
 
464
534
  ---
465
535
 
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec