shipthis 0.1.35 → 0.1.37

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 (108) hide show
  1. package/README.md +231 -80
  2. package/assets/markdown/agreement-update.md.ejs +12 -0
  3. package/assets/markdown/confirm-delete-android-keystore.md.ejs +22 -0
  4. package/assets/markdown/confirm-delete-android-serviceaccountkey.md.ejs +24 -0
  5. package/assets/markdown/confirm-delete-apple-credential.md.ejs +29 -0
  6. package/dist/{AppleBundleIdDetails-N_j1wv6f.js → AppleBundleIdDetails-KMzyex1H.js} +3 -5
  7. package/dist/{Command-DN1j3tjt.js → Command-CHh8RDXK.js} +1 -2
  8. package/dist/{CommandGame-D2NqytWc.js → CommandGame-Rvmsa7b0.js} +2 -2
  9. package/dist/{Create-BRdv5jXQ.js → Create-DInZ_pw-.js} +1 -4
  10. package/dist/{GameStatus-joyHPy0f.js → GameStatus-D7ID10tS.js} +1 -4
  11. package/dist/{Import-BNMHsJoM.js → Import-BmO8EYKj.js} +2 -5
  12. package/dist/{JobLogTail-D35FO5v-.js → JobLogTail-CYdceTKL.js} +2 -5
  13. package/dist/{JobProgress-D-9KESaA.js → JobProgress-DBCYbWrO.js} +16 -18
  14. package/dist/{JobStatusTable-DIJ_h-gi.js → JobStatusTable-DhnhY1_i.js} +2 -4
  15. package/dist/{ProjectCredentialsTable-BMKgv99h.js → ProjectCredentialsTable-BDYVYqAq.js} +5 -3
  16. package/dist/{UserCredentialsTable-CUrTDzTK.js → UserCredentialsTable-cDPvjF-F.js} +4 -4
  17. package/dist/{baseAppleCommand-Cs9a52e5.js → baseAppleCommand-CQ5dOna7.js} +1 -1
  18. package/dist/{baseGameAndroidCommand-BCB1SMCf.js → baseGameAndroidCommand-D4ryZS6A.js} +1 -2
  19. package/dist/commands/apiKey/create.js +3 -6
  20. package/dist/commands/apiKey/list.js +3 -6
  21. package/dist/commands/apiKey/revoke.js +3 -6
  22. package/dist/commands/apple/apiKey/create.js +7 -10
  23. package/dist/commands/apple/apiKey/delete.js +118 -0
  24. package/dist/commands/apple/apiKey/export.js +6 -9
  25. package/dist/commands/apple/apiKey/import.js +6 -9
  26. package/dist/commands/apple/apiKey/status.js +4 -7
  27. package/dist/commands/apple/certificate/create.js +7 -10
  28. package/dist/commands/apple/certificate/delete.js +127 -0
  29. package/dist/commands/apple/certificate/export.js +6 -9
  30. package/dist/commands/apple/certificate/import.js +6 -9
  31. package/dist/commands/apple/certificate/status.js +4 -7
  32. package/dist/commands/apple/login.js +23 -4
  33. package/dist/commands/apple/status.js +4 -7
  34. package/dist/commands/dashboard.js +12 -1
  35. package/dist/commands/game/android/apiKey/connect.js +8 -11
  36. package/dist/commands/game/android/apiKey/create.js +10 -13
  37. package/dist/commands/game/android/apiKey/delete.js +100 -0
  38. package/dist/commands/game/android/apiKey/export.js +6 -9
  39. package/dist/commands/game/android/apiKey/import.js +6 -9
  40. package/dist/commands/game/android/apiKey/invite.js +14 -4
  41. package/dist/commands/game/android/apiKey/policy.js +3 -6
  42. package/dist/commands/game/android/apiKey/status.js +6 -9
  43. package/dist/commands/game/android/keyStore/create.js +7 -10
  44. package/dist/commands/game/android/keyStore/delete.js +100 -0
  45. package/dist/commands/game/android/keyStore/export.js +5 -8
  46. package/dist/commands/game/android/keyStore/import.js +8 -11
  47. package/dist/commands/game/android/keyStore/status.js +7 -10
  48. package/dist/commands/game/android/status.js +13 -1
  49. package/dist/commands/game/build/download.js +3 -6
  50. package/dist/commands/game/build/list.js +4 -7
  51. package/dist/commands/game/create.js +13 -2
  52. package/dist/commands/game/details.js +4 -7
  53. package/dist/commands/game/export.js +13 -1
  54. package/dist/commands/game/ios/app/addTester.js +4 -7
  55. package/dist/commands/game/ios/app/create.js +3 -6
  56. package/dist/commands/game/ios/app/status.js +6 -9
  57. package/dist/commands/game/ios/app/sync.js +4 -7
  58. package/dist/commands/game/ios/profile/create.js +6 -9
  59. package/dist/commands/game/ios/profile/delete.js +123 -0
  60. package/dist/commands/game/ios/profile/export.js +5 -8
  61. package/dist/commands/game/ios/profile/import.js +5 -8
  62. package/dist/commands/game/ios/profile/status.js +8 -51
  63. package/dist/commands/game/ios/status.js +10 -13
  64. package/dist/commands/game/ios/wizard.js +2 -6
  65. package/dist/commands/game/job/list.js +3 -6
  66. package/dist/commands/game/job/status.js +8 -11
  67. package/dist/commands/game/list.js +3 -6
  68. package/dist/commands/game/ship.js +17 -14
  69. package/dist/commands/game/status.js +7 -10
  70. package/dist/commands/game/wizard.js +14 -17
  71. package/dist/commands/internal/fastlane.js +13 -1
  72. package/dist/commands/internal/readme.js +13 -4
  73. package/dist/commands/login.js +27 -4
  74. package/dist/commands/status.js +6 -8
  75. package/dist/{export-DFCZKNQk.js → export-DujIwhJw.js} +1 -1
  76. package/dist/{import-BpGyif-m.js → import-DGCqCAcC.js} +1 -1
  77. package/dist/{index-DlE_SPt3.js → index-9LxGafAo.js} +3 -5
  78. package/dist/{index-BTXEUd8W.js → index-BPh_qt7t.js} +4 -6
  79. package/dist/index-CNsmEDXi.js +48 -0
  80. package/dist/index-CmuXyPed.js +1905 -0
  81. package/dist/{upload-D19OQsbn.js → upload-D4x4yCia.js} +1 -1
  82. package/dist/{useAppleApp-BZc_cNa-.js → useAppleApp-taaewPSf.js} +1 -1
  83. package/dist/{useAppleBundleId-DvMXAvWD.js → useAppleBundleId-BeGViMe7.js} +1 -1
  84. package/dist/useAppleProfiles-1TtO0aO6.js +63 -0
  85. package/dist/{useGoogleStatus-Cx_QIsXa.js → useGoogleStatus-CSsxEvX7.js} +1 -2
  86. package/dist/{useProjectCredentials-DxdwJCfU.js → useProjectCredentials-Cm50WMZU.js} +1 -3
  87. package/dist/{useWebSocket-cM5yOcDv.js → useWebSocket-BVfn36be.js} +1 -1
  88. package/docs/apple/apiKey/delete.md +25 -0
  89. package/docs/apple/apiKey.md +26 -0
  90. package/docs/apple/certificate/delete.md +25 -0
  91. package/docs/apple/certificate.md +26 -0
  92. package/docs/assets/st.png +0 -0
  93. package/docs/game/android/apiKey/delete.md +25 -0
  94. package/docs/game/android/apiKey.md +26 -0
  95. package/docs/game/android/keyStore/delete.md +25 -0
  96. package/docs/game/android/keyStore.md +26 -0
  97. package/docs/game/ios/profile/delete.md +26 -0
  98. package/docs/game/ios/profile.md +27 -0
  99. package/docs/game/ship.md +4 -4
  100. package/docs/login.md +6 -2
  101. package/docs/status.md +1 -1
  102. package/package.json +13 -2
  103. package/dist/ejs-DirFZbza.js +0 -716
  104. package/dist/index-BwnzoldS.js +0 -784
  105. package/dist/index-CJWMt1s-.js +0 -153
  106. package/dist/index-hoHfGrjg.js +0 -221
  107. package/dist/index-izrACZbC.js +0 -24
  108. package/dist/useAndroidServiceAccountTestResult-CwKeW0ED.js +0 -50
package/README.md CHANGED
@@ -1,54 +1,33 @@
1
- <h1 align="center">
2
- <a href="https://shipth.is">
1
+ # ShipThis <a href="https://discord.gg/gPjn3S99k4"><img alt="discord" src="https://img.shields.io/discord/1304144717239554069?style=flat-square&label=%F0%9F%92%AC%20discord&color=00ACD7"></a><a href="https://shipth.is/?ref=github_readme"><img src="docs/assets/st.png" align="right" height="80" alt="ShipThis" /></a>
2
+
3
+ - Build and publish Godot mobile games to the **App Store** and **Google Play**
4
+ - Handles certificates, keystores, API keys, and provisioning profiles
5
+ - Cloud builds are free for most solo-devs
6
+
7
+ <p align="center">
8
+ <a href="https://shipth.is/docs/reference/game/ship?ref=github_readme">
3
9
  <picture>
4
- <source height="56" width="260" srcset="docs/assets/logo_dark.svg" media="(prefers-color-scheme: dark)">
5
- <img height="56" width="260" alt="ShipThis Home" src="docs/assets/logo_light.svg">
10
+ <img height="266" width="504" alt="ShipThis Command - ship output" src="docs/assets/ship-outputx0.8.gif">
6
11
  </picture>
7
12
  </a>
8
- <br>
9
- <a href="https://discord.gg/gPjn3S99k4">
10
- <img alt="discord" src="https://img.shields.io/discord/1304144717239554069?style=flat-square&label=%F0%9F%92%AC%20discord&color=00ACD7">
11
- </a>
12
- </h1>
13
- <p align="center">
14
- <b>ShipThis</b> is a <b>command line tool</b> for building and uploading your <a href="https://godotengine.org/">Godot</a> mobile games to the <b>Apple App Store</b> and <b>Google Play</b>.
15
- </p>
16
- <p align="center">
17
- ShipThis compiles your game on managed cloud servers. You do not need Xcode, Android Studio, or SDK installations. You can run it manually or from CI.
18
13
  </p>
19
14
 
20
- <p align="center">
21
- <picture>
22
- <img height="266" width="504" alt="ShipThis Command - ship output" src="docs/assets/ship-outputx0.8.gif">
23
- </picture>
24
- </p>
25
-
26
-
27
15
  > [!IMPORTANT]
28
- > ShipThis is in open beta. While in beta, it is completely free to use.
29
-
30
- ---
31
-
32
- ## Why use ShipThis?
33
-
34
- - **Always a free tier** - Enough build minutes for most solo devs
35
- - **One-command setup** - Use the interactive [`wizard`](https://shipth.is/docs/reference/game/wizard) to configure your game
36
- - **No additional tools** - No Xcode, Android Studio, or SDK installation required
37
- - **Simplified provisioning** - We handle iOS certificates, Android keystores, app signing, and API keys
38
- - **One-command deployment** - Publish to TestFlight or Google Play with a single command
16
+ > Currently in open beta and free to use. It will **always** be free for most solo devs.
39
17
 
40
18
  ## Quick start
41
19
 
42
20
  ### Requirements
43
21
 
44
- - A Godot 3.6 or 4.X game
22
+ - A Godot 3.6 or 4.x game
45
23
  - [Node.js](https://nodejs.org/en/download/) version 18.0 or above
46
24
  - **To publish an Android game** - a [Play Console developer account](https://play.google.com/apps/publish/signup) (not required for building an APK/AAB)
47
25
  - **To build an iOS game** - an [Apple Developer account](https://developer.apple.com)
48
26
 
49
27
  ### 1. Install ShipThis
50
28
 
51
- ShipThis can be installed as a package via the [NPM package manager](https://www.npmjs.com/). Run the following at the command line:
29
+
30
+ Install via the [NPM package manager](https://www.npmjs.com/):
52
31
 
53
32
  ```bash
54
33
  npm install -g shipthis
@@ -56,9 +35,8 @@ npm install -g shipthis
56
35
 
57
36
  ### 2. Create an account
58
37
 
59
- Set up an account with ShipThis by logging in for the first time using the [`shipthis login`](https://shipth.is/docs/reference/login) command.
38
+ Set up an account with ShipThis by logging in for the first time using the [`shipthis login`](https://shipth.is/docs/reference/login?ref=github_readme) command.
60
39
 
61
- > 🛠 All builds run on managed cloud servers - no need to install Xcode or Android Studio locally.
62
40
 
63
41
  ```bash
64
42
  shipthis login
@@ -66,7 +44,7 @@ shipthis login
66
44
 
67
45
  ### 3. Set up your game
68
46
 
69
- Run the [wizard command](https://shipth.is/docs/reference/game/wizard) to configure your game on ShipThis. The command takes a platform parameter - this can be either **android** or **ios**. Run this command from within a Godot game directory (with a **project.godot** file):
47
+ Run the [wizard command](https://shipth.is/docs/reference/game/wizard?ref=github_readme) to configure your game on ShipThis. The command takes a platform parameter - this can be either **android** or **ios**. Run this command from within a Godot game directory (with a **project.godot** file):
70
48
 
71
49
  #### Set up an Android game
72
50
 
@@ -104,34 +82,49 @@ shipthis game wizard ios
104
82
 
105
83
  ### 4. Ship
106
84
 
107
- Now you can publish new versions of your game to TestFlight or Google Play with the [`shipthis game ship`](https://shipth.is/docs/reference/game/ship) command:
85
+ Now you can publish new versions of your game to TestFlight or Google Play with the [`shipthis game ship`](https://shipth.is/docs/reference/game/ship?ref=github_readme) command:
108
86
 
109
87
  ```bash
110
88
  shipthis game ship
111
89
  ```
112
90
 
113
- - Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting) or [join our Discord](https://discord.gg/gPjn3S99k4)
114
- - For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs)
91
+ - Having issues? Check the [Troubleshooting](https://shipth.is/docs/troubleshooting?ref=github_readme) or [join our Discord](https://discord.gg/gPjn3S99k4)
92
+ - For detailed documentation, visit [shipth.is/docs](https://shipth.is/docs?ref=github_readme)
115
93
 
116
94
 
117
95
  ## FAQ
118
96
 
119
- <details>
120
- <summary><strong>Can I build my game as APK without a Google Play account?</strong></summary>
97
+ ### Do I need a Mac to build for iOS?
121
98
 
122
- ---
99
+ No, you do not need a Mac, but you will need an Apple Developer Account.
123
100
 
124
- Yes.
101
+ ShipThis handles iOS builds on managed macOS cloud servers. The CLI connects to the Apple Developer Portal and sets everything up for you.
102
+
103
+ ### Which versions of Godot are supported?
125
104
 
126
- Running the wizard command will create a Service Account Key for automatic publishing, you might not need this when initially building your game.
105
+ We support **all stable Godot versions since 3.6**, including:
127
106
 
128
- You can run the steps below to create a ShipThis account, create the game, create a keystore, and then run the ship command. Later, when you need to setup publishing you can re-run the wizard command.
107
+ | [3.6](https://github.com/godotengine/godot/releases/tag/3.6-stable) | [4.0](https://github.com/godotengine/godot/releases/tag/4.0-stable) | [4.1](https://github.com/godotengine/godot/releases/tag/4.1-stable) | [4.2](https://github.com/godotengine/godot/releases/tag/4.2-stable) | [4.3](https://github.com/godotengine/godot/releases/tag/4.3-stable) | [4.4](https://github.com/godotengine/godot/releases/tag/4.4-stable) | [4.5](https://github.com/godotengine/godot/releases/tag/4.5-stable) |
108
+ |---------------------------------------------------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|
109
+ | [3.6.1](https://github.com/godotengine/godot/releases/tag/3.6.1-stable) | [4.0.1](https://github.com/godotengine/godot/releases/tag/4.0.1-stable) | [4.1.1](https://github.com/godotengine/godot/releases/tag/4.1.1-stable) | [4.2.1](https://github.com/godotengine/godot/releases/tag/4.2.1-stable) | [4.3.1 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.3.1) | [4.4.1](https://github.com/godotengine/godot/releases/tag/4.4.1-stable) | |
110
+ | [3.7-dev *](https://github.com/shipth-is/godot-3.x-builds/releases/tag/godot-3.x-8c10cd6) | [4.0.2](https://github.com/godotengine/godot/releases/tag/4.0.2-stable) | [4.1.2](https://github.com/godotengine/godot/releases/tag/4.1.2-stable) | [4.2.2](https://github.com/godotengine/godot/releases/tag/4.2.2-stable) | | [4.4.2 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.4.2) | |
111
+ | | [4.0.3](https://github.com/godotengine/godot/releases/tag/4.0.3-stable) | [4.1.3](https://github.com/godotengine/godot/releases/tag/4.1.3-stable) | [4.2.3 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.2.3) | | | |
112
+ | | [4.0.4](https://github.com/godotengine/godot/releases/tag/4.0.4-stable) | [4.1.4](https://github.com/godotengine/godot/releases/tag/4.1.4-stable) | | | | |
113
+ | | [4.0.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.0.5) | [4.1.5 *](https://github.com/shipth-is/godot-android-sdk-upgrade/releases/tag/4.1.5) | | | | |
129
114
 
115
+ **\* Custom builds** - [maintained by us](https://github.com/shipth-is/godot-android-sdk-upgrade/) to support **Android SDK 35**.
130
116
 
131
- ```bash
132
- # Create or login to your shipthis account (OTP based login)
133
- shipthis login --email me@email.com
117
+ You can read more in our [Godot versioning guide](https://shipth.is/docs/guides/godot-versioning?ref=github_readme).
118
+
119
+ ### Can I build my game as APK/AAB without a Google Play account?
120
+
121
+ Yes.
122
+
123
+ Running the wizard command will create a Service Account Key for automatic publishing, but you might not need this when initially building your game.
124
+
125
+ You can create a ShipThis account, create the game, create a keystore, and then run the ship command. Later, when you need to set up publishing, you can re-run the wizard command.
134
126
 
127
+ ```bash
135
128
  # Create a ShipThis game - run this in a dir with a project.godot file
136
129
  shipthis game create --name "My Game" --androidPackageName "com.my.game"
137
130
 
@@ -142,73 +135,231 @@ shipthis game android keyStore create
142
135
  shipthis game ship --follow --platform android --skipPublish --downloadAPK game.apk
143
136
  ```
144
137
 
138
+ ### Do I need to create an export_presets.cfg file?
145
139
 
146
- </details>
140
+ No, the ShipThis build server will generate a valid **export_presets.cfg** for your game.
147
141
 
142
+ If you provide an **export_presets.cfg** file, the desired preset values will be merged with the generated file.
148
143
 
149
- <details>
150
- <summary><strong>Do I need a Mac to build for iOS?</strong></summary>
144
+ ### How much does it cost to use ShipThis?
151
145
 
152
- ---
146
+ Currently free while in open beta. Planned pricing is on the [pricing page](https://shipth.is/pricing?ref=github_readme).
153
147
 
154
- No, you do not need a Mac, but you will need an Apple Developer Account.
148
+ ### What does the `shipthis game wizard` do?
155
149
 
156
- ShipThis handles iOS builds on managed macOS cloud servers. The command-line tool communicates with the Apple Developer Portal to configure everything on your behalf.
150
+ The wizard command runs different steps for Android and iOS. Each "step" is another ShipThis command - meaning you can run each step by itself. The wizard can be re-run any number of times.
157
151
 
158
- </details>
152
+ The Android steps are described in the [Android set-up guide](https://shipth.is/docs/android?ref=github_readme).
153
+ The iOS steps are described in the [iOS setup guide](https://shipth.is/docs/ios).
159
154
 
160
155
  <details>
161
- <summary><strong>Which versions of Godot are supported?</strong></summary>
156
+ <summary><strong>The commands run for Android</strong></summary>
162
157
 
163
- ---
158
+ 1. Creating a new ShipThis game
164
159
 
165
- We support **all stable Godot versions since 3.6**, including:
160
+ ```bash
161
+ shipthis game create --name "Pay2Lose" --androidPackageName "com.pay.two.lose"
162
+ ```
163
+
164
+ 1. Creating or importing an Android Keystore
165
+
166
+ To create a new Keystore:
167
+
168
+ ```bash
169
+ shipthis game android keyStore create
170
+ ```
171
+
172
+ To import an existing Keystore see [the docs for the `shipthis game android keyStore import` command](https://shipth.is/docs/reference/game/android/keyStore?ref=github_readme#game-android-keystore-import)
173
+
174
+ 1. Connecting ShipThis with Google
175
+
176
+ Once connected, ShipThis can generate a Service Account API Key for automatic publishing.
166
177
 
167
- | 3.6 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 |
168
- |---------|----------|----------|--------|-----|--------|
169
- | 3.6.1 | 4.0.1 | 4.1.1 | 4.2.1 | | 4.4.1 |
170
- | | 4.0.2 | 4.1.2 | 4.2.2 | | |
171
- | | 4.0.3 | 4.1.3 | | | |
172
- | | 4.0.4 | 4.1.4 | | | |
178
+ ```bash
179
+ shipthis game android apiKey connect
180
+ ```
173
181
 
174
- You can read more in our [Godot versioning guide](https://shipth.is/docs/guides/godot-versioning).
182
+ 1. Create a Service Account and API Key
183
+
184
+ ```bash
185
+ shipthis game android apiKey create
186
+ ```
187
+
188
+ 1. Create and download an initial build (AAB file)
189
+
190
+ When you first create your game in the Google Play Console, you will be asked to upload an initial build in AAB format.
191
+
192
+ ```bash
193
+ shipthis game ship --platform android --follow --skipPublish --download game.aab
194
+ ```
195
+
196
+ 1. Create an app in the Google Play Console
197
+
198
+ You will need to manually create the game itself in Google Play. This will involve entering the name, agreeing to Google Play's TOS and uploading an initial build.
199
+
200
+ 1. Invite the Service Account
201
+
202
+ Before the Service Account API Key can submit your games automatically, you will need to invite the Service Account to your Google Play account. To do this you will need your Google Play Account ID.
203
+
204
+ ```bash
205
+ shipthis game android apiKey invite XXXXXXXXX
206
+ ```
175
207
 
176
208
  </details>
177
209
 
178
210
  <details>
179
- <summary><strong>Do I need to create an export_presets.cfg file?</strong></summary>
211
+ <summary><strong>The commands run for iOS</strong></summary>
180
212
 
181
- ---
213
+ 1. Create a new ShipThis game
182
214
 
183
- No, the ShipThis build server will generate a valid **export_presets.cfg** for your game.
215
+ ```bash
216
+ shipthis game create --name "Tap to Win Nothing" --iosBundleId "com.tap.to.win.nothing"
217
+ ```
184
218
 
185
- If you provide an **export_presets.cfg** file, the desired preset values will be merged with the generated file.
219
+ 1. Connect ShipThis with Apple
220
+
221
+ We recommend enabling 2FA for your account. ShipThis generates a session cookie for communicating with the Apple Developer Portal.
222
+
223
+ ```bash
224
+ shipthis apple login
225
+ ```
226
+
227
+ 1. Create an App Store Connect API Key
228
+
229
+ ShipThis uses this API key to submit new versions of your game.
230
+
231
+ ```bash
232
+ shipthis apple apiKey create
233
+ ```
234
+
235
+ 1. Create an iOS Distribution Certificate
236
+
237
+ This certificate is used to sign your game on the ShipThis build servers.
238
+
239
+ ```bash
240
+ shipthis apple certificate create
241
+ ```
242
+
243
+ 1. Create an App Store App and BundleId
244
+
245
+ ```bash
246
+ shipthis game ios app create
247
+ ```
248
+
249
+ 1. Synchronize Permissions (Capabilities)
250
+
251
+ ShipThis reads `export_presets.cfg` and enables supported capabilities in the Apple Developer Portal (currently Access WiFi, Push Notifications).
252
+
253
+ ```bash
254
+ shipthis game ios app sync
255
+ ```
256
+
257
+ 1. Create a Provisioning Profile
258
+
259
+ Required to run on devices and for distribution. You can view profiles at Apple’s portal: https://developer.apple.com/account/resources/profiles/list
260
+
261
+ ```bash
262
+ shipthis game ios profile create
263
+ ```
186
264
 
187
265
  </details>
188
266
 
189
267
  <details>
190
- <summary><strong>How much does it cost to use ShipThis?</strong></summary>
268
+ <summary><strong>Watch: The wizard run for Android</strong></summary>
269
+
270
+ <p align="center">
271
+ <picture>
272
+ <img height="431" width="672" alt="ShipThis Command - Android Wizard - published game" src="docs/assets/wizard-android-existingx0.5.gif">
273
+ </picture>
274
+ </p>
275
+
276
+ </details>
191
277
 
192
- ---
278
+ <details>
279
+ <summary><strong>Watch: The wizard run for iOS</strong></summary>
193
280
 
194
- ShipThis is currently in open-beta as so it is completely free to use. You can see our planned pricing on the [pricing page](https://shipth.is/pricing).
281
+ <p align="center">
282
+ <a href="https://www.youtube.com/watch?v=ijTUFVk1duw" target="_blank">
283
+ <img src="https://img.youtube.com/vi/ijTUFVk1duw/0.jpg" alt="Watch the iOS setup video" width="640" height="480">
284
+ </a>
285
+ </p>
195
286
 
196
287
  </details>
197
288
 
289
+ ### How do I debug a failed build?
290
+
291
+ If a build fails, rerun it for only the failing platform with the `--follow` flag to view the logs in real time:
292
+
293
+ ```bash
294
+ shipthis game ship --platform android --follow
295
+ ```
296
+
297
+ For additional debugging, you can include the `--verbose` flag - this enables detailed logging locally and on the build server, including running the Godot export with verbose output:
298
+
299
+ ```bash
300
+ shipthis game ship --platform ios --follow --verbose
301
+ ```
302
+
303
+ You can review logs at any time in the [dashboard](https://shipth.is/dashboard?ref=github_readme) under the "Jobs" tab.
304
+
305
+ See the [Troubleshooting Guide](https://shipth.is/docs/troubleshooting?ref=github_readme) for common checks.
306
+
307
+ If the issue persists, we can help you directly in our [Discord](https://discord.gg/gPjn3S99k4).
308
+
309
+ ### Does ShipThis work with CI/CD pipelines?
310
+
311
+ Yes. ShipThis works with CI/CD pipelines, allowing you to run automated builds without an interactive shell.
312
+
313
+ To get started, create an API key, for your pipeline environment:
314
+
315
+ ```bash
316
+ # API keys can have a maximum lifetime of 1 year
317
+ shipthis apiKey create --durationDays 365 --name ci-key
318
+ ```
319
+
320
+ The secret value will only be displayed once and this can be used as an environment variable called `SHIPTHIS_TOKEN`.
321
+
322
+ ```bash
323
+ export SHIPTHIS_TOKEN=your_token_here
324
+ shipthis game ship --platform android --follow
325
+ shipthis game ship --platform ios --follow
326
+ ```
327
+
328
+ For GitHub users, we provide an official **GitHub Action** for easy integration: https://github.com/shipth-is/action
329
+
330
+ See the [API Keys documentation](https://shipth.is/docs/reference/apiKey/?ref=github_readme) for more information.
331
+
332
+ ### How are my credentials stored and secured?
333
+
334
+ ShipThis uses short-lived, signed URLs and ephemeral build environments.
335
+
336
+ - Credentials are stored in a private DigitalOcean Space.
337
+ - Every access is logged for a full audit trail.
338
+ - When a build starts, credentials are fetched on-demand and loaded as environment variables.
339
+ - Temporary files are created only if needed and cleaned up when the job finishes.
340
+
341
+ We store:
342
+
343
+ - Android Keystores
344
+ - Google Play Service Account API keys
345
+ - iOS provisioning profiles
346
+ - App Store Connect API keys
347
+ - iOS distribution certificates
348
+
198
349
  ## 📖 Command Reference
199
350
 
200
351
  ### 🗂 Topics
201
352
 
202
- - [apiKey](https://shipth.is/docs/reference/apiKey) - Commands related to ShipThis API Keys
203
- - [apple](https://shipth.is/docs/reference/apple) - Commands that relate to linking your ShipThis account with your Apple Developer Account
204
- - [game](https://shipth.is/docs/reference/game) - Commands that relate to configuring the specific game in the current working directory.
353
+ - [apiKey](https://shipth.is/docs/reference/apiKey?ref=github_readme) - Commands related to ShipThis API Keys
354
+ - [apple](https://shipth.is/docs/reference/apple?ref=github_readme) - Commands that relate to linking your ShipThis account with your Apple Developer Account
355
+ - [game](https://shipth.is/docs/reference/game?ref=github_readme) - Commands that relate to configuring the specific game in the current working directory.
205
356
 
206
357
  ### 🔧 Commands
207
358
 
208
- - [dashboard](https://shipth.is/docs/reference/dashboard) - Opens the web browser to your shipth.is dashboard
209
- - [login](https://shipth.is/docs/reference/login) - Sign in or create a new account
210
- - [status](https://shipth.is/docs/reference/status) - Display your overall ShipThis account status
211
- - [help](https://shipth.is/docs/reference/help) - Display help for a specific topic or command
359
+ - [dashboard](https://shipth.is/docs/reference/dashboard?ref=github_readme) - Opens the web browser to your shipth.is dashboard
360
+ - [login](https://shipth.is/docs/reference/login?ref=github_readme) - Sign in or create a new account
361
+ - [status](https://shipth.is/docs/reference/status?ref=github_readme) - Display your overall ShipThis account status
362
+ - [help](https://shipth.is/docs/reference/help?ref=github_readme) - Display help for a specific topic or command
212
363
 
213
364
  ## 🌍 Community
214
365
 
@@ -0,0 +1,12 @@
1
+ # Warning - there are changes to our agreements:
2
+
3
+ <% changes.forEach((agreement) => { %>
4
+ ## <%= agreement.agreementType === 'PRIVACY_POLICY' ? 'Privacy Policy' : 'Terms and Conditions' %> Update (<%= agreement.versionName %>)
5
+ **<%= agreement.description %>**
6
+ Read more: <%= agreement.url %>
7
+
8
+ <% }); %>
9
+
10
+ Hide this message by running: `shipthis login --acceptAgreements`
11
+
12
+ ---
@@ -0,0 +1,22 @@
1
+ # Please confirm deletion
2
+
3
+ ## Are you sure you want to delete this Android KeyStore?
4
+
5
+ <% if (immediate) { %>
6
+ - This action **will delete the credential from ShipThis immediately and cannot be undone**.
7
+ <% } else { %>
8
+ - This action **will delete the credential from ShipThis in the next 24 hours and cannot be undone**.
9
+ - To delete the credential immediately, rerun the command with the `--immediate` flag.
10
+ <% } %>
11
+
12
+ ## Export your credential (optional but recommended)
13
+
14
+ If you haven't already done so, you can export your credential to a local file for safekeeping before deleting it. You can do this by running the following command:
15
+
16
+ ```bash
17
+ <%= exportCommand %>
18
+ ```
19
+
20
+ ## Confirm deletion
21
+
22
+ Please type **<%= confirmString %>** to confirm, or rerun the command with the `--iAmSure` flag.
@@ -0,0 +1,24 @@
1
+ # Please confirm deletion
2
+
3
+ ## Are you sure you want to delete this Android Service Account API Key?
4
+
5
+ <% if (immediate) { %>
6
+ - This action **will delete the credential from ShipThis immediately and cannot be undone**.
7
+ <% } else { %>
8
+ - This action **will delete the credential from ShipThis in the next 24 hours and cannot be undone**.
9
+ - To delete the credential immediately, rerun the command with the `--immediate` flag.
10
+ <% } %>
11
+
12
+ **Note: this will NOT delete the Service Account in Google Cloud Console. You will need to do that manually if you wish to fully delete the Service Account.**
13
+
14
+ ## Export your credential (optional but recommended)
15
+
16
+ If you haven't already done so, you can export your credential to a local file for safekeeping before deleting it. You can do this by running the following command:
17
+
18
+ ```bash
19
+ <%= exportCommand %>
20
+ ```
21
+
22
+ ## Confirm deletion
23
+
24
+ Please type **<%= confirmString %>** to confirm, or rerun the command with the `--iAmSure` flag.
@@ -0,0 +1,29 @@
1
+ # Please confirm deletion
2
+
3
+ ## Are you sure you want to delete this <%= credentialType %>?
4
+
5
+ <% if (immediate) { %>
6
+ - This action **will delete the credential from ShipThis immediately and cannot be undone**.
7
+ <% } else { %>
8
+ - This action **will delete the credential from ShipThis in the next 24 hours and cannot be undone**.
9
+ - To delete the credential immediately, rerun the command with the `--immediate` flag.
10
+ <% } %>
11
+ <% if (revokeInApple) { %>
12
+ - This action **will also revoke the credential in Apple and cannot be undone**.
13
+ <% } else { %>
14
+ - This action will **NOT** revoke the credential in Apple.
15
+ - To also revoke the credential in Apple, rerun the command with the `--revokeInApple` flag.
16
+ <% } %>
17
+
18
+ ## Export your credential (optional but recommended)
19
+
20
+ If you haven't already done so, you can export your credential to a local file for safekeeping before deleting it. You can do this by running the following command:
21
+
22
+ ```bash
23
+ <%= exportCommand %>
24
+ ```
25
+
26
+ ## Confirm deletion
27
+
28
+ Please type **<%= confirmString %>** to confirm, or rerun the command with the `--iAmSure` flag.
29
+
@@ -11,13 +11,13 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import './index-BwnzoldS.js';
14
+ import './index-CmuXyPed.js';
15
15
  import '@oclif/core';
16
16
  import '@tanstack/react-query';
17
17
  import 'react';
18
18
  import 'crypto-js';
19
19
  import 'uuid';
20
- import { u as useAppleApp } from './useAppleApp-BZc_cNa-.js';
20
+ import { u as useAppleApp } from './useAppleApp-taaewPSf.js';
21
21
  import 'fast-glob';
22
22
  import 'yazl';
23
23
  import 'socket.io-client';
@@ -27,12 +27,10 @@ import { T as Title } from './Title-BCQtayg6.js';
27
27
  import 'string-length';
28
28
  import 'strip-ansi';
29
29
  import 'open';
30
- import './index-hoHfGrjg.js';
31
- import './ejs-DirFZbza.js';
32
30
  import 'marked';
33
31
  import 'marked-terminal';
34
32
  import 'qrcode';
35
- import { u as useAppleBundleId } from './useAppleBundleId-DvMXAvWD.js';
33
+ import { u as useAppleBundleId } from './useAppleBundleId-BeGViMe7.js';
36
34
 
37
35
  const AppleAppDetails = (props) => {
38
36
  const { data, isLoading } = useAppleApp(props);
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { QueryClientProvider } from '@tanstack/react-query';
3
3
  import { useScreenSize } from 'fullscreen-ink';
4
4
  import { Box } from 'ink';
5
- import { K as queryClient } from './index-BwnzoldS.js';
5
+ import { X as queryClient, Y as CommandProvider } from './index-CmuXyPed.js';
6
6
  import 'axios';
7
7
  import 'node:fs';
8
8
  import 'crypto-js';
@@ -19,7 +19,6 @@ import 'react';
19
19
  import 'socket.io-client';
20
20
  import 'fast-glob';
21
21
  import 'yazl';
22
- import { b as CommandProvider } from './index-hoHfGrjg.js';
23
22
 
24
23
  const Command = ({ children, command }) => {
25
24
  const { width } = useScreenSize();
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { c as GameProvider } from './index-hoHfGrjg.js';
3
- import { C as Command } from './Command-DN1j3tjt.js';
2
+ import { Z as GameProvider } from './index-CmuXyPed.js';
3
+ import { C as Command } from './Command-CHh8RDXK.js';
4
4
 
5
5
  const CommandGame = ({ children, command }) => /* @__PURE__ */ jsx(Command, { command, children: /* @__PURE__ */ jsx(GameProvider, { children }) });
6
6
 
@@ -3,7 +3,7 @@ import { useQueryClient } from '@tanstack/react-query';
3
3
  import axios from 'axios';
4
4
  import { Box } from 'ink';
5
5
  import { useContext } from 'react';
6
- import { p as getAuthedHeaders, o as API_URL } from './index-BwnzoldS.js';
6
+ import { R as GameContext, t as getAuthedHeaders, s as API_URL, a0 as cacheKeys } from './index-CmuXyPed.js';
7
7
  import 'ink-spinner';
8
8
  import 'node:crypto';
9
9
  import 'node:fs';
@@ -14,7 +14,6 @@ import 'readline-sync';
14
14
  import 'luxon';
15
15
  import 'isomorphic-git';
16
16
  import '@oclif/core';
17
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
18
17
  import 'fast-glob';
19
18
  import 'uuid';
20
19
  import 'yazl';
@@ -24,12 +23,10 @@ import 'string-length';
24
23
  import 'strip-ansi';
25
24
  import 'open';
26
25
  import '@inkjs/ui';
27
- import './ejs-DirFZbza.js';
28
26
  import 'marked';
29
27
  import 'marked-terminal';
30
28
  import 'qrcode';
31
29
  import { R as RunWithSpinner } from './RunWithSpinner-DucRnFp6.js';
32
- import { G as GameContext } from './index-hoHfGrjg.js';
33
30
 
34
31
  const CreateKeystore = ({ onComplete, onError, ...boxProps }) => {
35
32
  const { gameId } = useContext(GameContext);
@@ -1,9 +1,8 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { Text, Box } from 'ink';
3
3
  import { useState, useEffect, useContext } from 'react';
4
- import { b as getShortDate, P as Platform, E as getProject, F as getProjectPlatformProgress } from './index-BwnzoldS.js';
4
+ import { g as getShortUUID, f as getShortDate, P as Platform, N as makeHumanReadable, O as getProject, Q as getProjectPlatformProgress, R as GameContext, S as CommandContext } from './index-CmuXyPed.js';
5
5
  import 'ink-spinner';
6
- import { g as getShortUUID, m as makeHumanReadable } from './index-CJWMt1s-.js';
7
6
  import '@tanstack/react-query';
8
7
  import 'axios';
9
8
  import 'luxon';
@@ -19,12 +18,10 @@ import { S as StatusTable } from './StatusTable-DzRWcMr4.js';
19
18
  import 'open';
20
19
  import '@inkjs/ui';
21
20
  import 'node:path';
22
- import './ejs-DirFZbza.js';
23
21
  import 'marked';
24
22
  import 'marked-terminal';
25
23
  import { N as NextSteps } from './NextSteps-DbJHmscQ.js';
26
24
  import 'qrcode';
27
- import { G as GameContext, C as CommandContext } from './index-hoHfGrjg.js';
28
25
 
29
26
  function isPlatformConfigured(platform, progress) {
30
27
  if (!progress) return false;
@@ -11,7 +11,7 @@ import 'readline-sync';
11
11
  import 'luxon';
12
12
  import 'axios';
13
13
  import 'isomorphic-git';
14
- import { K as queryClient, P as Platform, C as CredentialsType } from './index-BwnzoldS.js';
14
+ import { X as queryClient, a0 as cacheKeys, P as Platform, C as CredentialsType, R as GameContext } from './index-CmuXyPed.js';
15
15
  import '@oclif/core';
16
16
  import { useMutation } from '@tanstack/react-query';
17
17
  import 'crypto-js';
@@ -24,13 +24,10 @@ import 'string-length';
24
24
  import 'strip-ansi';
25
25
  import 'open';
26
26
  import '@inkjs/ui';
27
- import './ejs-DirFZbza.js';
28
27
  import 'marked';
29
28
  import 'marked-terminal';
30
29
  import 'qrcode';
31
- import { G as GameContext } from './index-hoHfGrjg.js';
32
- import { c as cacheKeys } from './useAndroidServiceAccountTestResult-CwKeW0ED.js';
33
- import { i as importCredential } from './import-BpGyif-m.js';
30
+ import { i as importCredential } from './import-DGCqCAcC.js';
34
31
 
35
32
  async function importKeystore({ log = () => {
36
33
  }, ...opt }) {