npx skills add ...
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow
Define, validate, run, resume, and audit repo-local multi-step automations with current `asc workflow` and `.asc/workflow.json`, including step outputs and safe release/TestFlight workflows.
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow
Use this skill when you need lane-style automation inside the CLI using:
asc workflow validateasc workflow listasc workflow runWorkflows are repo-local automation files. They run trusted shell commands, stream step output to stderr, and keep stdout as machine-readable JSON.
Always verify flags with:
.asc/workflow.json.Do not pass extra KEY:VALUE params with --resume; the saved workflow file, params, and persisted outputs are reused.
.asc/workflow.jsonasc workflow run --file ./path/to/workflow.json <name>before_all, after_all, errordescription, private, env, steps"echo hello"run shell commandworkflow sub-workflow callname labelif conditional var namewith env overrides for workflow-call stepsoutputs map for JSON stdout extraction from named run stepsretry fixed-delay retry policy for a run steptimeout positive per-attempt duration for a run stepRun steps can declare outputs. The command must emit JSON on stdout, so pass --output json for asc commands that produce outputs.
Output references use:
Rules:
outputs must have a reference-safe name.run steps, not workflow-call steps.Add retry only to commands you have determined are safe to repeat. The runner does not classify commands or retry mutations on its own.
retry.max_attempts counts the first attempt and must be between 2 and 100. Retry delays and timeouts must be positive durations no longer than 24 hours. Both fields work only on run steps, not workflow calls or lifecycle hooks.
A timeout without retry is terminal because the command may have completed remotely. Pairing retry and timeout is the explicit signal that another attempt is safe. Resume requires either a successful checkpoint or a retry-enabled failed step; output-extraction failures cannot be resumed.
asc workflow run <name> [KEY:VALUE ...] supports both separators:
Repeated keys are last-write-wins. In shell commands, reference params through shell expansion like $VERSION.
Main workflow run:
Sub-workflow call with with:
Add "if": "VAR_NAME" to a step. Truthy values are 1, true, yes, y, and on, case-insensitive. Lookup checks merged workflow env/params first, then process environment.
.asc/workflow.json like code; only run trusted workflow files.--confirm for mutating steps.asc validate, asc release stage, asc review submit, and asc publish appstore; do not use removed submission commands.asc workflow validateasc workflow list
asc workflow list --allasc workflow run --dry-run beta BUILD_ID:123456789 GROUP_ID:abcdefasc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdefasc workflow run release --resume "release-20260312T120000Z-deadbeef"${steps.step_name.OUTPUT_NAME}{
"name": "resolve_build",
"run": "asc builds info --app $APP_ID --latest --platform IOS --output json",
"retry": {
"max_attempts": 3,
"delay": "5s"
},
"timeout": "2m"
}asc workflow run beta VERSION:2.1.0
asc workflow run beta VERSION=2.1.0definition.env < workflow.env < CLI paramssub-workflow env < caller env and params < step with{
"env": {
"APP_ID": "123456789",
"VERSION": "1.0.0",
"GROUP_ID": ""
},
"before_all": "asc auth status",
"after_all": "echo workflow_done",
"error": "echo workflow_failed",
"workflows": {
"beta": {
"description": "Resolve the latest build and distribute it to TestFlight",
"steps": [
{
"name": "resolve_build",
"run": "asc builds info --app $APP_ID --latest --platform IOS --output json",
"outputs": {
"BUILD_ID": "$.data.id"
}
},
{
"name": "list_groups",
"run": "asc testflight groups list --app $APP_ID --limit 20 --output json"
},
{
"name": "add_build_to_group",
"if": "GROUP_ID",
"run": "asc builds add-groups --build-id ${steps.resolve_build.BUILD_ID} --group $GROUP_ID"
}
]
},
"release": {
"description": "Validate, stage, and submit an App Store version",
"steps": [
{
"name": "validate",
"run": "asc validate --app $APP_ID --version $VERSION --platform IOS --output json"
},
{
"name": "stage",
"run": "asc release stage --app $APP_ID --version $VERSION --build $BUILD_ID --metadata-dir ./metadata/version/$VERSION --confirm --output json"
},
{
"name": "submit",
"if": "SUBMIT_FOR_REVIEW",
"run": "asc review submit --app $APP_ID --version $VERSION --build $BUILD_ID --confirm --output json"
}
]
},
"publish-appstore": {
"description": "High-level upload plus App Store review submission",
"steps": [
{
"name": "publish",
"run": "asc publish appstore --app $APP_ID --ipa ./build/MyApp.ipa --version $VERSION --wait --submit --confirm --output json"
}
]
}
}
}asc workflow validate | jq -e '.valid == true'
asc workflow list --pretty
asc workflow list --all --pretty
asc workflow run --dry-run beta BUILD_ID:123 GROUP_ID:grp_abc
asc workflow run beta BUILD_ID:123 GROUP_ID:grp_abc | jq -e '.status == "ok"'
asc workflow run release BUILD_ID:123 SUBMIT_FOR_REVIEW:true
asc workflow run release --resume "release-20260312T120000Z-deadbeef"