android-publisher-cli 0.2.0-dev → 0.3.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.
@@ -1,25 +1,25 @@
1
1
  # 渠道协议与验证依据
2
2
 
3
- 本页供修改渠道请求的维护者使用。新版 TypeScript 适配器只支持已有应用的版本更新,发布规则为 `after_approval`。`android-release protocols` 可在本机查看实现范围。
3
+ 六个 TypeScript 适配器只支持已有应用的版本更新,发布规则为 `after_approval`。修改渠道请求前,先核对写入步骤与验证依据。`android-release protocols` 可显示 CLI 报告的实现范围。
4
4
 
5
- ## 当前能力
5
+ ## 渠道操作
6
6
 
7
- | 渠道 | 写入步骤 | 仍需注意 |
7
+ | 渠道 | 写入步骤 | 核对重点 |
8
8
  | --- | --- | --- |
9
- | 华为 | 申请上传授权、上传、绑定、更新中文说明、提审 | 上传地址和签名头必须匹配授权;绑定后至少等待 2 分钟再提审 |
9
+ | 华为 | 申请上传授权、上传、绑定、更新中文说明、提审 | 上传地址和签名头须匹配授权;绑定后至少等待 2 分钟再提审 |
10
10
  | 荣耀 | 申请上传授权、上传、绑定、更新中文说明、提审 | 审核查询需要本次提交的 `releaseId`;更新语言时使用 `setAll: 0` |
11
- | 小米 | 签名后推送 APK 与图标 | 包查询没有版本绑定的审核结果;测试账号按结构化 JSON 输入 |
11
+ | 小米 | 签名后推送 APK 与图标 | 包查询没有版本绑定的审核结果;测试账号 JSON 从私有文件读取 |
12
12
  | OPPO | 申请上传授权、上传、提审 | 授权本地使用期限为 30 秒;预检需要完整的已有应用元数据 |
13
13
  | vivo | 上传、提审 | 单 APK 更新;签名方法及账号权限仍待真实账号核对;请求间隔至少 1 分钟 |
14
14
  | 应用宝 | 申请上传授权、上传、提审 | 使用主开发者账号;审核接口未给出本次版本标识 |
15
15
 
16
- 六个适配器通过了合成响应测试。测试覆盖只读预检、写入步骤、回执保存和状态分离。**`protocol_mock_verified` 只表示合成测试通过。** `account_verified` 和 `live_verified` 尚无新版真实账号证据。不要从测试结果推断渠道授权、审核结果或公开上架。
16
+ 六个适配器通过了合成响应测试,覆盖只读预检、写入步骤、回执保存和状态分离。`protocol_mock_verified` 只表示合成测试通过。`account_verified` 和 `live_verified` 仍缺少真实账号证据;测试结果不能证明渠道授权、审核结果或公开上架。
17
17
 
18
- 响应丢失时,渠道查询通常缺少足够的操作标识或产物摘要。新版 `reconcile` 保留未决写入,不自动重试。补充恢复逻辑前,必须记录可核对的官方字段和对应测试。
18
+ 渠道查询通常缺少足以关联响应丢失操作的标识或产物摘要。`reconcile` 保留这类未决写入,不自动重试。补充恢复逻辑前,应先记录官方协议中可核对的字段,再加入对应测试。
19
19
 
20
20
  ## 官方资料
21
21
 
22
- 下表沿用 2026-10-23 整理的官方入口。页面可能调整、要求登录或动态加载。修改协议前,重新核对实际接口页面和账号响应。
22
+ 修改适配器前,请核对下列官方页面和账号响应。页面可能调整,也可能要求登录或动态加载。
23
23
 
24
24
  | 渠道 | 官方入口 | 核对重点 |
25
25
  | --- | --- | --- |
@@ -30,6 +30,6 @@
30
30
  | vivo | [API 接入指南](https://developer.vivo.com/doc/detail?id=73) | 签名方法、账号平台和发布字段 |
31
31
  | 应用宝 | [开发者 API 指南](https://wiki.open.qq.com/index.html#/guide/develop?id=4015262492) | 主开发者账号、文件序列号和审核查询 |
32
32
 
33
- 在 PR 中写明文档页面、字段、访问限制和仍待账号验证的行为。新增成功、错误及响应丢失的合成用例。不能把缺失字段、未知状态码或旧版本信息解释为本次发布成功。
33
+ 在 PR 中记录文档页面、字段、访问限制和仍待账号验证的行为。新增成功、错误及响应丢失的合成用例。缺失字段、未知状态码或其他版本的信息不能证明本次发布成功。
34
34
 
35
35
  协议代码独立实现。第三方来源和许可证见[第三方声明](../../THIRD_PARTY_NOTICES.md)。
@@ -0,0 +1,62 @@
1
+ # 安装与配置
2
+
3
+ 你需要 Apple Silicon Mac 和 [`.node-version`](../.node-version) 指定的 Node.js。运行 `prepare` 前,还需安装 Android SDK Build Tools 和 JDK,并准备已签名、不可调试的 APK。
4
+
5
+ ## 安装 CLI
6
+
7
+ ```sh
8
+ npm install --global android-publisher-cli
9
+ android-release version --json
10
+ android-release doctor
11
+ ```
12
+
13
+ `version` 应显示安装版本。`doctor` 返回的 `ready` 为 `true`,表示 CLI 找到了 APK 检查工具。如果工具未找到,检查 `ANDROID_SDK_ROOT` 和 `JAVA_HOME` 是否指向本机安装目录,再运行 `doctor`。
14
+
15
+ 需要安装预发布版本时,使用 `npm install --global android-publisher-cli@next`。维护者交付的 tarball 安装方法见 [npm 包验收](npm-package.md)。
16
+
17
+ ## 配置应用
18
+
19
+ `setup` 只保存渠道公开信息,不读取 APK,也不访问渠道。运行向导:
20
+
21
+ ```sh
22
+ android-release setup --project demo
23
+ ```
24
+
25
+ 选择渠道,填写公开账号和应用标识。核对项目摘要后,输入 `yes` 保存;输入 `cancel` 可退出。项目保存在 `~/Library/Application Support/AndroidPublisherCLI/v2/projects/`。
26
+
27
+ | 渠道 | 向导需要的公开信息 | 执行时输入的凭据 |
28
+ | --- | --- | --- |
29
+ | 华为 | 本机账号名、渠道应用 ID,可选中文语言 ID | 服务账号 JSON 文件路径 |
30
+ | 荣耀 | 本机账号名、渠道应用 ID、`client_id`,可选中文语言 ID | 直接输入 `client_secret` |
31
+ | 小米 | 本机账号名、`userName`、图标路径、隐私政策 URL;应用 ID 使用包名 | 直接输入 API 密钥;输入公钥证书和可选测试账号 JSON 的文件路径 |
32
+ | OPPO | `client_id` 兼作本机账号名;应用 ID 使用包名 | 直接输入 `client_secret` |
33
+ | vivo | 本机账号名、`access_key`;应用 ID 使用包名 | 直接输入 `access_secret` |
34
+ | 应用宝 | 本机账号名、应用 AppID、账号 uid | 直接输入 API 密钥 |
35
+
36
+ 公开标识须与渠道后台一致。小米、OPPO 和 vivo 的应用 ID 填目标包名;`prepare` 会与 APK 中的包名核对。
37
+
38
+ `setup` 不验证渠道权限。[预检](release-workflow.md#预检)才会读取账号和应用状态。需要重设项目时,加 `--replace`;已有批次保留创建时冻结的配置。
39
+
40
+ ## 输入凭据
41
+
42
+ 预检、提交、继续执行、刷新查询和核对时,CLI 会在终端逐项提示凭据。短文本直接输入,屏幕不显示输入内容。
43
+
44
+ 华为服务账号 JSON、小米公钥证书和可选测试账号 JSON 须放在当前用户私有文件中。在对应提示处输入文件绝对路径。
45
+
46
+ ```sh
47
+ chmod 600 "/absolute/path/service-account.json"
48
+ ```
49
+
50
+ 凭据文件须属于当前用户,权限为 `0600`。路径须为规范化绝对路径,不能经过符号链接。将文件放在仓库外,自行管理备份和轮换。命令执行时需要可交互的终端。
51
+
52
+ CLI 不读取 macOS 钥匙串。短期访问令牌和上传授权保存在本机私有状态库。真实账号、私钥和凭据文件不能提交到 Git,也不能附在 issue 或报告里。
53
+
54
+ ## 更新与卸载
55
+
56
+ 停止正在运行的发布命令,再安装指定版本的 npm 包或 tarball。运行 `android-release version --json` 核对版本。回退前,确认旧程序能读取当前 `v2` 状态结构。
57
+
58
+ ```sh
59
+ npm uninstall --global android-publisher-cli
60
+ ```
61
+
62
+ 卸载 npm 包不会删除本机发布状态或凭据文件。配置完成后,按[发布应用更新](release-workflow.md)建立批次。
@@ -0,0 +1,36 @@
1
+ # npm 包验收
2
+
3
+ npm 包包含编译后的 JavaScript 和离线文档。验收时要检查实际 tarball 的文件清单与命令入口。运行时需要 [`.node-version`](../.node-version) 指定的 Node.js,以及单独安装的 Android SDK Build Tools 和 JDK。
4
+
5
+ ## 构建与检查
6
+
7
+ 在仓库根目录安装锁定依赖,并运行完整检查:
8
+
9
+ ```sh
10
+ npm ci --ignore-scripts
11
+ PUBLISHER_REQUIRE_ANDROID_TESTS=1 npm run check
12
+ npm pack --dry-run --json
13
+ ```
14
+
15
+ `npm run check` 执行类型检查、构建和测试。最后一条命令列出包文件。确认清单包含 `build/`、`docs/`、`README.md`、许可证和 `package.json`,且没有凭据、APK、状态库、私钥或本机路径。npm 包没有安装脚本。
16
+
17
+ ## 安装实际 tarball
18
+
19
+ ```sh
20
+ mkdir -p dist
21
+ archive=$(npm pack --pack-destination dist --silent)
22
+ cd dist
23
+ shasum -a 256 "$archive" > "$archive.sha256"
24
+ shasum -a 256 -c "$archive.sha256"
25
+ prefix=$(mktemp -d)
26
+ npm install --global --prefix "$prefix" --ignore-scripts "./$archive"
27
+ "$prefix/bin/android-release" version --json
28
+ ```
29
+
30
+ 摘要检查应显示 `OK`。`version` 应与 tarball 文件名和 `package.json` 一致。需要核对 Android 工具时,再运行 `"$prefix/bin/android-release" doctor`。CI 会用独立前缀安装已检查的 tarball。
31
+
32
+ ## 分发约束
33
+
34
+ Node.js 和 Android 工具由使用者分别安装,并遵守各自许可。包内包含 MIT 许可证和[第三方声明](../THIRD_PARTY_NOTICES.md)。真实渠道凭据和 APK 不能进入 npm 包、CI 或 GitHub 发布附件。
35
+
36
+ 一个包名和版本只能在 npm 注册表发布一次。内容改变后,先提升版本,再生成新包。版本 PR、标签和发布顺序见 [CLI 版本发布](npm-release.md)。
@@ -0,0 +1,33 @@
1
+ # CLI 版本发布
2
+
3
+ `android-publisher-cli` 通过版本 PR 和 GitHub Release 发布到 npm 注册表。先按 [npm 包验收](npm-package.md)检查交付物。CLI 发版与 Android 应用提审分别授权。
4
+
5
+ ## 准备版本 PR
6
+
7
+ 在 GitHub Actions 打开 [Prepare npm release](../.github/workflows/prepare-npm-release.yml)。从 `main` 运行工作流,输入高于当前版本的 SemVer,不带 `v` 和构建元数据。工作流更新 `package.json` 与 `package-lock.json`,并创建版本 PR。
8
+
9
+ 审阅版本号和包文件清单。由 `GITHUB_TOKEN` 创建的 PR 可能需要维护者在 GitHub 上批准 CI 运行。等待该 PR 的必需 `check` 通过,再按仓库规则 squash 合并。
10
+
11
+ ## 发布 GitHub Release
12
+
13
+ 确认合并后 `main` 顶端提交的必需 `check` 通过。在 GitHub Releases 中建立 `vVERSION`,目标选该提交。发布说明写明用户可见变化、Node.js 要求、状态兼容性、已知限制,以及六个渠道的真实账号验证情况。
14
+
15
+ 版本带预发布后缀时,勾选“Set as a pre-release”;正式版本不勾选。公开 GitHub Release 会触发 [publish-npm.yml](../.github/workflows/publish-npm.yml)。工作流核对标签、包版本、锁文件、Release 类型和 `main` 提交,再运行完整检查、打包并独立安装同一份 tarball。
16
+
17
+ 工作流通过 npm Trusted Publisher 取得短期发布凭据。npm 配置须指向 GitHub 用户 `wangyiliangnet`、仓库 `android-publisher-cli` 和工作流文件 `publish-npm.yml`。配置中须允许 `npm publish`;仓库不需要 `NPM_TOKEN`。预发布版本使用 `next` 标签,正式版本使用 `latest`。
18
+
19
+ ## 核对与失败处理
20
+
21
+ 工作流成功后,查询注册表并安装指定版本:
22
+
23
+ ```sh
24
+ npm view android-publisher-cli versions dist-tags --json
25
+ npm install --global android-publisher-cli@VERSION
26
+ android-release version --json
27
+ ```
28
+
29
+ 将 `VERSION` 换成刚发布的版本。npm 可能先处理包扫描,再开放安装;以注册表中的版本和安装结果为准。
30
+
31
+ 发布失败时,先查看 Actions 日志、GitHub 标签和 npm 中的版本与标签。若包已被 npm 接受,同名版本不能覆盖;修复内容须使用新版本号。若 `main` 在创建 Release 前已经前进,先评估新增改动,再准备新版本。
32
+
33
+ CI 和 npm 发布检查不证明真实商店账号权限,也不授权应用提审。
@@ -0,0 +1,69 @@
1
+ # 发布应用更新
2
+
3
+ 示例项目 `demo` 包含六个渠道。先完成[安装与配置](getting-started.md),准备各渠道 APK 和更新说明。将示例路径换成本机绝对路径。CLI 只更新渠道中已有的应用。
4
+
5
+ ## 准备批次
6
+
7
+ 把更新说明写入私有文本文件。再创建 `batch.json`,明确指定每个渠道的 APK:
8
+
9
+ ```json
10
+ {
11
+ "schema_version": 2,
12
+ "batch_id": "demo-1-0-0",
13
+ "project_id": "demo",
14
+ "release_notes_file": "/absolute/path/release-notes.txt",
15
+ "apks": {
16
+ "huawei": "/absolute/path/huawei.apk",
17
+ "honor": "/absolute/path/honor.apk",
18
+ "xiaomi": "/absolute/path/xiaomi.apk",
19
+ "oppo": "/absolute/path/oppo.apk",
20
+ "vivo": "/absolute/path/vivo.apk",
21
+ "tencent": "/absolute/path/tencent.apk"
22
+ }
23
+ }
24
+ ```
25
+
26
+ ```sh
27
+ android-release prepare --file "/absolute/path/batch.json"
28
+ ```
29
+
30
+ `prepare` 验签所有 APK,检查包名、版本和签名是否一致。小米、OPPO 和 vivo 的应用 ID 还须与 APK 包名一致。检查过程不访问渠道。
31
+
32
+ CLI 会显示包名、版本名(`versionName`)和版本代码(`versionCode`)。核对后输入 `yes`,才会冻结产物并保存批次。命令需要可交互的终端。
33
+
34
+ 成功时,`batch_id` 应为 `demo-1-0-0`,`total_targets` 应为 `6`。输入有误时先修正;更换 APK 或说明时使用新的批次名。确认后若 APK 文件变化,CLI 会拒绝保存批次。
35
+
36
+ ## 预检
37
+
38
+ ```sh
39
+ android-release batch preflight --batch demo-1-0-0
40
+ ```
41
+
42
+ CLI 会提示所选渠道的凭据。预检读取远端账号和已有应用状态,并将结果绑定到批次。它不上传 APK 或提审。检查输出中的 `errors`,逐项处理失败的渠道;其他渠道成功不能代替失败渠道的预检。
43
+
44
+ 只获准提交部分渠道时,在预检和审阅时使用相同的 `--channels`,例如 `--channels oppo,honor`。批准文件会记录选定范围。
45
+
46
+ ## 审阅计划
47
+
48
+ 预检通过后,先创建仅自己可访问的目录,再生成批准文件:
49
+
50
+ ```sh
51
+ android-release batch review --batch demo-1-0-0 \
52
+ --file "/absolute/path/approval.json"
53
+ ```
54
+
55
+ 核对账号、应用标识、包名、版本、渠道、APK 摘要、签名、更新说明和 `release_policy`。输出的 `approval.approval_plan` 是本次计划摘要。批准文件含发布内容,应私下保存。`review` 离线运行,不上传 APK。
56
+
57
+ ## 提交
58
+
59
+ **下面的命令会上传 APK 并向选定渠道提审。** 执行前确认授权覆盖应用、产物和渠道。把审阅输出的摘要原样填入:
60
+
61
+ ```sh
62
+ android-release batch submit --batch demo-1-0-0 \
63
+ --approval "/absolute/path/approval.json" \
64
+ --approve-plan APPROVAL_PLAN_FROM_REVIEW
65
+ ```
66
+
67
+ CLI 会再次核对批准文件、预检和冻结产物。每个业务请求先保存操作意图,取得可验证回执后保存结果。`accepted_targets` 只统计已受理目标,不表示审核通过或公开上架。部分失败时保留输出和本地状态,按[状态查询与恢复](status-and-recovery.md)处理。
68
+
69
+ 提交命令使用批准文件绑定的渠道范围,不接受新的 `--channels` 选择。
@@ -0,0 +1,73 @@
1
+ # 状态查询与恢复
2
+
3
+ `batch submit` 返回后,先检查进程退出码和 `accepted_targets`,再查询每个渠道。渠道受理、审核通过和公开上架是不同状态。
4
+
5
+ ## 查询状态
6
+
7
+ ```sh
8
+ android-release batch status --batch demo-1-0-0 --refresh
9
+ ```
10
+
11
+ `--refresh` 会提示输入凭据,读取渠道数据并更新本机状态。去掉 `--refresh` 时,命令只读缓存;缓存不代表刚取得的远端结果。
12
+
13
+ | 字段 | 含义 |
14
+ | --- | --- |
15
+ | `execution_phase` | `submitted` 表示渠道已受理提交 |
16
+ | `review_state` | 与目标版本关联的审核状态 |
17
+ | `availability_state` | 与目标版本关联的公开上架状态 |
18
+ | `query_status`、`last_success_at` | 查询健康状态和最近一次成功时间 |
19
+ | `recovery_required` | 存在未决业务写入,不能直接重发 |
20
+
21
+ 查询失败时,CLI 保留已有的 `last_success_at`,并把 `query_status` 记为 `failed`。不要把查询失败解释为审核失败,也不要把审核通过解释为公开上架。
22
+
23
+ ## 渠道结果的关联
24
+
25
+ CLI 只用能关联目标版本的证据更新审核和上架状态:
26
+
27
+ | 渠道 | 关联依据 | 结果限制 |
28
+ | --- | --- | --- |
29
+ | 华为 | 本地有受理回执,API 返回目标版本 | 只读取该版本的审核和在架字段 |
30
+ | 荣耀 | 审核查询返回本次提交回执中的 `releaseId` | 只确认匹配标识的结果 |
31
+ | OPPO | 目标版本、已上传 APK 的 MD5 和版本标识一致 | 审核与上架分别记录 |
32
+ | vivo | 详情接口返回目标版本 | 审核与上架分别记录 |
33
+ | 小米 | 包查询只给出账号下的版本 | 不能据此确认本次审核或公开上架 |
34
+ | 应用宝 | 审核接口缺少本次版本标识 | 不能据此确认本次审核或公开上架 |
35
+
36
+ 小米和应用宝的未关联信息写入 `channel_context`,标为 `unconfirmed`。这些信息不会增加 `approved_targets` 或 `live_targets`。
37
+
38
+ ## 报告与历史
39
+
40
+ ```sh
41
+ android-release batch report --batch demo-1-0-0 \
42
+ --file "/absolute/path/report.md"
43
+ android-release history
44
+ ```
45
+
46
+ 报告的父目录须已存在。报告只含本地摘要和已关联状态,不含渠道密钥、令牌或签名 URL。它仍可能暴露包名、版本和发布进度,分享前请检查。
47
+
48
+ ## 中断后核对
49
+
50
+ 网络错误或终端退出后,先读取缓存,再运行只读核对:
51
+
52
+ ```sh
53
+ android-release batch status --batch demo-1-0-0
54
+ android-release batch reconcile --batch demo-1-0-0
55
+ ```
56
+
57
+ 响应丢失时,请求可能已经生效。当前协议证据不足以自动确认这类写入;`reconcile` 会保留阻塞。请在渠道后台核实具体操作,再交给维护者处理。保留 SQLite 记录和原批准文件,不能用新批次绕过同一渠道、账号和应用的未决写入。
58
+
59
+ 如果没有未决写入,且只是后续步骤未完成,可用原批准文件继续:
60
+
61
+ ```sh
62
+ android-release batch resume --batch demo-1-0-0 \
63
+ --approval "/absolute/path/approval.json" \
64
+ --approve-plan APPROVAL_PLAN_FROM_REVIEW
65
+ ```
66
+
67
+ `resume` 跳过已确认步骤,并复核批准内容;遇到未决步骤不会重发。退出码 `3` 表示部分目标失败或结果未决,`2` 表示输入或配置错误。提交错误后先检查 `recovery_required`。
68
+
69
+ ## 本机状态与备份
70
+
71
+ 项目、冻结产物、SQLite 日志、令牌和上传授权保存在 `~/Library/Application Support/AndroidPublisherCLI/v2/`。CLI 没有状态备份或恢复命令。
72
+
73
+ 需要备份时,先停止所有 CLI 进程,再私下复制整个 `v2` 目录及 SQLite 附属文件。恢复后先核对远端结果,再决定是否继续发布。备份含敏感状态,不能进入仓库或构建产物。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "android-publisher-cli",
3
- "version": "0.2.0-dev",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,7 +13,17 @@
13
13
  "registry": "https://registry.npmjs.org/",
14
14
  "access": "public"
15
15
  },
16
- "files": ["build", "docs", ".node-version", "README.md", "CONTRIBUTING.md", "AGENTS.md", "CHANGELOG.md", "LICENSE", "LICENSE.zh-CN.md", "THIRD_PARTY_NOTICES.md"],
16
+ "files": [
17
+ "build",
18
+ "docs",
19
+ ".node-version",
20
+ "README.md",
21
+ "CONTRIBUTING.md",
22
+ "AGENTS.md",
23
+ "LICENSE",
24
+ "LICENSE.zh-CN.md",
25
+ "THIRD_PARTY_NOTICES.md"
26
+ ],
17
27
  "bin": {
18
28
  "android-release": "./build/cli.js"
19
29
  },
package/CHANGELOG.md DELETED
@@ -1,53 +0,0 @@
1
- # 更新记录
2
-
3
- ## 0.2.0-dev
4
-
5
- - 将 CLI 重写为 TypeScript,使用 Node.js 24 和 npm 构建、测试及打包。
6
- - 六个渠道保留已有应用的上传和提审路径。发布前仍需冻结 APK、预检并核对批准文件。
7
- - 凭据默认在终端交互输入;自动化可读取权限为 `0600` 的私有 JSON 文件。CLI 不再读取钥匙串。
8
- - 新版状态保存在独立的 `v2` 目录。0.1.x 的项目、批次、命令和状态不自动迁移。
9
- - 删除旧的 Go 二进制、浏览器模拟和 macOS 安装包流程。交付物改为 npm tarball。
10
- - 命令入口改为 `android-release`;增加版本 PR 和 npm 注册表发布工作流。
11
-
12
- 合成渠道测试、真实签名 APK 测试和子进程崩溃恢复测试已通过。新版尚未完成六个渠道的真实账号验证。响应丢失仍会阻止冲突写入,当前没有自动解除该阻塞的依据。
13
-
14
- ## 0.1.0-beta.5
15
-
16
- - 重写日常发布和首次使用教程,按六渠道说明预检、准备、提交、查询、核对和恢复。
17
- - 补充跨渠道发布前检查,并说明失败后的排查和继续执行方法。
18
-
19
- 本版本只更新文档,CLI 行为和本地状态结构没有变化。CI 预览包使用 ad-hoc 临时签名,未公证,没有稳定的钥匙串信任身份。
20
-
21
- ## 0.1.0-beta.4
22
-
23
- - 项目文档和协作模板改为中文,保留命令、链接及标准许可证原文。
24
- - 按发版同事、贡献者和维护者整理文档入口,合并重复教程和验收规则,将初始验收记录归档。
25
- - 安装包首页改为离线导航,使用步骤统一维护在对应手册。
26
-
27
- 本版本为 Apple Silicon CI 预览包,使用 ad-hoc 临时签名,未公证,没有稳定的钥匙串信任身份。使用真实凭据前应采用团队固定签名包。CLI 行为和本地状态结构没有变化。
28
-
29
- ## 0.1.0-beta.3
30
-
31
- - 建立脱敏后的公开源码基线,提交身份使用 noreply 邮箱。
32
- - 保留已审查的安装包文档和完整验收要求。
33
- - 真实 Chromium 验收在冷启动运行器上使用协议已有的 30 秒时限。
34
-
35
- ## 0.1.0-beta.2
36
-
37
- - 修复安装包中更新记录指向分发说明的链接。
38
- - 检查安装包根目录的每份 Markdown 文档,防止离线链接缺失。
39
-
40
- 分发状态仍为 CI 预览:使用 ad-hoc 临时签名,未公证。
41
-
42
- ## 0.1.0-beta.1
43
-
44
- 首个公开测试版包括:
45
-
46
- - 六渠道本地 APK 发布计划、明确批准、持久化操作回执和受约束的恢复。
47
- - 可复用的项目配置、批次准备、提交、核对和继续执行。
48
- - 自动查询小米版本并标注审核推测;读取应用宝审核信息、脱敏驳回原因和公开商店版本。
49
- - 缓存历史及私有 Markdown/JSON 报告。
50
- - Apple Silicon 安装、升级、回滚和卸载脚本。
51
- - 合成数据协议、浏览器、Android 签名及子进程恢复验收,以及 GitHub CI 和草稿发布工作流。
52
-
53
- 公开版本采用新的版本基线,不宣称已验证真实渠道账号。CI 预览产物使用 ad-hoc 临时签名,未公证,详见[旧版验收记录](docs/archive/public-beta-acceptance.md)。
@@ -1,47 +0,0 @@
1
- # 归档:公开测试版初始验收
2
-
3
- > 本页面向需要回溯早期交付的维护者,保留 2026-10-23 初始测试版的验收与修订记录,不作为当前操作规范。最新检查以 [CI 历史](https://github.com/wangyiliangnet/android-publisher-cli/actions/workflows/check.yml)为准。开发要求见[贡献指南](../../CONTRIBUTING.md),后续计划见[维护路线图](../execution-plan.md)。
4
-
5
- 本记录针对公开 CLI,验收使用 Apple Silicon macOS 和合成输入。验收结果不代表已核实渠道账号、应用或生产提交,也不代表完成 Apple 公证。
6
-
7
- 文中的 Go、钥匙串和原生安装包均为 0.1.x 历史行为。新版源码和发布流程已改为 TypeScript 与 npm,本页不作为新版验收结果。
8
-
9
- ## 本地验收
10
-
11
- - 使用固定版本的 Go 和 Node.js 完成 `make check`:格式、vet、Go 竞态、真实 Chromium、临时原生钥匙串、中断子进程恢复和构建均通过。
12
- - 强制 Android 集成测试通过,使用独立 Android SDK、真实 Build Tools、JDK,以及生成的测试 APK 和签名密钥。
13
- - 双版本 CI 预览打包通过安装、升级、回滚、重复安装、同版本完整内容冲突、校验和损坏、额外文件、符号链接、离线文档和卸载检查。
14
- - 已检查运行状态、钥匙串服务、签名标识和安装路径各自独立的命名空间。测试和预览构建不使用生产账号。
15
- - 公开发布前必须通过工作流检查、发布版本检查、脚本检查、隐私回归测试、密钥扫描器精确测试例外检查及公开历史扫描。
16
-
17
- ## 独立审查
18
-
19
- 只读审查覆盖公开数据与许可边界、CI 和仓库规则,以及 Mac 交付。主要发现如下:
20
-
21
- 1. 快速入门中的 PATH 与默认安装路径不同,示例现已改为 `~/.local/android-publisher-cli/bin`。
22
- 2. 公开信息扫描未覆盖提交消息和附注标签元数据。现在除当前及历史文件外,还检查可达 Git 元数据。回归测试覆盖隐私和凭据模式。
23
- 3. 标签已创建、草稿创建却中断时,可能使该版本无法继续。恢复流程现会检查准确的标签、草稿元数据和已有资产字节。检查一致后,只上传缺失资产。
24
- 4. Git 替换引用可能隐藏原始历史内容。检查现在拒绝替换引用,并在每个 Git 和 Gitleaks 子进程中强制读取原始对象。
25
- 5. 一次真实依赖更新暴露出隐私检查对官方机器人末尾签名行限制过严。现在只为准确的官方机器人身份和签名行提供隐私例外。交给密钥扫描器的原始输入不变。源码、标签与引用文本、其他身份和邻近私有文本仍受检查。
26
-
27
- 五项问题均已修复,并由原独立审查者复核。分配范围内没有遗留 P0–P2 问题。18 项隐私回归测试、13 项草稿恢复故障测试、工作流检查、完整源码与历史及元数据扫描、最终安装包冒烟测试均通过。后续云端验收证据通过正常 PR 记录。
28
-
29
- ## 云端与发布验收
30
-
31
- 云端验收使用标准 Apple Silicon 运行器,包含完整测试和双版本安装恢复检查。常规检查不上传发布产物。独立建立的公开仓库将云端结果记录在 [CI 历史](https://github.com/wangyiliangnet/android-publisher-cli/actions/workflows/check.yml)中。
32
-
33
- 独立只读远端审查确认,两个已纳入版本管理的规则集均启用。规则集没有可绕过规则的角色,并实际约束 `main` 和 `v*` 标签。仓库只允许 squash 合并。Actions 要求固定完整提交并限用 GitHub 官方 Actions,默认只读,不能批准 PR。私密漏洞报告、密钥扫描和推送保护均已开启。
34
-
35
- 验收 PR 用于验证必需检查对合并的约束,实际结果以 GitHub 上的检查与合并事件为准。每次预览发布运行都会在 [Actions](https://github.com/wangyiliangnet/android-publisher-cli/actions/workflows/release.yml) 中分别记录当前 main 验证、完整检查、安装包验收和草稿创建任务。首个预览仍是 ad-hoc 签名、未公证的草稿。固定身份分发属于单独能力。
36
-
37
- ## 下载产物复核
38
-
39
- 首个草稿的实际云端产物已在 Mac 上通过校验和、签名、架构、干净源码提交、清单、许可证及安装恢复检查。最终独立审查发现,安装包更新记录有一处 P3 离线链接问题。打包工具现会改写该链接。安装包验收也会检查根目录全部 Markdown 文档,扩展后的检查能够拒绝原压缩包。修复使用新的 `0.1.0-beta.2` 候选,不替换先前标签或安装包字节。
40
-
41
- ## 脱敏后的公开仓库基线
42
-
43
- 公开仓库从一份已审查、使用 noreply 元数据的源码快照开始。创建 PR 前,贡献者必须先配置网页提交身份隐私。云端检查和预览草稿会针对该公开基线重新执行。较早的评估产物私下保留,不将先前 Git 对象导入此仓库。
44
-
45
- 独立审查确认,新公开基线只有一个 noreply 根提交,不含先前 Git 对象。该基线与已审源码的差异仅为文档。匿名查询无法通过公开仓库或私有归档读取先前的测试合并对象。创建新仓库的验收 PR 前,已检查贡献者账号隐私设置。
46
-
47
- 云端一次 Chromium 冷启动和采集超过了验收测试数据原先的 10 秒请求时限。现在使用协议已有的 30 秒上限。运行行为和协议限制不变,专门的截止时间与取消测试仍使用各自较短的时限。超时后不会自动重试或跳过检查。
@@ -1,37 +0,0 @@
1
- # 自动查询说明
2
-
3
- 提交后运行以下命令查询当前批次:
4
-
5
- ```sh
6
- android-release batch status --batch demo-1-0-0 --refresh
7
- ```
8
-
9
- CLI 会在终端提示输入所需凭据。去掉 `--refresh` 时,只读取本地缓存。查看结果时,先看进程退出码,再看 `targets` 中每个渠道的字段。
10
-
11
- | 字段 | 含义 |
12
- | --- | --- |
13
- | `execution_phase` | `submitted` 只表示渠道已受理本次提交 |
14
- | `review_state` | 版本关联证据支持的审核状态 |
15
- | `availability_state` | 版本关联证据支持的公开上架状态 |
16
- | `query_status`、`last_success_at` | 上次查询的健康状态和成功时间 |
17
- | `recovery_required` | 存在未决业务写入,不能直接重发 |
18
-
19
- 审核通过不等于公开上架。查询失败时,CLI 保留已有成功时间,并把 `query_status` 记为 `failed`。缓存不能看作刚取得的结果。
20
-
21
- ## 各渠道如何关联结果
22
-
23
- 华为在本地已有受理回执,并且 API 返回目标版本时,才读取该版本的审核和在架字段。荣耀需要本次提交回执中的 `releaseId`,并核对审核查询返回的相同标识。
24
-
25
- OPPO 要求目标版本、已上传 APK 的 MD5 和版本标识一致。vivo 要求详情接口返回目标版本。两个渠道的审核与上架字段分别记录。
26
-
27
- 小米包查询只给出账号下的版本。目标版本出现在查询结果里,仍不能证明本次审核或公开上架。应用宝审核接口也没有本次版本标识。这两类结果写入 `channel_context`,并标为 `unconfirmed`。它们不会增加 `approved_targets` 或 `live_targets`。
28
-
29
- ## 未决写入
30
-
31
- 网络中断或进程结束后,先读取本地状态,再运行:
32
-
33
- ```sh
34
- android-release batch reconcile --batch demo-1-0-0
35
- ```
36
-
37
- `reconcile` 只做读取。当前适配器没有足够的响应丢失核对依据,因此未决操作会继续阻塞。`resume` 不会重发未决步骤。请在渠道后台核实具体操作,再交给维护者处理;不要删除 SQLite 记录来绕过阻塞。
@@ -1,69 +0,0 @@
1
- # 首次使用
2
-
3
- 本页供第一次安装和配置 CLI 的发版同事使用。你需要 Apple Silicon Mac、Android SDK Build Tools、JDK,以及 [`.node-version`](../.node-version) 指定的 Node.js。使用 npm 安装包时不需要 Go。
4
-
5
- ## 安装 CLI
6
-
7
- 安装 npm 上的正式版本,并核对命令。首次公开发布前,可从维护者取得已验收的 npm tarball 和 SHA-256 文件,先核对摘要再安装。下面的版本号仅作 tarball 示例:
8
-
9
- ```sh
10
- npm install --global android-publisher-cli
11
- android-release version --json
12
- android-release doctor
13
- ```
14
-
15
- 离线安装时使用维护者交付的文件:
16
-
17
- ```sh
18
- shasum -a 256 -c android-publisher-cli-0.2.0.tgz.sha256
19
- npm install --global ./android-publisher-cli-0.2.0.tgz
20
- android-release version --json
21
- android-release doctor
22
- ```
23
-
24
- 校验输出应为 `OK`。`version` 应显示你安装的版本。`doctor` 的 `ready` 为 `true` 时,表示已找到 APK 检查工具。若工具未找到,先检查 SDK 和 JDK 路径,再使用 `ANDROID_SDK_ROOT` 与 `JAVA_HOME` 指向本机安装目录。
25
-
26
- 从源码试用时,在仓库根目录执行 `npm ci --ignore-scripts`、`npm run build` 和 `npm link`。正式交付与核对步骤见[构建与分发](mac-cli-delivery.md)。
27
-
28
- ## 配置应用
29
-
30
- 准备一份你信任的已签名、不可调试 APK。下面的命令读取包名和签名,并打开项目向导;它不会上传 APK:
31
-
32
- ```sh
33
- android-release setup --project demo --apk "/absolute/path/trusted.apk"
34
- ```
35
-
36
- 先核对显示的包名与签名 SHA-256。输入 `yes` 后选择渠道,填写公开账号和应用标识。最后再次输入 `yes` 保存项目。输入 `cancel` 可退出向导。项目保存在 `~/Library/Application Support/AndroidPublisherCLI/v2/projects/`。
37
-
38
- | 渠道 | 向导需要的公开信息 | 执行命令时输入的凭据 |
39
- | --- | --- | --- |
40
- | 华为 | 本机账号名、渠道应用 ID,可选中文语言 ID | 服务账号 JSON |
41
- | 荣耀 | 本机账号名、渠道应用 ID、`client_id`,可选中文语言 ID | `client_secret` |
42
- | 小米 | 本机账号名、`userName`、图标路径、隐私政策 URL;应用 ID 使用包名 | API 密钥、公钥证书和按需提供的测试账号 JSON |
43
- | OPPO | `client_id` 兼作本机账号名;应用 ID 使用包名 | `client_secret` |
44
- | vivo | 本机账号名、`access_key`;应用 ID 使用包名 | `access_secret` |
45
- | 应用宝 | 本机账号名、应用 AppID、账号 uid | API 密钥 |
46
-
47
- 账号和应用标识要与渠道后台一致。配置保存的是公开标识,渠道权限还需通过预检确认。需要重设项目时,加 `--replace` 并重新核对可信 APK。已准备的旧批次不会随项目配置改变。
48
-
49
- ## 输入凭据
50
-
51
- `batch preflight`、`batch submit` 和刷新查询时,CLI 默认在终端逐项提示凭据。输入不会显示在屏幕上,也不会写入项目配置。华为服务账号 JSON 和小米公钥证书可先放在当前用户私有文件里。在提示处输入 `@` 加绝对路径,例如 `@/absolute/path/service-account.json`。
52
-
53
- ```sh
54
- chmod 600 "/absolute/path/service-account.json"
55
- ```
56
-
57
- 自动化可使用 `--credentials-file /absolute/path/credentials.json`。文件须属于当前用户,权限为 `0600`。顶层按渠道名分组;每组字段名见 CLI 提示。请把文件放在仓库外,并自行管理它的备份和轮换。
58
-
59
- CLI 不读取钥匙串。短期访问令牌和上传授权会保存在本机私有状态库。真实账号、私钥和凭据文件不能提交到 Git,也不能附在 issue 或报告里。
60
-
61
- ## 升级与卸载
62
-
63
- 停止正在运行的发布命令,再安装指定版本的 npm 包或 tarball。运行 `android-release version --json` 核对版本。回退时,重新安装你保留的旧版包;先确认旧程序能读取当前 `v2` 状态结构。预发布版本可用 `npm install --global android-publisher-cli@next` 安装。
64
-
65
- ```sh
66
- npm uninstall --global android-publisher-cli
67
- ```
68
-
69
- 卸载 npm 包不会删除发布状态或凭据文件。0.1.x Go 版状态不会自动迁移到新版。发布步骤见[日常发布](daily-cli-workflow.md)。