CLI / API 參考
foxstore-cli 是 Fox Store 面向 CI/CD 的無交互發布 API。這裡的 API 指命令行進程介面(參數、檔案、stdout/stderr 和退出碼),不提供 HTTP 服務。它是靜態連結 foxstore-engine 的單一可執行檔案,不要求安裝或啟動桌面客戶端,也不讀取桌面端 SQLite 憑據。
CLI 目前覆蓋 Apple、Google Play、華為、微信小程序、騰訊應用寶、榮耀、Samsung、蒲公英、vivo、小米和 OPPO 的發布自動化。物件儲存、評論、Analytics、證書日常管理、圖片優化與 AI 應用體檢保留在 Engine 和 Desktop,不進入 CLI。
從 CI/CD 接入指南 開始接入 GitHub Actions、GitLab CI 或 Jenkins,再按本頁查參數。
全局呼叫格式
foxstore-cli [--output human|json|ndjson] <command>| 參數 | 預設值 | 說明 |
|---|---|---|
--output | human | human 供終端閱讀;json 輸出單個結構化結果;ndjson 輸出一條緊湊的最終結果,目前不輸出實時進度事件。該參數可放在子命令前後。 |
--help | - | 查看目前命令的實時幫助。 |
--version | - | 查看二進製版本。 |
--help / -h 始終輸出幫助文本;--version / -V 始終輸出版本文本,即使指定機器格式也不包 envelope。需要機器版本資訊時用 version --output json。
下文類型:string 是字符串(ID 保留字符串類型),path 是 Runner 本機路徑,i64 / i32 是有符號整數,u64 / u8 是非負整數,f64 是浮點數。標注“可選”表示可省略且無預設值;布爾“開關”只寫參數名,布爾“值”必須跟 true 或 false。所有發布和狀態命令均繼承對應 Provider 的憑據參數。
基礎命令:
foxstore-cli version
foxstore-cli providers --output json
foxstore-cli capabilities --provider apple --output json
foxstore-cli artifact inspect --file ./build/App.ipa --output json
foxstore-cli preflight apple --file ./build/App.ipa --output json
foxstore-cli preflight android --file ./build/App.aab --expected-package-name com.example.app --output json
foxstore-cli preflight huawei --file ./build/App.app --output json| 命令 | 參數 | 結果 |
|---|---|---|
version | 無 | 返回 version 和 engineSchemaVersion。 |
providers | 無 | 返回編譯進目前二進制的 Provider 與可用狀態。 |
capabilities | 必填 --provider <string> | 返回 Provider 描述、cliPublish 與排除能力,不是逐命令 schema。 |
artifact inspect | 必填 --file <path> | 識別發布產物類型、大小與 SHA-256。 |
preflight apple | 必填 --file <path> | 執行 Apple IPA 預檢。 |
preflight android | 必填 --file <path>;可選 --expected-package-name <string> | 執行 Android 套件預檢並可核對包名。 |
preflight huawei | 必填 --file <path> | 僅分析 HarmonyOS .app;華為 APK/AAB 使用 preflight android。 |
providers 會列出全部 15 個靜態 Provider;物件儲存項的 cliPublish 為 excluded。capabilities --provider 接收 ID:apple、google-play、huawei-appgallery、wechat-miniprogram、tencent-appstore、honor、samsung-galaxy-store、pgyer、vivo、xiaomi、oppo、aliyun、tencent-cloud、aws、minio。注意華為和 Samsung 的子命令分別寫 huawei、samsung,不是目錄 ID。
artifact inspect 只識別類型、大小和 SHA-256,不驗證簽名。preflight 是本地分析,不發起發布;Apple 即使返回成功 envelope / 退出 0,data.status 仍可能是 blocked,必須檢查 data.status == "ready" 和 data.checks[].blocksUpload。Android 的 warnings 也需要按團隊策略處理。publish apple 會再次預檢並阻止 blocked 套件;預檢通過不代表商店已接受。
憑據來源
Secret 不能直接作為普通命令行參數傳入。*-env 接收的是環境變量名,*-file 接收的是 CI 建立的臨時檔案路徑;同一 Secret 的兩者互斥,所有 *-env 為可選 string、*-file 為可選 path。未顯式指定時,CLI 使用下表預設環境變量。
| Provider | 預設環境變量 | 可替換參數 |
|---|---|---|
| Apple | APPLE_PRIVATE_KEY | --private-key-env / --private-key-file;Issuer ID 與 Key ID 分別用 --issuer-id、--key-id |
| Google Play | GOOGLE_PLAY_CREDENTIALS_JSON | --credentials-env / --credentials-file |
| Huawei HarmonyOS | HUAWEI_SERVICE_ACCOUNT_JSON | --service-account-env / --service-account-file |
| Huawei Android | HUAWEI_ANDROID_API_CLIENT_JSON | --android-api-client-env / --android-api-client-file |
| 微信小程序 | WECHAT_MINIPROGRAM_PRIVATE_KEY | --private-key-env / --private-key-file |
| 騰訊應用寶 | TENCENT_APPSTORE_USER_ID、TENCENT_APPSTORE_ACCESS_SECRET | --user-id-env / --user-id-file、--access-secret-env / --access-secret-file |
| 榮耀 | HONOR_CLIENT_ID、HONOR_API_SECRET | --client-id-env / --client-id-file、--api-secret-env / --api-secret-file |
| Samsung | SAMSUNG_CREDENTIALS_JSON | --credentials-env / --credentials-file |
| 蒲公英 | PGYER_API_KEY、PGYER_USER_KEY | --api-key-env / --api-key-file、--user-key-env / --user-key-file |
| vivo | VIVO_ACCESS_KEY、VIVO_ACCESS_SECRET | --access-key-env / --access-key-file、--access-secret-env / --access-secret-file |
| 小米 | XIAOMI_USER_NAME、XIAOMI_API_SECRET、XIAOMI_PUBLIC_CERTIFICATE | --user-name-env / --user-name-file、--api-secret-env / --api-secret-file、--public-certificate-env / --public-certificate-file |
| OPPO | OPPO_CLIENT_ID、OPPO_CLIENT_SECRET | --client-id-env / --client-id-file、--client-secret-env / --client-secret-file |
Apple 的 --issuer-id、--key-id 在 doctor/publish/status 都是必填 string。JSON 憑據傳入完整文檔內容,不是 JSON 檔案路徑字符串;Google/Huawei 使用各平台匯出的憑據 JSON,Samsung 使用 { "serviceAccountId": "…", "privateKey": "…", "accessToken": null }(前兩項必填 string,accessToken 可選 string)。私鑰保留 PEM 換行;不要將實際 Secret 寫進命令行、倉庫或記錄。
各憑據 JSON 的字段沿用匯出格式,不要統一轉成 camelCase:
| 憑據 | 文檔字段(均為 string,除注明外必填) |
|---|---|
| Google Play | type 固定 service_account、project_id、private_key_id、private_key、client_email、token_uri。 |
| Huawei Service Account | key_id、private_key、sub_account、auth_uri、token_uri、auth_provider_cert_uri、client_cert_uri;project_id 可選。 |
| Huawei Android API Client | client_id、client_secret。 |
| Samsung | serviceAccountId、privateKey;accessToken 可選。 |
CLI 不會自動讀取名為 *_FILE 的環境變量;必須顯式寫 --private-key-file "$APPLE_KEY_FILE" 等參數。華為的四個來源參數全部互斥:doctor/status 未指定時選擇 HarmonyOS Service Account;Android 必須顯式選擇 --android-api-client-env HUAWEI_ANDROID_API_CLIENT_JSON 或 --android-api-client-file <path>。publish 按 .app / .apk|.aab 選擇憑據類型,示例仍建議顯式指定來源以避免混淆。
連線診斷
doctor 檢查憑據與 Provider 連線或本機執行環境,不上傳或提交應用;通常會請求遠端,不能當作離線參數校驗。
foxstore-cli doctor apple --issuer-id "$APPLE_ISSUER_ID" --key-id "$APPLE_KEY_ID" --output json
foxstore-cli doctor google-play --package-name com.example.app --output json
foxstore-cli doctor huawei --output json
foxstore-cli doctor pgyer --output json
foxstore-cli doctor tencent-appstore --output json
foxstore-cli doctor vivo --package-name com.example.app --output json
foxstore-cli doctor samsung --output json
foxstore-cli doctor wechat-miniprogram --output json
foxstore-cli doctor oppo --output json
foxstore-cli doctor honor --output json
foxstore-cli doctor xiaomi --output jsonApple 需要 --issuer-id、--key-id;Google Play 需要 --package-name;vivo 需要 --package-name,並可用 --endpoint 覆蓋預設生產地址。騰訊應用寶還必須設定 TENCENT_APPSTORE_APP_ID 與 TENCENT_APPSTORE_PACKAGE_NAME 環境變量(string,doctor 沒有對應命令行參數)。其他命令的參數為各自憑據來源。微信僅檢查私鑰來源和本機 Node.js、miniprogram-ci、miniprogram-mp-ci,這兩個包必須能從目前目錄或父目錄的 node_modules 找到;它不驗證遠端上傳權限。小米使用固定探測包名查詢,不替代目標應用的 status 查詢。
發布命令與參數
Apple App Store
foxstore-cli publish apple \
--issuer-id "$APPLE_ISSUER_ID" --key-id "$APPLE_KEY_ID" \
--app-id 1234567890 --file ./build/App.ipa --output ndjson必填 string:--issuer-id、--key-id、--app-id;必填 path:--file,以及私鑰環境變量或檔案。CLI 通過 Build Upload API 上傳 IPA,成功資料為 { "provider": "apple", "buildUploadId": "…" };不提交 App Store 審核,也不保證 Apple 後續處理或 TestFlight 分發已完成。
Google Play
foxstore-cli publish google-play \
--package-name com.example.app --file ./build/App.aab \
--track internal --release-status completed \
--release-notes-file ./release-notes.json --output ndjson| 參數 | 必填/預設 | 說明 |
|---|---|---|
--package-name、--file | 必填 string / path | Play 包名與 APK/AAB 路徑。 |
--track | string,internal | 目標 Track。 |
--release-status | string,completed | 僅 draft、inProgress、completed;不接受 halted。 |
--user-fraction | 可選 f64 | inProgress 必填且 0 < 值 < 1,其他狀態不得傳入。 |
--release-name | string,空字符串 | 發布名稱。 |
--release-notes-file | 可選 path | JSON 數組;每項必填 string language 和 text;省略時為空數組。 |
release-notes.json 示例:
[{ "language": "zh-CN", "text": "修复已知问题" }, { "language": "en-US", "text": "Bug fixes" }]Huawei AppGallery
foxstore-cli publish huawei \
--app-id 123456 --expected-package-name com.example.app \
--file ./build/App.app --submit true --timeout-seconds 240 --output ndjson| 參數 | 必填/預設 | 說明 |
|---|---|---|
--app-id、--expected-package-name、--file | 必填 string / string / path | 支援 .app、.apk、.aab;憑據類型應與套件平台一致。 |
--chinese-mainland-flag | 可選 i32 | 僅 HarmonyOS 上傳區域標記:0 或 1。 |
--submit | bool 值,true | 上傳完成後是否提交發布。 |
--release-time、--remark | 可選 string | 發布時間使用 yyyy-MM-ddTHH:mm:ssZZ;備注僅 HarmonyOS 使用,填寫時 10–300 字符。 |
--release-phase | i64,0 | 僅 HarmonyOS:0 全網、3 分階段。 |
--phased-release-description | 可選 string | 僅 HarmonyOS;階段 3 必填,最多 500 字符。 |
--timeout-seconds | u64,240 | 僅 Android 編譯輪詢預算,須大於 0;按約每 2 秒一次計算次數,請求耗時另計。不是總 deadline,HarmonyOS 不使用此值。 |
蒲公英
foxstore-cli publish pgyer \
--file ./build/App.ipa --update-description "CI build" \
--timeout-seconds 180 --output ndjson--file 為必填 path(IPA/APK/HAP);--build-type 為可選 string:ios/ipa、android/apk、harmonyos/hap,預設按擴展名推斷;--update-description 為可選 string;--timeout-seconds 為 u64,預設 180 且須大於 0,覆蓋鑒權、上傳票據、上傳和輪詢的總 deadline。
騰訊應用寶
foxstore-cli publish tencent-appstore \
--package-name com.example.app --app-id 1000123 --file ./build/App.apk \
--release-notes "修复已知问题" --deploy-type 1 --output ndjson--package-name、--app-id 為必填 string,--file 為必填 APK path;--release-notes 為 string,預設空;--deploy-type 為 i64,預設 1,可選 1/2(定時);--deploy-time 為可選 i64 秒級時間戳,類型 2 時必填;--apk-64-only 是 bool 開關,預設 false。此流程更新已有應用。
vivo
foxstore-cli publish vivo \
--package-name com.example.app --file ./build/App.apk --version-code 42 \
--online-type 1 --update-description "修复已知问题" --output ndjson--package-name 為必填 string,--file 為必填 APK path,--version-code 為必填 i64;--online-type 為 i64,預設 1,可選 1/2(定時);--scheduled-online-time 為可選 string,類型 2 時必填;--update-description 為可選 string。--endpoint 為 string,預設 https://developer-api.vivo.com.cn/router/rest,另一個允許值為 https://sandbox-developer-api.vivo.com.cn/router/rest,不接受其他地址。
Samsung Galaxy Store
foxstore-cli publish samsung \
--content-id 000007654321 --file ./build/App.apk \
--uses-gms true --submit true --output ndjson--content-id 為必填 string,--file 為必填 APK path;--uses-gms 為可選 bool 值(例如 --uses-gms false),省略時沿用商店已有二進制的 GMS 設定;--release-at 為可選 i64 Unix 毫秒時間戳,必須晚於目前時間,且僅目前內容為 FOR_SALE 時可在此次更新設定;--submit 為 bool 值,預設 true,只上傳時寫 --submit false。
微信小程序
foxstore-cli publish wechat-miniprogram \
--appid wx1234567890 --project-path ./miniprogram --version 1.2.3 \
--description "CI build" --robot 1 --output ndjson--appid、--version 為必填 string,--project-path 為必填 path;--description 為 string,預設空;--robot 為可選 u8,範圍 1–30;--project-type 為 string,預設 miniProgram,可選 miniProgram、miniProgramPlugin、miniGame、miniGamePlugin。這是上傳程式碼版本,不是自動提審/上線命令;需滿足上文 Node.js 與兩項 npm 包前提。
OPPO / HeyTap
foxstore-cli publish oppo --request-file ./oppo-release.json --output ndjson--request-file 為必填 path。檔案是頂層 JSON 對象;以下為完整輸入字段,名稱區分大小寫。
| 字段 | JSON 類型 / 必填 | 約束 |
|---|---|---|
packageKind | string,必填 | ordinary 或 multi;必須顯式填寫。 |
apkFiles | object[],必填 | 每項必填 string filePath 和 integer cpuCode;普通包恰好一項且 cpuCode=0;多包恰好兩項且分別為 32、64。 |
packageName、versionCode、appName | string,必填 | versionCode 為正整數的字符串,必須與套件一致。 |
secondCategoryId、thirdCategoryId | integer,必填 | 商店有效分類 ID。 |
summary | string,必填 | 最多 13 字符,不含空格或標點。 |
detailDescription、updateDescription | string,必填 | 分別至少 20 / 5 字符。 |
privacyPolicyUrl、iconUrl、copyrightUrl | string,必填 | 隱私政策、已上傳圖標、版權材料 URL。 |
screenshotUrls | string[],必填 | 2–5 個已上傳的竪版截圖 URL。 |
testDescription | string,必填 | 測試附加說明,不可為空。 |
businessContactName、businessContactEmail、businessContactMobile | string,必填 | 商務聯繫人。 |
ageLevel | integer,必填 | 大於 0 的有效年齡分級。 |
adaptiveEquipment | integer,必填 | 4、5 或 6。 |
onlineType | integer,必填 | 1 或 2(定時)。 |
scheduledOnlineTime | string,可選 | onlineType=2 時必填。 |
landscapeScreenshotUrls | string[],可選 | 已上傳橫屏截圖 URL。 |
icpUrl、specialCertificateUrl、specialCertificateFileUrl | string,可選 | 備案/特殊資質 URL,按應用資質要求填寫。 |
adaptiveType | integer,可選 | 適配類型。 |
示例骨架(分類 ID、素材 URL、聯繫人、分級需替換成應用的真實資料;apkFiles 指向已構建 APK,CLI 不把本地圖片自動換成遠端 URL):
{
"packageKind": "ordinary",
"apkFiles": [{ "filePath": "./build/App.apk", "cpuCode": 0 }],
"packageName": "com.example.app", "versionCode": "42", "appName": "示例应用",
"secondCategoryId": 1, "thirdCategoryId": 1,
"summary": "便捷记录日常生活",
"detailDescription": "这是一款用于记录日常生活与管理个人事项的示例应用。",
"updateDescription": "修复已知问题并改善使用体验",
"privacyPolicyUrl": "https://example.com/privacy",
"iconUrl": "https://example.com/uploaded/icon.png",
"screenshotUrls": ["https://example.com/uploaded/1.png", "https://example.com/uploaded/2.png"],
"copyrightUrl": "https://example.com/uploaded/copyright.png",
"testDescription": "无需登录即可使用基础功能",
"businessContactName": "应用联系人", "businessContactEmail": "[email protected]",
"businessContactMobile": "13800000000", "ageLevel": 1,
"adaptiveEquipment": 4, "onlineType": 1
}榮耀應用市場
foxstore-cli publish honor \
--app-id 123456 --package-name com.example.app --file ./build/App.apk \
--audit-file ./honor-audit.json --output ndjson--app-id 為必填 i64,--package-name 為必填 string,--file(APK)與 --audit-file 為必填 path。審核 JSON 為頂層對象:
| 字段 | JSON 類型 / 必填 | 約束 |
|---|---|---|
releaseType | integer,必填 | 1 普通、2 定時、3 分階段。 |
forceUpdate | boolean,必填 | 使用 true/false,不是數字。 |
testAccount、testPassword | string,可選 | 審核測試帳號和密碼;含密碼的檔案應由 CI 臨時建立。 |
testComment | string,可選 | 最多 500 字符。 |
releaseTime | string,可選 | releaseType=2 時必填。 |
phasedReleasePercentage | string,可選 | releaseType=3 時必填,數值大於 0 且不超過 100。 |
phasedReleaseStart、phasedReleaseEnd | string,可選 | releaseType=3 時必填。 |
phasedReleaseNote | string,可選 | releaseType=3 時必填,最多 500 字符。 |
releaseNotesLanguage、releaseNotes | string,可選 | 非空 releaseNotes 需要對應語言 ID;更新說明最多 500 字符。 |
時間字符串使用 yyyy-MM-ddTHH:mm:ssZZ,例如 2026-10-01T09:00:00+0800。最小普通發布 honor-audit.json:
{ "releaseType": 1, "forceUpdate": false }小米應用商店
foxstore-cli publish xiaomi --request-file ./xiaomi-release.json --output ndjson--request-file 為必填 path。JSON 為頂層對象(無需新增 appInfo / RequestData 包裝):
| 字段 | JSON 類型 / 必填 | 約束 |
|---|---|---|
synchroType | integer,必填 | 0 新增、1 更新版本、2 更新資料;最終受帳號和應用權限約束。 |
appName、packageName、privacyUrl、iconPath | string,必填 | 非空;iconPath 為本地檔案路徑。 |
publisherName、versionName | string,可選 | 開發人員與版本名稱。 |
category、keyWords、description、brief | string,可選 | synchroType=0 時均必填。 |
updateDescription | string,可選 | synchroType=1 時必填。 |
testAccount | string,可選 | 內容是序列化 JSON 字符串,見下文。 |
onlineTime | integer,可選 | 上線時間。 |
suitableType | integer,可選 | 0、1 或 2。 |
apkPath | string,可選 | synchroType=0/1 時必填,本地 APK。 |
secondApkPath | string,可選 | 第二個本地 APK。 |
screenshotPaths | string[],預設 [] | 最多 5 個;新增應用至少 3 個本地截圖。 |
tabletScreenshotPaths | string[],預設 [] | 最多 5 個;新增且 suitableType=1/2 時至少 4 個。 |
更新版本示例 xiaomi-release.json(檔案必須存在且符合目標應用要求):
{
"synchroType": 1, "appName": "示例应用", "packageName": "com.example.app",
"privacyUrl": "https://example.com/privacy", "iconPath": "./store/icon.png",
"apkPath": "./build/App.apk", "updateDescription": "修复已知问题"
}testAccount 是嵌套 JSON 編碼後的字符串,例如 "{\"zh_CN\":{\"auditNotes\":\"无需登录\"}}";每個語言鍵對應對象,可含 auditNotes(最多 500 字符)與 accounts 數組(最多 5 項)。accounts 每項是對象:必填 integer t(1 或 2),可選 string a(帳號)、p(密碼)、c(補充值),三個字符串各最多 50 字符;帳號與密碼應同時填寫或同時留空。不要直接傳 JSON 對象給 testAccount。
狀態查詢
微信小程序上傳由本機 CI 同步返回結果,目前沒有獨立 status 命令;結果未知時到微信後台核對。其他查詢入口如下,均需同 Provider 憑據。未標注可選的參數均必填,預設類型 string;所有 status 都是一次查詢,不是持續等待。
| 命令 | 參數 |
|---|---|
status apple | --issuer-id、--key-id 與私鑰來源;按上傳時間倒序查詢憑據可見的 Build;沒有 --app-id 過濾,也不能用 buildUploadId 直接查詢。 |
status google-play | --package-name;返回 Tracks。 |
status huawei | --app-id;HarmonyOS 使用 Service Account;Android 使用 API Client 且至少傳一個可重複的 --package-id。 |
status pgyer | --app-key;可選 --build-key。 |
status tencent-appstore | --package-name、--app-id。 |
status vivo | --package-name;可選 --endpoint。 |
status samsung | --content-id。 |
status oppo | --package-name;可選 --version-code;多包查詢加 --multi-package(bool 開關,預設 false)。 |
status honor | --app-id 與一個或多個 --release-id(app-id 為 i64,每個 release-id 為 string,可重複)。 |
status xiaomi | --package-name。 |
機器輸出與退出碼
目前 schemaVersion 為字符串 "1"。json 是縮進 JSON;ndjson 是一條緊湊 JSON 行。兩種格式都只有最終結果,目前沒有上傳進度事件流。成功 envelope 寫入 stdout,錯誤 envelope(包括參數錯誤)寫入 stderr;不要只解析 stdout,也不要將兩個流混成一個 JSON 檔案。
成功示例(Apple 上傳,不表示已審核/上架):
{ "schemaVersion": "1", "status": "success", "data": { "provider": "apple", "buildUploadId": "example-upload-id" } }錯誤示例(僅展示結構):
{ "schemaVersion": "1", "status": "error", "error": { "code": "CLI_ARGUMENT_INVALID", "category": "input", "message": "缺少必填参数", "retryable": false } }data 由命令決定,可能是對象或數組,不保證包含 provider。error.code 為字符串,category 為下表的固定字符串,message 為說明,retryable 為 boolean。上游 Secret/鑒權資訊會做脫敏;輸入路徑和請求 JSON 中的業務文本仍應按團隊記錄策略保護。
| 退出碼 | 分類 | 流水線處理 |
|---|---|---|
0 | 成功 | 命令執行成功;還需判斷預檢/發布資料,不等於審核通過或上架。 |
2 | input:輸入或套件錯誤 | 修正參數或構建產物。 |
3 | credential:憑據錯誤 | 檢查 Secret 名稱、臨時檔案和權限。 |
4 | network:網路錯誤 | 僅在 retryable: true 時按策略重試。 |
5 | provider:Provider 拒絕或回應錯誤 | 讀取脫敏錯誤碼並修復權限、資料或平台狀態。 |
6 | unsupported:未支援能力 | 不要把該動作視為成功。 |
7 | result-unknown:結果未知 | 遠端寫入可能已發生;必須先執行 status 對賬,不能立即重複發布。 |
10 | internal:CLI 內部錯誤 | 保存版本和脫敏記錄後回饋。 |
重試與對賬邊界
退出碼 7 / result-unknown 表示遠端寫入可能已發生,通常 retryable: false。例如蒲公英在上傳開始前超時可返回 4;上傳請求發出後超時返回 7。華為 Android 編譯輪詢耗盡也返回 7。這是已知的結果未知分類,不保證所有平台中斷都能產生完整錯誤 envelope;Runner 超時、進程被終止或斷電時也應先對賬。
保存命令版本、產物哈希、應用/包名、版本號、構建號和返回的遠端 ID。用上表 status 比對這些標識與遠端狀態,不能僅憑 status 命令退出 0 判定該版本已發布。Apple 需從構建列表核對目標應用與構建,Google Play 需核對 Track 和 versionCodes;榮耀需 releaseId,華為 Android 需 packageId。如果失敗前未拿到這些 ID,或列表尚未出現該版本,請到商店控制台核對,不能虛構 ID 或立刻重新 publish。
沒有跨 Provider 的 wait、cancel、reconcile、統一 --timeout 或 --dry-run 命令。retryable: true 也不等於重複發布必定安全,需結合命令是否已經寫入遠端判斷。完整的 Secret 注入、輸出保存和流水線失敗保留示例見 CI/CD 接入指南。
