shipup 0.2.0

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 (83) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +14 -0
  3. package/README.md +112 -0
  4. package/README.zh-CN.md +105 -0
  5. package/SECURITY.md +32 -0
  6. package/creds.example.yaml +62 -0
  7. package/dist/adapters/android/honor/api.js +360 -0
  8. package/dist/adapters/android/honor/api.js.map +1 -0
  9. package/dist/adapters/android/honor/index.js +122 -0
  10. package/dist/adapters/android/honor/index.js.map +1 -0
  11. package/dist/adapters/android/huawei/api.js +389 -0
  12. package/dist/adapters/android/huawei/api.js.map +1 -0
  13. package/dist/adapters/android/huawei/index.js +128 -0
  14. package/dist/adapters/android/huawei/index.js.map +1 -0
  15. package/dist/adapters/android/meizu/api.js +367 -0
  16. package/dist/adapters/android/meizu/api.js.map +1 -0
  17. package/dist/adapters/android/meizu/index.js +129 -0
  18. package/dist/adapters/android/meizu/index.js.map +1 -0
  19. package/dist/adapters/android/oppo/api.js +397 -0
  20. package/dist/adapters/android/oppo/api.js.map +1 -0
  21. package/dist/adapters/android/oppo/index.js +135 -0
  22. package/dist/adapters/android/oppo/index.js.map +1 -0
  23. package/dist/adapters/android/qq/api.js +184 -0
  24. package/dist/adapters/android/qq/api.js.map +1 -0
  25. package/dist/adapters/android/qq/index.js +80 -0
  26. package/dist/adapters/android/qq/index.js.map +1 -0
  27. package/dist/adapters/android/samsung/api.js +355 -0
  28. package/dist/adapters/android/samsung/api.js.map +1 -0
  29. package/dist/adapters/android/samsung/index.js +111 -0
  30. package/dist/adapters/android/samsung/index.js.map +1 -0
  31. package/dist/adapters/android/specs.js +106 -0
  32. package/dist/adapters/android/specs.js.map +1 -0
  33. package/dist/adapters/android/stub.js +27 -0
  34. package/dist/adapters/android/stub.js.map +1 -0
  35. package/dist/adapters/android/vivo/api.js +236 -0
  36. package/dist/adapters/android/vivo/api.js.map +1 -0
  37. package/dist/adapters/android/vivo/index.js +121 -0
  38. package/dist/adapters/android/vivo/index.js.map +1 -0
  39. package/dist/adapters/android/xiaomi/api.js +163 -0
  40. package/dist/adapters/android/xiaomi/api.js.map +1 -0
  41. package/dist/adapters/android/xiaomi/index.js +108 -0
  42. package/dist/adapters/android/xiaomi/index.js.map +1 -0
  43. package/dist/adapters/ios/appstore/asc.js +280 -0
  44. package/dist/adapters/ios/appstore/asc.js.map +1 -0
  45. package/dist/adapters/ios/appstore/index.js +323 -0
  46. package/dist/adapters/ios/appstore/index.js.map +1 -0
  47. package/dist/adapters/registry.js +34 -0
  48. package/dist/adapters/registry.js.map +1 -0
  49. package/dist/adapters/util.js +26 -0
  50. package/dist/adapters/util.js.map +1 -0
  51. package/dist/cli/index.js +479 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/cli/output.js +65 -0
  54. package/dist/cli/output.js.map +1 -0
  55. package/dist/core/exit.js +20 -0
  56. package/dist/core/exit.js.map +1 -0
  57. package/dist/core/orchestrator.js +24 -0
  58. package/dist/core/orchestrator.js.map +1 -0
  59. package/dist/core/types.js +20 -0
  60. package/dist/core/types.js.map +1 -0
  61. package/dist/creds/load.js +68 -0
  62. package/dist/creds/load.js.map +1 -0
  63. package/dist/creds/schema.js +30 -0
  64. package/dist/creds/schema.js.map +1 -0
  65. package/dist/infra/crypto.js +12 -0
  66. package/dist/infra/crypto.js.map +1 -0
  67. package/dist/infra/http.js +87 -0
  68. package/dist/infra/http.js.map +1 -0
  69. package/dist/pkginfo/apk-icon.js +89 -0
  70. package/dist/pkginfo/apk-icon.js.map +1 -0
  71. package/dist/pkginfo/icon.js +83 -0
  72. package/dist/pkginfo/icon.js.map +1 -0
  73. package/dist/pkginfo/index.js +33 -0
  74. package/dist/pkginfo/index.js.map +1 -0
  75. package/docs/android-markets.md +190 -0
  76. package/docs/credentials.md +72 -0
  77. package/docs/providers.md +60 -0
  78. package/lib/common.mjs +265 -0
  79. package/lib/harmony.mjs +190 -0
  80. package/lib/huawei.mjs +153 -0
  81. package/lib/ios.mjs +477 -0
  82. package/package.json +70 -0
  83. package/shipup.mjs +160 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## 0.2.0 - 2026-07-13
6
+
7
+ - Add Android multi-market upload and status commands for Huawei, Honor, OPPO,
8
+ vivo, Xiaomi, Samsung, Tencent MyApp, and Meizu.
9
+ - Add APK metadata and ABI inspection, launcher-icon extraction, image resizing,
10
+ screenshot processing, and optional store-listing metadata updates.
11
+ - Expand App Store Connect commands with bundle-ID lookup, standalone build
12
+ submission, localization metadata, and idempotent phased release.
13
+ - Support combined `android`, `harmony`, `huawei`, and `ios` credential sections
14
+ in the default credentials file.
15
+ - Add credential permission warnings and redaction for multi-market provider
16
+ errors and signed responses.
17
+ - Preserve the original HarmonyOS and Huawei compatibility commands.
18
+
19
+ ## 0.1.0 - 2026-07-13
20
+
21
+ - Add HarmonyOS AppGallery upload, submit, and status commands.
22
+ - Add Huawei Android APK upload and status commands.
23
+ - Add iOS upload, submit, status, and phased-release commands.
24
+ - Add normalized JSON output, stable exit codes, credential indirection, global
25
+ timeout handling, and dry-run validation.
package/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Zero-Clause BSD
2
+
3
+ Copyright (C) 2026 shipup contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # shipup
2
+
3
+ [![CI](https://github.com/HenryHaoson/shipup/actions/workflows/ci.yml/badge.svg)](https://github.com/HenryHaoson/shipup/actions/workflows/ci.yml)
4
+
5
+ `shipup` is a Node.js CLI for uploading, submitting, inspecting, and releasing
6
+ mobile applications across major app stores:
7
+
8
+ - HarmonyOS AppGallery Connect (`.app`);
9
+ - Android: Huawei, Honor, OPPO, vivo, Xiaomi, Samsung, Tencent MyApp, and Meizu (`.apk`);
10
+ - Apple App Store Connect (`.ipa`).
11
+
12
+ It is designed for local automation and CI: JSON goes to stdout, diagnostics go
13
+ to stderr, provider states and exit codes are normalized, and `--dry-run`
14
+ performs local validation without network requests.
15
+
16
+ > `shipup` is an independent community project and is not affiliated with or
17
+ > endorsed by any supported store operator.
18
+
19
+ ## Requirements
20
+
21
+ - Node.js 18.17 or newer.
22
+ - iOS upload requires macOS, Xcode, and `xcrun altool`.
23
+ - Android icon extraction requires Android SDK `aapt`/`aapt2`; alternatively pass `--icon`.
24
+ - Provider credentials authorized for the target application.
25
+
26
+ ## Install
27
+
28
+ Until the first npm registry release, install from a checkout or a pinned GitHub tag:
29
+
30
+ ```bash
31
+ npm install
32
+ npm link
33
+ shipup --help
34
+ ```
35
+
36
+ ## Quick start
37
+
38
+ ```bash
39
+ mkdir -p ~/.config/shipup
40
+ cp creds.example.yaml ~/.config/shipup/credentials.yaml
41
+ chmod 600 ~/.config/shipup/credentials.yaml
42
+ ```
43
+
44
+ Credentials are resolved from `--creds`, then `SHIPUP_CREDS`, then
45
+ `~/.config/shipup/credentials.yaml`.
46
+
47
+ ```bash
48
+ # HarmonyOS
49
+ shipup harmony status
50
+ shipup harmony upload --package ./application.app --dry-run
51
+
52
+ # Android multi-market upload
53
+ shipup android upload \
54
+ --upload huawei=./app-huawei.apk honor=./app-honor.apk \
55
+ --release-note @./release-note.txt \
56
+ --submit-review --output json
57
+ shipup android status --channel huawei
58
+
59
+ # App Store Connect
60
+ shipup ios upload --package ./application.ipa --dry-run
61
+ shipup ios submit --app-version 2.0.0 --build-version 200 --bundle-id com.example.app
62
+ shipup ios status --app-version 2.0.0 --bundle-id com.example.app
63
+ shipup ios release --app-version 2.0.0 --bundle-id com.example.app --phased
64
+ ```
65
+
66
+ ## Commands
67
+
68
+ ```text
69
+ shipup harmony upload|submit|status
70
+ shipup huawei upload|status # compatibility command
71
+ shipup android upload|status # eight Android markets
72
+ shipup ios upload|submit|status|release
73
+ ```
74
+
75
+ Android upload supports release notes, icons, screenshots, application names,
76
+ summaries, and descriptions where the selected market API supports them. See
77
+ [Provider behavior](docs/providers.md) and [Android market capabilities](docs/android-markets.md).
78
+
79
+ ## Output and exit codes
80
+
81
+ `--output json` returns a stable object with `tool`, `platform`, `command`,
82
+ `ok`, `summary`, and per-channel `results`. Normalized states include
83
+ `uploaded`, `submitted`, `pending_review`, `approved`, `published`, `rejected`,
84
+ `offline`, `skipped`, and `failed`.
85
+
86
+ | Code | Meaning |
87
+ |---:|---|
88
+ | `0` | success |
89
+ | `1` | partial multi-channel failure |
90
+ | `2` | provider or processing failure |
91
+ | `3` | invalid CLI usage |
92
+ | `4` | missing or invalid credentials |
93
+ | `5` | missing or invalid package input |
94
+ | `124` | timeout |
95
+
96
+ Read [Credentials](docs/credentials.md) and [Security](SECURITY.md) before using
97
+ production accounts.
98
+
99
+ ## Development
100
+
101
+ ```bash
102
+ npm run check
103
+ npm run security
104
+ npm test
105
+ npm run test:coverage
106
+ npm run pack:check
107
+ npm audit
108
+ ```
109
+
110
+ ## License
111
+
112
+ [Zero-Clause BSD](LICENSE).
@@ -0,0 +1,105 @@
1
+ # shipup
2
+
3
+ `shipup` 是一个跨平台应用商店发布 CLI,支持:
4
+
5
+ - HarmonyOS `.app`:AppGallery Connect;
6
+ - Android APK:华为、荣耀、OPPO、vivo、小米、三星、应用宝、魅族;
7
+ - iOS `.ipa`:App Store Connect 上传、提审、状态查询和灰度发布。
8
+
9
+ 它适合本地自动化和 CI:JSON 只写 stdout,过程信息写 stderr,状态和退出码统一,
10
+ `--dry-run` 只做本地校验,不发网络请求。
11
+
12
+ > `shipup` 是独立社区项目,与各应用市场运营方不存在隶属或官方背书关系。
13
+
14
+ ## 环境
15
+
16
+ - Node.js 18.17 或更新版本;
17
+ - iOS 上传需要 macOS、Xcode 和 `xcrun altool`;
18
+ - Android 自动提取图标需要 Android SDK 的 `aapt`/`aapt2`,也可显式传 `--icon`;
19
+ - 对目标应用具备相应权限的平台凭证。
20
+
21
+ ## 安装
22
+
23
+ 首次 npm registry 发布前,可从仓库或固定 Git tag 安装:
24
+
25
+ ```bash
26
+ npm install
27
+ npm link
28
+ shipup --help
29
+ ```
30
+
31
+ ## 凭证
32
+
33
+ ```bash
34
+ mkdir -p ~/.config/shipup
35
+ cp creds.example.yaml ~/.config/shipup/credentials.yaml
36
+ chmod 600 ~/.config/shipup/credentials.yaml
37
+ ```
38
+
39
+ 查找顺序为 `--creds`、`SHIPUP_CREDS`、`~/.config/shipup/credentials.yaml`。
40
+ 值支持字面量、`${ENVIRONMENT_VARIABLE}` 和 `@相对文件`。完整结构见
41
+ [凭证说明](docs/credentials.md)。
42
+
43
+ ## 使用
44
+
45
+ ```bash
46
+ # HarmonyOS
47
+ shipup harmony status
48
+ shipup harmony upload --package ./application.app --dry-run
49
+
50
+ # Android 多渠道
51
+ shipup android upload \
52
+ --upload huawei=./app-huawei.apk honor=./app-honor.apk \
53
+ --release-note @./release-note.txt \
54
+ --submit-review --output json
55
+ shipup android status --channel huawei
56
+
57
+ # iOS
58
+ shipup ios upload --package ./application.ipa --dry-run
59
+ shipup ios submit --app-version 2.0.0 --build-version 200 --bundle-id com.example.app
60
+ shipup ios status --app-version 2.0.0 --bundle-id com.example.app
61
+ shipup ios release --app-version 2.0.0 --bundle-id com.example.app --phased
62
+ ```
63
+
64
+ 命令总览:
65
+
66
+ ```text
67
+ shipup harmony upload|submit|status
68
+ shipup huawei upload|status # 原华为兼容命令
69
+ shipup android upload|status # Android 八渠道
70
+ shipup ios upload|submit|status|release
71
+ ```
72
+
73
+ Android 上传支持按渠道更新发布说明、图标、截图、应用名、一句话简介和长描述。
74
+ 各市场具体支持情况见 [平台行为](docs/providers.md) 和
75
+ [Android 市场能力表](docs/android-markets.md)。
76
+
77
+ iOS 新参数统一为 `--app-version` 和 `--build-version`;旧的 `--version`、`--build`
78
+ 仍可使用。`--bundle-id` 可以自动反查 App Store Connect 数字 App ID。
79
+
80
+ ## 退出码
81
+
82
+ | 退出码 | 含义 |
83
+ |---:|---|
84
+ | `0` | 成功 |
85
+ | `1` | 多渠道部分失败 |
86
+ | `2` | 全部失败或平台处理失败 |
87
+ | `3` | 参数错误 |
88
+ | `4` | 凭证缺失或无效 |
89
+ | `5` | 软件包缺失或无效 |
90
+ | `124` | 超时 |
91
+
92
+ 生产使用前请阅读 [SECURITY.md](SECURITY.md)。
93
+
94
+ ## 开发
95
+
96
+ ```bash
97
+ npm run check
98
+ npm run security
99
+ npm test
100
+ npm run test:coverage
101
+ npm run pack:check
102
+ npm audit
103
+ ```
104
+
105
+ 许可证:[Zero-Clause BSD](LICENSE)。
package/SECURITY.md ADDED
@@ -0,0 +1,32 @@
1
+ # Security policy
2
+
3
+ ## Credentials
4
+
5
+ Never commit provider credentials, private keys, release packages, or
6
+ application-specific release metadata. Store local credentials under
7
+ `~/.config/shipup` with mode `0600`, or inject them through a CI secret store.
8
+
9
+ Credential values support literal strings, `${ENVIRONMENT_VARIABLE}`, and
10
+ `@path/to/file`. Environment variables and external files are preferred for
11
+ private keys and service-account JSON.
12
+
13
+ `--dry-run` does not send network requests, but it still resolves and validates
14
+ the selected credential file. Run it only in an environment allowed to access
15
+ those credentials.
16
+
17
+ ## Logs
18
+
19
+ Do not upload raw debug logs without reviewing them. `shipup` redacts common
20
+ authorization tokens, private-key blocks, secret-like JSON fields, URL query
21
+ parameters, and long opaque values across both core and multi-market adapters,
22
+ but provider responses can change without notice.
23
+
24
+ ## Reporting a vulnerability
25
+
26
+ Do not open a public issue containing credentials or private provider output.
27
+ Use GitHub's private vulnerability reporting form in the repository Security
28
+ tab. Do not include secrets in a public issue.
29
+
30
+ ## Supported versions
31
+
32
+ Security fixes are provided for the latest released minor version only.
@@ -0,0 +1,62 @@
1
+ # Copy to ~/.config/shipup/credentials.yaml and chmod 600 it.
2
+ # Values support literals, ${ENVIRONMENT_VARIABLE}, and @relative/file.
3
+
4
+ android:
5
+ package_name: com.example.app
6
+ channels:
7
+ huawei:
8
+ app_id: "100000001"
9
+ client_id: ${HUAWEI_CLIENT_ID}
10
+ client_secret: ${HUAWEI_CLIENT_SECRET}
11
+ honor:
12
+ app_id: "100000002"
13
+ client_id: ${HONOR_CLIENT_ID}
14
+ client_secret: ${HONOR_CLIENT_SECRET}
15
+ oppo:
16
+ app_id: "100003"
17
+ client_id: ${OPPO_CLIENT_ID}
18
+ client_secret: ${OPPO_CLIENT_SECRET}
19
+ vivo:
20
+ app_id: "10004"
21
+ access_key: ${VIVO_ACCESS_KEY}
22
+ access_secret: ${VIVO_ACCESS_SECRET}
23
+ xiaomi:
24
+ user_name: ${XIAOMI_USER_NAME}
25
+ password: ${XIAOMI_PASSWORD}
26
+ rsa_modulus: ${XIAOMI_RSA_MODULUS}
27
+ samsung:
28
+ app_id: "000001000000"
29
+ service_account: ${SAMSUNG_SERVICE_ACCOUNT}
30
+ private_key: "@./samsung-private-key.pem"
31
+ qq:
32
+ app_id: "1100000000"
33
+ user_id: "60000"
34
+ access_secret: ${QQ_ACCESS_SECRET}
35
+ meizu:
36
+ access_key: ${MEIZU_ACCESS_KEY}
37
+ access_secret: ${MEIZU_ACCESS_SECRET}
38
+
39
+ harmony:
40
+ app_id: "1234567890"
41
+ package_name: com.example.app
42
+ default_lang: zh-CN
43
+ service_account: "@./agc-service-account.json"
44
+ # API client credentials are also supported:
45
+ # client_id: ${AGC_CLIENT_ID}
46
+ # client_secret: ${AGC_CLIENT_SECRET}
47
+
48
+ # Compatibility command: shipup huawei upload|status.
49
+ # Android multi-market commands use android.channels.huawei above.
50
+ huawei:
51
+ app_id: "123456789"
52
+ package_name: com.example.app
53
+ default_lang: zh-CN
54
+ service_account: "@./agc-service-account.json"
55
+
56
+ ios:
57
+ app_id: "1234567890"
58
+ bundle_id: com.example.app
59
+ issuer_id: ${ASC_ISSUER_ID}
60
+ key_id: ${ASC_KEY_ID}
61
+ private_key: "@./AuthKey_XXXXXXXXXX.p8"
62
+ team_id: ${APPLE_TEAM_ID}