CLI / API リファレンス
foxstore-cli は CI/CD 向けの非対話型公開 API です。ここでいう API は引数、ファイル、stdout/stderr、終了コードからなるプロセスインターフェースで、HTTP サービスは提供しません。foxstore-engine を静的リンクした単一の実行ファイルで、デスクトップ版のインストールや起動は不要です。デスクトップの SQLite 認証情報も読みません。
CLI は現在 Apple、Google Play、Huawei、WeChat ミニプログラム、Tencent MyApp、Honor、Samsung、Pgyer、vivo、Xiaomi、OPPO の公開を自動化します。オブジェクトストレージ、レビュー、Analytics、証明書の日常管理、画像最適化、AI アプリ診断は Engine と Desktop に留め、CLI には含めません。
CI/CD 連携ガイドで GitHub Actions、GitLab CI、Jenkins への導入を始め、パラメーターは本ページをご覧ください。
共通の呼び出し形式
foxstore-cli [--output human|json|ndjson] <command>| パラメーター | 既定値 | 説明 |
|---|---|---|
--output | human | human は端末表示、json は構造化結果1件、ndjson は圧縮形式の最終結果1件。現在リアルタイム進捗イベントはありません。サブコマンドの前後どちらにも指定できます。 |
--help | - | 現在のコマンドの実際のヘルプを表示。 |
--version | - | バイナリのバージョンを表示。 |
--help / -h は常にヘルプ文、--version / -V は常にバージョン文を出力し、機械形式を指定しても envelope は付きません。機械処理用には version --output json を使ってください。
以下の型:string は文字列(ID も文字列)、path は Runner 上のパス、i64 / i32 は符号付き整数、u64 / u8 は非負整数、f64 は浮動小数点数です。「任意」は省略可能で既定値なしを表します。bool の「フラグ」は名前だけ、「値」は true または false が必要です。すべての publish/status コマンドは対応 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 のみ。Huawei 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。Huawei と Samsung のサブコマンドは一覧 ID ではなく huawei、samsung です。
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。明示しない場合は下表の既定環境変数を使います。
| 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 ミニプログラム | WECHAT_MINIPROGRAM_PRIVATE_KEY | --private-key-env / --private-key-file |
| Tencent MyApp | TENCENT_APPSTORE_USER_ID、TENCENT_APPSTORE_ACCESS_SECRET | --user-id-env / --user-id-file、--access-secret-env / --access-secret-file |
| Honor | 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 | 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 | 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 認証情報はファイルパス文字列ではなく文書全体を渡します。Google/Huawei は各プラットフォームのエクスポート JSON、Samsung は { "serviceAccountId": "…", "privateKey": "…", "accessToken": null }(前2項目は必須 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" などを明示します。Huawei の4つのソース引数はすべて排他です。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 による本番 URL の変更が可能です。Tencent MyApp はさらに string 環境変数 TENCENT_APPSTORE_APP_ID、TENCENT_APPSTORE_PACKAGE_NAME が必要です(doctor に対応引数なし)。他のコマンドは各認証ソースを指定します。WeChat は秘密鍵ソースと本機の Node.js、miniprogram-ci、miniprogram-mp-ci のみ確認し、2パッケージは現在または親ディレクトリの node_modules から見つかる必要があります。リモートのアップロード権限は検証しません。Xiaomi は固定の検査用パッケージ名を照会し、対象アプリの 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。秘密鍵の環境変数またはファイルも必要です。Build Upload API で IPA をアップロードし、成功時は { "provider": "apple", "buildUploadId": "…" } を返します。App Store 審査には提出せず、後続処理や 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 では未使用。 |
Pgyer
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 です。
Tencent MyApp
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)で、省略時はストアの既存バイナリの設定を継承。--release-at は任意 i64 Unix ミリ秒で未来の時刻が必要、現コンテンツが FOR_SALE の場合のみ今回の更新で設定可。--submit は bool 値、既定 true、アップロードのみは --submit false。
WeChat ミニプログラム
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 と2つの npm パッケージが必要です。
OPPO / HeyTap
foxstore-cli publish oppo --request-file ./oppo-release.json --output ndjson--request-file はトップレベル JSON オブジェクトの必須 path。以下が全入力フィールドで、大文字小文字を区別します。
| フィールド | JSON 型/必須 | 制約 |
|---|---|---|
packageKind | string、必須 | ordinary または multi。明示必須。 |
apkFiles | object[]、必須 | 各項目に string filePath と integer cpuCode が必須。通常は1項目のみ、cpuCode=0。複数は2項目のみ、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[]、必須 | アップロード済み縦向きスクリーンショット URL、2~5件。 |
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
}Honor App Market
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 }Xiaomi App Store
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、任意 | 2つ目のローカル 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件)を含められます。各 account は必須 integer t(1 または2)、任意 string a(アカウント)、p(パスワード)、c(追加値)を持ち、各文字列は最大50文字。アカウントとパスワードは両方指定するか両方空にします。testAccount に JSON オブジェクトを直接渡さないでください。
状態照会
WeChat ミニプログラムはローカル CI から同期で結果を返し、独立した status はありません。不明な場合は WeChat 管理画面で確認します。以下の照会も対応 Provider の認証情報が必要です。特記のない引数はすべて必須 string。すべての status は1回の照会で、継続待機ではありません。
| コマンド | パラメーター |
|---|---|
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 と1つ以上の繰り返し指定可能な --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 と1つ以上の --release-id(app-id は i64、release-id は繰り返し可能な string)。 |
status xiaomi | --package-name。 |
機械処理用出力と終了コード
現在の schemaVersion は文字列 "1"。json は字下げ付き JSON、ndjson は圧縮 JSON 1行です。どちらも最終結果のみで、アップロード進捗のイベントストリームはありません。成功 envelope は stdout、エラー envelope(引数エラー含む)は stderr。stdout だけを解析したり、両ストリームを1つの 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:拒否/レスポンスエラー | 機密情報除去済みコードを読み、権限、資料、状態を修正。 |
6 | unsupported:未対応機能 | 成功扱いしない。 |
7 | result-unknown:結果不明 | リモート書き込み済みの可能性あり。必ず status で照合し、直ちに再公開しない。 |
10 | internal:CLI 内部エラー | バージョンと機密情報除去済みログを保存して報告。 |
再試行と照合の境界
終了 7 / result-unknown はリモート書き込み済みの可能性を示し、通常 retryable: false です。Pgyer は開始前タイムアウトなら 4、送信後なら 7。Huawei Android のコンパイルポーリング上限も 7。これは既知の結果不明分類で、すべての中断で完全なエラー envelope が出る保証ではありません。Runner のタイムアウト、プロセス終了、停電でも先に照合してください。
コマンドのバージョン、成果物ハッシュ、アプリ/パッケージ名、バージョン、ビルド番号、返却されたリモート ID を保存します。上表の status で識別子と状態を照合し、終了 0 だけで公開済みと判断しないでください。Apple はビルド一覧で対象アプリとビルド、Google Play は Track と versionCodes、Honor は releaseId、Huawei Android は packageId が必要です。失敗前に ID を得られなかった場合や未反映の場合は管理画面で確認し、ID を捏造したりすぐ再 publish したりしないでください。
Provider 共通の wait、cancel、reconcile、統一 --timeout、--dry-run はありません。retryable: true でも再公開が必ず安全とは限らず、リモート書き込みの有無で判断します。Secret 注入、出力保存、パイプライン失敗の維持の完全な例は CI/CD 連携ガイドを参照してください。
