asc-workflow — Claude Code skill: App Store Connect workflows
Turns App Store Connect chores into a repo-local .asc/workflow.json the agent can validate, dry-run and resume after a failed step.
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a claude-codeWhat asc-workflow does
The skill teaches the agent to use asc workflow from the App Store Connect CLI: keep multi-step scenarios in .asc/workflow.json and drive them with validate, list and run. It walks the order from structure check to execution, plus the file format and how step outputs are passed around.
A workflow is a file in your repo, not a hosted service. Steps are either a plain string or an object with run, workflow, if, with, outputs, retry, timeout. The before_all, after_all and error hooks wrap the whole run. Outputs are read as ${steps.step_name.OUTPUT_NAME}, so the underlying asc command has to print JSON to stdout with --output json. A failed run is resumed by the run ID from the result, and you leave KEY:VALUE params off when you do it.
You need asc installed and authenticated first, which a hook like asc auth status confirms. Retry allows 2 to 100 attempts, with delay and timeout capped at 24 hours. A timeout without retry is final, because the command may already have gone through on Apple's side. Only wrap retry around commands you know are safe to repeat: the runner does not classify mutations for you. The file executes trusted shell commands, so a workflow from an unfamiliar PR is a reason to stop before adding secrets.
What it helps with
- check workflow structure before the first run
- list available workflows and preview one with
--dry-run - split a release into validate, stage and submit
- pull a build ID out of JSON and feed it to the next step
- resume a failed run with its saved outputs
Example prompts for the agent
- Validate
.asc/workflow.jsonwithasc workflow validateand tell me what is broken - Run
asc workflow run --dry-run beta BUILD_ID:123456789and walk me through the steps it would take - Add a step with
outputsandretry, reading${steps.resolve_build.BUILD_ID}
How to install asc-workflow
1Skills CLI (Vercel)
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a claude-code2Manually: put the files in place
~/.claude/skills/asc-workflow/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/asc-workflow/
1Skills CLI (Vercel)
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a codex2Manually: put the files in place
.agents/skills/asc-workflow/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a cursor2Manually: put the files in place
.cursor/skills/asc-workflow/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install rorkai/app-store-connect-cli-skills asc-workflow2Manually: put the files in place
.github/skills/asc-workflow/SKILL.md1Skills CLI (Vercel)
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a gemini-cli2Platform CLI
gemini skills install https://github.com/rorkai/app-store-connect-cli-skills --path skills/asc-workflowManually: put the files in place
.devin/skills/asc-workflow/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about asc-workflow
How do I install asc-workflow in Claude Code?
Run npx skills add rorkai/app-store-connect-cli-skills --skill asc-workflow -a claude-code; the skill then lives at ~/.claude/skills/asc-workflow/SKILL.md.
What does asc-workflow do?
It gives the agent a working procedure for repo-local App Store Connect automations: asc workflow validate, list and run, step outputs, bounded retries and resuming a failed run.
Can I pass params to a resumed run?
No. The saved workflow file, params and persisted outputs are reused, so extra KEY:VALUE pairs next to --resume are not passed.
Source text
SKILL.md · MIT
---
name: asc-workflow
description: 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.
---
# asc workflow
Use this skill when you need lane-style automation inside the CLI using:
- `asc workflow validate`
- `asc workflow list`
- `asc workflow run`
Workflows are repo-local automation files. They run trusted shell commands, stream step output to stderr, and keep stdout as machine-readable JSON.
## Command discovery
Always verify flags with:
```bash
asc workflow --help
asc workflow validate --help
asc workflow list --help
asc workflow run --help
```
## End-to-end flow
1. Author `.asc/workflow.json`.
2. Validate structure and references:
```bash
asc workflow validate
```
3. Discover public workflows:
```bash
asc workflow list
asc workflow list --all
```
4. Preview execution:
```bash
asc workflow run --dry-run beta BUILD_ID:123456789 GROUP_ID:abcdef
```
5. Execute:
```bash
asc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdef
```
6. If a recoverable run fails, resume with the run ID from the JSON result:
```bash
asc workflow run release --resume "release-20260312T120000Z-deadbeef"
```
Do not pass extra `KEY:VALUE` params with `--resume`; the saved workflow file, params, and persisted outputs are reused.
## File location and format
- Default path: `.asc/workflow.json`
- Override path: `asc workflow run --file ./path/to/workflow.json <name>`
- JSONC comments are supported.
- Top-level hooks: `before_all`, `after_all`, `error`
- Workflow keys: `description`, `private`, `env`, `steps`
- Step forms:
- string shorthand: `"echo hello"`
- `run` shell command
- `workflow` sub-workflow call
- `name` label
- `if` conditional var name
- `with` env overrides for workflow-call steps
- `outputs` map for JSON stdout extraction from named run steps
- `retry` fixed-delay retry policy for a `run` step
- `timeout` positive per-attempt duration for a `run` step
## Outputs
Run steps can declare outputs. The command must emit JSON on stdout, so pass `--output json` for `asc` commands that produce outputs.
Output references use:
```text
${steps.step_name.OUTPUT_NAME}
```
Rules:
- A step that declares `outputs` must have a reference-safe `name`.
- Outputs are allowed on `run` steps, not workflow-call steps.
- Output-producing names must be unique across workflows that can execute together in the same run graph.
- Persisted outputs are stored in workflow run state, so do not map secrets into outputs.
## Bounded retry and timeout
Add retry only to commands you have determined are safe to repeat. The runner does not classify commands or retry mutations on its own.
```json
{
"name": "resolve_build",
"run": "asc builds info --app $APP_ID --latest --platform IOS --output json",
"retry": {
"max_attempts": 3,
"delay": "5s"
},
"timeout": "2m"
}
```
`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.
## Runtime params
`asc workflow run <name> [KEY:VALUE ...]` supports both separators:
```bash
asc workflow run beta VERSION:2.1.0
asc workflow run beta VERSION=2.1.0
```
Repeated keys are last-write-wins. In shell commands, reference params through shell expansion like `$VERSION`.
## Env precedence
Main workflow run:
```text
definition.env < workflow.env < CLI params
```
Sub-workflow call with `with`:
```text
sub-workflow env < caller env and params < step with
```
## Conditionals
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.
## Example workflow
```json
{
"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-id $BUILD_ID --metadata-dir ./metadata --confirm --output json"
},
{
"name": "submit",
"if": "SUBMIT_FOR_REVIEW",
"run": "asc review submit --app $APP_ID --version $VERSION --build-id $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"
}
]
}
}
}
```
## Useful invocations
```bash
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"
```
## Safety rules
- Treat `.asc/workflow.json` like code; only run trusted workflow files.
- Avoid running workflows from untrusted PRs with secrets.
- Keep workflow files in version control.
- Validate first, dry-run next, then run.
- Use explicit IDs and `--confirm` for mutating steps.
- Use `asc validate`, `asc release stage`, `asc review submit`, and `asc publish appstore`; do not use removed submission commands.
© rorkai · MIT · rorkai/app-store-connect-cli-skills