{"id":"e53f12c4-2d47-4941-bb04-1258f68bc707","shortId":"ebMdfJ","kind":"skill","title":"asc-workflow","tagline":"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.","description":"# asc workflow\n\nUse this skill when you need lane-style automation inside the CLI using:\n\n- `asc workflow validate`\n- `asc workflow list`\n- `asc workflow run`\n\nWorkflows are repo-local automation files. They run trusted shell commands, stream step output to stderr, and keep stdout as machine-readable JSON.\n\n## Command discovery\n\nAlways verify flags with:\n\n```bash\nasc workflow --help\nasc workflow validate --help\nasc workflow list --help\nasc workflow run --help\n```\n\n## End-to-end flow\n\n1. Author `.asc/workflow.json`.\n2. Validate structure and references:\n\n```bash\nasc workflow validate\n```\n\n3. Discover public workflows:\n\n```bash\nasc workflow list\nasc workflow list --all\n```\n\n4. Preview execution:\n\n```bash\nasc workflow run --dry-run beta BUILD_ID:123456789 GROUP_ID:abcdef\n```\n\n5. Execute:\n\n```bash\nasc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdef\n```\n\n6. If a recoverable run fails, resume with the run ID from the JSON result:\n\n```bash\nasc workflow run release --resume \"release-20260312T120000Z-deadbeef\"\n```\n\nDo not pass extra `KEY:VALUE` params with `--resume`; the saved workflow file, params, and persisted outputs are reused.\n\n## File location and format\n\n- Default path: `.asc/workflow.json`\n- Override path: `asc workflow run --file ./path/to/workflow.json <name>`\n- JSONC comments are supported.\n- Top-level hooks: `before_all`, `after_all`, `error`\n- Workflow keys: `description`, `private`, `env`, `steps`\n- Step forms:\n  - string shorthand: `\"echo hello\"`\n  - `run` shell command\n  - `workflow` sub-workflow call\n  - `name` label\n  - `if` conditional var name\n  - `with` env overrides for workflow-call steps\n  - `outputs` map for JSON stdout extraction from named run steps\n\n## Outputs\n\nRun steps can declare outputs. The command must emit JSON on stdout, so pass `--output json` for `asc` commands that produce outputs.\n\nOutput references use:\n\n```text\n${steps.step_name.OUTPUT_NAME}\n```\n\nRules:\n\n- A step that declares `outputs` must have a reference-safe `name`.\n- Outputs are allowed on `run` steps, not workflow-call steps.\n- Output-producing names must be unique across workflows that can execute together in the same run graph.\n- Persisted outputs are stored in workflow run state, so do not map secrets into outputs.\n\n## Runtime params\n\n`asc workflow run <name> [KEY:VALUE ...]` supports both separators:\n\n```bash\nasc workflow run beta VERSION:2.1.0\nasc workflow run beta VERSION=2.1.0\n```\n\nRepeated keys are last-write-wins. In shell commands, reference params through shell expansion like `$VERSION`.\n\n## Env precedence\n\nMain workflow run:\n\n```text\ndefinition.env < workflow.env < CLI params\n```\n\nSub-workflow call with `with`:\n\n```text\nsub-workflow env < caller env and params < step with\n```\n\n## Conditionals\n\nAdd `\"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.\n\n## Example workflow\n\n```json\n{\n  \"env\": {\n    \"APP_ID\": \"123456789\",\n    \"VERSION\": \"1.0.0\",\n    \"GROUP_ID\": \"\"\n  },\n  \"before_all\": \"asc auth status\",\n  \"after_all\": \"echo workflow_done\",\n  \"error\": \"echo workflow_failed\",\n  \"workflows\": {\n    \"beta\": {\n      \"description\": \"Resolve the latest build and distribute it to TestFlight\",\n      \"steps\": [\n        {\n          \"name\": \"resolve_build\",\n          \"run\": \"asc builds info --app $APP_ID --latest --platform IOS --output json\",\n          \"outputs\": {\n            \"BUILD_ID\": \"$.data.id\"\n          }\n        },\n        {\n          \"name\": \"list_groups\",\n          \"run\": \"asc testflight groups list --app $APP_ID --limit 20 --output json\"\n        },\n        {\n          \"name\": \"add_build_to_group\",\n          \"if\": \"GROUP_ID\",\n          \"run\": \"asc builds add-groups --build-id ${steps.resolve_build.BUILD_ID} --group $GROUP_ID\"\n        }\n      ]\n    },\n    \"release\": {\n      \"description\": \"Validate, stage, and submit an App Store version\",\n      \"steps\": [\n        {\n          \"name\": \"validate\",\n          \"run\": \"asc validate --app $APP_ID --version $VERSION --platform IOS --output json\"\n        },\n        {\n          \"name\": \"stage\",\n          \"run\": \"asc release stage --app $APP_ID --version $VERSION --build $BUILD_ID --metadata-dir ./metadata/version/$VERSION --confirm --output json\"\n        },\n        {\n          \"name\": \"submit\",\n          \"if\": \"SUBMIT_FOR_REVIEW\",\n          \"run\": \"asc review submit --app $APP_ID --version $VERSION --build $BUILD_ID --confirm --output json\"\n        }\n      ]\n    },\n    \"publish-appstore\": {\n      \"description\": \"High-level upload plus App Store review submission\",\n      \"steps\": [\n        {\n          \"name\": \"publish\",\n          \"run\": \"asc publish appstore --app $APP_ID --ipa ./build/MyApp.ipa --version $VERSION --wait --submit --confirm --output json\"\n        }\n      ]\n    }\n  }\n}\n```\n\n## Useful invocations\n\n```bash\nasc workflow validate | jq -e '.valid == true'\nasc workflow list --pretty\nasc workflow list --all --pretty\nasc workflow run --dry-run beta BUILD_ID:123 GROUP_ID:grp_abc\nasc workflow run beta BUILD_ID:123 GROUP_ID:grp_abc | jq -e '.status == \"ok\"'\nasc workflow run release BUILD_ID:123 SUBMIT_FOR_REVIEW:true\nasc workflow run release --resume \"release-20260312T120000Z-deadbeef\"\n```\n\n## Safety rules\n\n- Treat `.asc/workflow.json` like code; only run trusted workflow files.\n- Avoid running workflows from untrusted PRs with secrets.\n- Keep workflow files in version control.\n- Validate first, dry-run next, then run.\n- Use explicit IDs and `--confirm` for mutating steps.\n- Use `asc validate`, `asc release stage`, `asc review submit`, and `asc publish appstore`; do not use removed submission commands.","tags":["asc","workflow","app","store","connect","cli","skills","rorkai","agent-skills","ai-skills","app-store-connect","apple"],"capabilities":["skill","source-rorkai","skill-asc-workflow","topic-agent-skills","topic-ai-skills","topic-app-store-connect","topic-apple","topic-asc","topic-automation","topic-cicd","topic-cli","topic-devops","topic-ios","topic-macos","topic-testflight"],"categories":["app-store-connect-cli-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-workflow","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add rorkai/app-store-connect-cli-skills","source_repo":"https://github.com/rorkai/app-store-connect-cli-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 801 github stars · SKILL.md body (5,672 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:27.755Z","embedding":null,"createdAt":"2026-04-18T21:56:56.725Z","updatedAt":"2026-05-18T18:53:27.755Z","lastSeenAt":"2026-05-18T18:53:27.755Z","tsv":"'/build/myapp.ipa':644 '/metadata/version':594 '/path/to/workflow.json':218 '1':107,440 '1.0.0':466 '123':680,691,706 '123456789':144,157,464 '2':110 '2.1.0':378,384 '20':527 '20260312t120000z':184,718 '3':119 '4':131 '5':148 '6':161 'abc':684,695 'abcdef':147,160 'across':336 'add':430,531,542 'add-group':541 'allow':320 'alway':82 'app':462,503,504,523,524,559,568,569,583,584,609,610,629,640,641 'appstor':622,639,773 'asc':2,19,30,46,49,52,87,90,94,98,116,124,127,135,151,177,214,294,364,373,379,471,500,519,539,566,580,606,637,655,662,666,671,685,700,711,762,764,767,771 'asc-workflow':1 'asc/workflow.json':22,109,211,723 'audit':9 'auth':472 'author':108 'autom':16,41,60 'avoid':731 'bash':86,115,123,134,150,176,372,654 'beta':141,154,376,382,484,677,688 'build':142,155,489,498,501,512,532,540,545,588,589,614,615,678,689,704 'build-id':544 'call':251,264,327,415 'caller':423 'case':447 'case-insensit':446 'check':450 'cli':44,410 'code':725 'command':66,80,246,283,295,394,779 'comment':220 'condit':255,429 'confirm':596,617,649,757 'control':744 'current':18 'data.id':514 'deadbeef':185,719 'declar':280,309 'default':209 'defin':4 'definition.env':408 'descript':234,485,553,623 'dir':593 'discov':120 'discoveri':81 'distribut':491 'done':478 'dri':139,675,748 'dry-run':138,674,747 'e':659,697 'echo':242,476,480 'emit':285 'end':103,105 'end-to-end':102 'env':236,259,402,422,424,461 'env/params':453 'environ':457 'error':231,479 'exampl':458 'execut':133,149,340 'expans':399 'explicit':754 'extra':189 'extract':271 'fail':166,482 'file':61,198,205,217,730,741 'first':454,746 'flag':84 'flow':106 'form':239 'format':208 'graph':346 'group':145,158,467,517,521,534,536,543,549,550,681,692 'grp':683,694 'hello':243 'help':89,93,97,101 'high':625 'high-level':624 'hook':226 'id':143,146,156,159,171,463,468,505,513,525,537,546,548,551,570,585,590,611,616,642,679,682,690,693,705,755 'includ':23 'info':502 'insensit':448 'insid':42 'invoc':653 'io':508,574 'ipa':643 'jq':658,696 'json':79,174,269,286,292,460,510,529,576,598,619,651 'jsonc':219 'keep':73,739 'key':190,233,367,386 'label':253 'lane':39 'lane-styl':38 'last':389 'last-write-win':388 'latest':488,506 'level':225,626 'like':400,724 'limit':526 'list':51,96,126,129,516,522,664,668 'local':12,59 'locat':206 'lookup':449 'machin':77 'machine-read':76 'main':404 'map':267,358 'merg':451 'metadata':592 'metadata-dir':591 'multi':14 'multi-step':13 'must':284,311,333 'mutat':759 'name':252,257,273,304,317,332,433,496,515,530,563,577,599,634 'need':37 'next':750 'ok':699 'output':25,69,202,266,276,281,291,298,299,310,318,330,348,361,509,511,528,575,597,618,650 'output-produc':329 'overrid':212,260 'param':192,199,363,396,411,426 'pass':188,290 'path':210,213 'persist':201,347 'platform':507,573 'plus':628 'preced':403 'pretti':665,670 'preview':132 'privat':235 'process':456 'produc':297,331 'prs':736 'public':121 'publish':621,635,638,772 'publish-appstor':620 'readabl':78 'recover':164 'refer':114,300,315,395 'reference-saf':314 'releas':180,183,552,581,703,714,717,765 'release-20260312t120000z-deadbeef':182,716 'release/testflight':28 'remov':777 'repeat':385 'repo':11,58 'repo-loc':10,57 'resolv':486,497 'result':175 'resum':7,167,181,194,715 'reus':204 'review':604,607,631,709,768 'rule':305,721 'run':6,54,63,100,137,140,153,165,170,179,216,244,274,277,322,345,353,366,375,381,406,499,518,538,565,579,605,636,673,676,687,702,713,727,732,749,752 'runtim':362 'safe':27,316 'safeti':720 'save':196 'secret':359,738 'separ':371 'shell':65,245,393,398 'shorthand':241 'skill':34 'skill-asc-workflow' 'source-rorkai' 'stage':555,578,582,766 'state':354 'status':473,698 'stderr':71 'stdout':74,270,288 'step':15,24,68,237,238,265,275,278,307,323,328,427,436,495,562,633,760 'steps.resolve_build.build':547 'steps.step_name.output':303 'store':350,560,630 'stream':67 'string':240 'structur':112 'style':40 'sub':249,413,420 'sub-workflow':248,412,419 'submiss':632,778 'submit':557,600,602,608,648,707,769 'support':222,369 'testflight':494,520 'text':302,407,418 'togeth':341 'top':224 'top-level':223 'topic-agent-skills' 'topic-ai-skills' 'topic-app-store-connect' 'topic-apple' 'topic-asc' 'topic-automation' 'topic-cicd' 'topic-cli' 'topic-devops' 'topic-ios' 'topic-macos' 'topic-testflight' 'treat':722 'true':441,661,710 'trust':64,728 'truthi':437 'uniqu':335 'untrust':735 'upload':627 'use':32,45,301,652,753,761,776 'valid':5,48,92,111,118,554,564,567,657,660,745,763 'valu':191,368,438 'var':256,432 'verifi':83 'version':377,383,401,465,561,571,572,586,587,595,612,613,645,646,743 'wait':647 'win':391 'workflow':3,20,29,31,47,50,53,55,88,91,95,99,117,122,125,128,136,152,178,197,215,232,247,250,263,326,337,352,365,374,380,405,414,421,452,459,477,481,483,656,663,667,672,686,701,712,729,733,740 'workflow-cal':262,325 'workflow.env':409 'write':390 'y':443 'yes':442","prices":[{"id":"ec846aa9-01a6-4d29-b5c5-c0be51263b5e","listingId":"e53f12c4-2d47-4941-bb04-1258f68bc707","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"rorkai","category":"app-store-connect-cli-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:56:56.725Z"}],"sources":[{"listingId":"e53f12c4-2d47-4941-bb04-1258f68bc707","source":"github","sourceId":"rorkai/app-store-connect-cli-skills/asc-workflow","sourceUrl":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-workflow","isPrimary":false,"firstSeenAt":"2026-04-18T21:56:56.725Z","lastSeenAt":"2026-05-18T18:53:27.755Z"},{"listingId":"e53f12c4-2d47-4941-bb04-1258f68bc707","source":"skills_sh","sourceId":"rorkai/app-store-connect-cli-skills/asc-workflow","sourceUrl":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-workflow","isPrimary":true,"firstSeenAt":"2026-05-07T20:42:09.821Z","lastSeenAt":"2026-05-07T22:41:26.188Z"}],"details":{"listingId":"e53f12c4-2d47-4941-bb04-1258f68bc707","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"rorkai","slug":"asc-workflow","github":{"repo":"rorkai/app-store-connect-cli-skills","stars":801,"topics":["agent-skills","ai-skills","app-store-connect","apple","asc","automation","cicd","cli","devops","ios","macos","testflight","xcode"],"license":"mit","html_url":"https://github.com/rorkai/app-store-connect-cli-skills","pushed_at":"2026-05-03T17:28:47Z","description":"Skills to automate app store deployed and everything related to it using the asc cli","skill_md_sha":"351d8d82014c057af4d7052f6657454cad79fb2d","skill_md_path":"skills/asc-workflow/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-workflow"},"layout":"multi","source":"github","category":"app-store-connect-cli-skills","frontmatter":{"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."},"skills_sh_url":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-workflow"},"updatedAt":"2026-05-18T18:53:27.755Z"}}