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.
- checksums.yaml +4 -4
- data/.githooks/pre-commit +15 -0
- data/.githooks/pre-push +21 -0
- data/.github/workflows/ci.yml +29 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +55 -0
- data/.rubocop_todo.yml +112 -0
- data/CHANGELOG.md +96 -0
- data/Gemfile +5 -3
- data/Gemfile.lock +38 -8
- data/README.md +87 -17
- data/Rakefile +5 -3
- data/bin/console +4 -3
- data/bin/setup +3 -0
- data/exe/mysigner +2 -1
- data/lib/mysigner/build/android_executor.rb +46 -52
- data/lib/mysigner/build/android_parser.rb +33 -40
- data/lib/mysigner/build/configurator.rb +17 -16
- data/lib/mysigner/build/detector.rb +39 -50
- data/lib/mysigner/build/error_analyzer.rb +70 -68
- data/lib/mysigner/build/executor.rb +30 -37
- data/lib/mysigner/build/parser.rb +18 -18
- data/lib/mysigner/cli/auth_commands.rb +735 -752
- data/lib/mysigner/cli/build_commands.rb +697 -721
- data/lib/mysigner/cli/concerns/actionable_suggestions.rb +208 -154
- data/lib/mysigner/cli/concerns/api_helpers.rb +46 -54
- data/lib/mysigner/cli/concerns/error_handlers.rb +247 -237
- data/lib/mysigner/cli/concerns/helpers.rb +12 -1
- data/lib/mysigner/cli/diagnostic_commands.rb +659 -635
- data/lib/mysigner/cli/resource_commands.rb +1266 -822
- data/lib/mysigner/cli/validate_commands.rb +161 -0
- data/lib/mysigner/cli.rb +5 -1
- data/lib/mysigner/client.rb +27 -19
- data/lib/mysigner/config.rb +93 -56
- data/lib/mysigner/export/exporter.rb +32 -36
- data/lib/mysigner/signing/certificate_checker.rb +18 -23
- data/lib/mysigner/signing/keystore_manager.rb +34 -39
- data/lib/mysigner/signing/validator.rb +38 -40
- data/lib/mysigner/signing/wizard.rb +329 -342
- data/lib/mysigner/upload/app_store_automation.rb +51 -49
- data/lib/mysigner/upload/app_store_submission.rb +87 -92
- data/lib/mysigner/upload/play_store_uploader.rb +98 -115
- data/lib/mysigner/upload/uploader.rb +101 -109
- data/lib/mysigner/version.rb +3 -1
- data/lib/mysigner.rb +13 -11
- data/mysigner.gemspec +36 -33
- data/test_manual.rb +37 -36
- metadata +38 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4297e99c0337f28d14aea62d52242a57db707a59a23ad2d2890271c9759c3ac1
|
|
4
|
+
data.tar.gz: 56078eddbf0b0a103a27378abcaa8de232774e1185c8b410a19ec9c3160b08ab
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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!"
|
data/.githooks/pre-push
ADDED
|
@@ -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
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
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
41
|
-
net-http (
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
73
|
-
# Enter your
|
|
74
|
-
#
|
|
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
|
|
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
|
|
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
|
|
190
|
+
mysigner device detect # Detect connected iOS devices
|
|
190
191
|
mysigner device add NAME UDID # Register new device
|
|
191
|
-
mysigner device
|
|
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
|
|
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
|
|
218
|
-
mysigner
|
|
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,
|
|
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
|
-
- ✅
|
|
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/
|
|
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