{"id":"e53f12c4-2d47-4941-bb04-1258f68bc707","shortId":"ebMdfJ","kind":"skill","title":"asc-workflow","tagline":"Define, validate, and run repo-local multi-step automations with `asc workflow` and `.asc/workflow.json`. Use when migrating from lane tools, wiring CI pipelines, or orchestrating repeatable `asc` + shell release flows with hooks, conditionals, and sub-workflows.","description":"# asc workflow\n\nUse this skill when you need lane-style automation inside the CLI using:\n- `asc workflow run`\n- `asc workflow validate`\n- `asc workflow list`\n\nThis feature is best for deterministic automation that lives in your repo, is reviewable in PRs, and can run the same way locally and in CI.\n\n## Command discovery\n\n- Always use `--help` to confirm flags and subcommands:\n  - `asc workflow --help`\n  - `asc workflow run --help`\n  - `asc workflow validate --help`\n  - `asc workflow list --help`\n\n## End-to-end flow\n\n1. Author `.asc/workflow.json`\n2. Validate structure and references:\n   - `asc workflow validate`\n3. Discover available workflows:\n   - `asc workflow list`\n   - `asc workflow list --all` (includes private helpers)\n4. Preview execution without side effects:\n   - `asc workflow run --dry-run beta`\n5. Execute with runtime params:\n   - `asc workflow run beta BUILD_ID:123456789 GROUP_ID:abcdef`\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 (`//` and `/* ... */`)\n\n## Output and CI contract\n\n- `stdout`: structured JSON result (`status`, `steps`, durations)\n- `stderr`: step command output, hook output, dry-run previews\n- `asc workflow validate` always prints JSON and returns non-zero when invalid\n\nThis enables machine-safe checks:\n\n```bash\nasc workflow validate | jq -e '.valid == true'\nasc workflow run beta BUILD_ID:123 GROUP_ID:xyz | jq -e '.status == \"ok\"'\n```\n\n## Schema (what the feature supports)\n\nTop-level keys:\n- `env`: global defaults\n- `before_all`: command run once before steps\n- `after_all`: command run once after successful steps\n- `error`: command run when any failure occurs\n- `workflows`: named workflow map\n\nWorkflow keys:\n- `description`\n- `private` (not directly runnable)\n- `env`\n- `steps`\n\nStep forms:\n- String shorthand: `\"echo hello\"` -> run step\n- Object with:\n  - `run`: shell command\n  - `workflow`: call sub-workflow\n  - `name`: label for reporting\n  - `if`: conditional var name\n  - `with`: env overrides for workflow-call steps only\n\n## Runtime params (`KEY:VALUE` / `KEY=VALUE`)\n\n- `asc workflow run <name> [KEY:VALUE ...]` supports both separators:\n  - `VERSION:2.1.0`\n  - `VERSION=2.1.0`\n- If both separators exist, the first one wins.\n- Repeated keys are last-write-wins.\n- In step commands, reference params via shell expansion (`$VAR`).\n- Avoid putting secrets in `.asc/workflow.json`; pass them via CI secrets/env.\n\n## Run-tail flags\n\n`asc workflow run` also accepts core flags after the workflow name:\n- `--dry-run`\n- `--pretty`\n- `--file`\n\nExamples:\n- `asc workflow run beta --dry-run`\n- `asc workflow run beta --file .asc/workflow.json BUILD_ID:123`\n\n## Execution semantics\n\n- `before_all` runs once before step execution\n- `after_all` runs only when steps succeed\n- `error` runs on failure (step failure, before/after hook failure)\n- Sub-workflows are executed inline as part of the call step\n- Maximum sub-workflow nesting depth is 16\n\n## Env precedence\n\nMain workflow run:\n- `definition.env` < `workflow.env` < CLI params\n\nSub-workflow call step (`\"workflow\": \"...\", \"with\": {...}`):\n- sub-workflow `env` defaults\n- caller env (including CLI params) overrides\n- step `with` overrides all\n\n## Sub-workflows and private workflows\n\n- Use `\"workflow\": \"<name>\"` to call helper workflows.\n- Use `\"private\": true` for helper-only workflows.\n- Private workflows:\n  - cannot be run directly\n  - can be called by other workflows\n  - are hidden from `asc workflow list` unless `--all` is used\n- Validation catches unknown workflow references and cyclic references.\n\n## Conditionals (`if`)\n\n- Add `\"if\": \"VAR_NAME\"` on a step.\n- Step runs only if `VAR_NAME` is truthy.\n- Truthy: `1`, `true`, `yes`, `y`, `on` (case-insensitive).\n- Resolution order for `if` lookup:\n  1. merged workflow env/params\n  2. `os.Getenv(VAR_NAME)`\n\n## Dry-run behavior\n\n- `asc workflow run --dry-run <name>` does not execute commands.\n- It prints previews to `stderr`.\n- Dry-run shows raw commands (without env expansion), which helps avoid secret leakage in previews.\n\n## Shell behavior\n\n- Run steps use `bash -o pipefail -c` when bash is available.\n- Fallback is `sh -c` when bash is unavailable.\n- Pipelines therefore fail correctly in most CI shells when bash exists.\n\n## Practical authoring rules\n\n- Keep workflow files in version control.\n- Use IDs in step commands where possible for deterministic automation.\n- Use `--confirm` for destructive `asc` operations inside steps.\n- Validate first, then dry-run, then real run.\n- Keep hooks lightweight and side-effect aware.\n\n```json\n{\n  \"env\": {\n    \"APP_ID\": \"123456789\",\n    \"VERSION\": \"1.0.0\"\n  },\n  \"before_all\": \"asc auth status\",\n  \"after_all\": \"echo workflow_done\",\n  \"error\": \"echo workflow_failed\",\n  \"workflows\": {\n    \"beta\": {\n      \"description\": \"Distribute a build to a TestFlight group and notify\",\n      \"env\": {\n        \"GROUP_ID\": \"\"\n      },\n      \"steps\": [\n        {\n          \"name\": \"list_builds\",\n          \"run\": \"asc builds list --app $APP_ID --sort -uploadedDate --limit 5\"\n        },\n        {\n          \"name\": \"list_groups\",\n          \"run\": \"asc testflight groups list --app $APP_ID --limit 20\"\n        },\n        {\n          \"name\": \"add_build_to_group\",\n          \"if\": \"BUILD_ID\",\n          \"run\": \"asc builds add-groups --build-id $BUILD_ID --group $GROUP_ID\"\n        },\n        {\n          \"name\": \"notify\",\n          \"if\": \"SLACK_WEBHOOK\",\n          \"run\": \"echo sent_release_notice\"\n        }\n      ]\n    },\n    \"release\": {\n      \"description\": \"Submit a version for App Store review\",\n      \"steps\": [\n        {\n          \"workflow\": \"sync-metadata\",\n          \"with\": {\n            \"METADATA_DIR\": \"./metadata\"\n          }\n        },\n        {\n          \"name\": \"submit\",\n          \"run\": \"asc submit create --app $APP_ID --version $VERSION --build $BUILD_ID --confirm\"\n        }\n      ]\n    },\n    \"sync-metadata\": {\n      \"private\": true,\n      \"description\": \"Private helper workflow (callable only via workflow steps)\",\n      \"steps\": [\n        {\n          \"name\": \"migrate_validate\",\n          \"run\": \"echo METADATA_DIR_is_$METADATA_DIR\"\n        }\n      ]\n    }\n  }\n}\n```\n\n## Useful invocations\n\n```bash\n# Validate and fail CI on invalid file\nasc workflow validate | jq -e '.valid == true'\n\n# Show discoverable workflows\nasc workflow list --pretty\n\n# Include private helpers\nasc workflow list --all --pretty\n\n# Preview a real run\nasc workflow run --dry-run beta BUILD_ID:123 GROUP_ID:grp_abc\n\n# Run with params and assert success\nasc workflow run beta BUILD_ID:123 GROUP_ID:grp_abc | jq -e '.status == \"ok\"'\n```","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 · 776 github stars · SKILL.md body (6,671 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-02T18:53:03.411Z","embedding":null,"createdAt":"2026-04-18T21:56:56.725Z","updatedAt":"2026-05-02T18:53:03.411Z","lastSeenAt":"2026-05-02T18:53:03.411Z","tsv":"'/metadata':818 '/path/to/workflow.json':190 '1':124,573,586 '1.0.0':711 '123':250,428,904,921 '123456789':173,709 '16':473 '2':127,590 '2.1.0':355,357 '20':768 '3':135 '4':149 '5':162,755 'abc':908,925 'abcdef':176 'accept':400 'add':557,770,781 'add-group':780 'also':399 'alway':96,220 'app':707,749,750,764,765,807,825,826 'asc':2,16,32,43,59,62,65,104,107,111,115,132,139,142,155,167,186,217,237,244,346,396,413,420,540,598,684,714,746,760,778,822,869,879,886,895,915 'asc-workflow':1 'asc/workflow.json':19,126,183,386,425 'assert':913 'auth':715 'author':125,662 'autom':14,54,74,679 'avail':137,641 'avoid':382,624 'awar':704 'bash':236,634,639,647,659,861 'before/after':451 'behavior':597,630 'best':71 'beta':161,170,247,416,423,727,901,918 'build':171,248,426,731,744,747,771,775,779,784,786,830,831,902,919 'build-id':783 'c':637,645 'call':319,337,464,486,514,533 'callabl':843 'caller':495 'cannot':527 'case':579 'case-insensit':578 'catch':548 'check':235 'ci':27,93,198,390,656,865 'cli':57,481,498 'command':94,209,272,279,286,317,375,607,618,674 'comment':192 'condit':38,328,555 'confirm':100,681,833 'contract':199 'control':669 'core':401 'correct':653 'creat':824 'cyclic':553 'default':181,269,494 'defin':4 'definition.env':479 'depth':471 'descript':298,728,802,839 'destruct':683 'determinist':73,678 'dir':817,855,858 'direct':301,530 'discov':136 'discover':877 'discoveri':95 'distribut':729 'done':721 'dri':159,214,408,418,595,602,614,692,899 'dry-run':158,213,407,417,594,601,613,691,898 'durat':206 'e':241,255,873,927 'echo':309,719,723,797,853 'effect':154,703 'enabl':231 'end':120,122 'end-to-end':119 'env':267,303,332,474,493,496,620,706,738 'env/params':589 'error':285,445,722 'exampl':412 'execut':151,163,429,437,458,606 'exist':361,660 'expans':380,621 'fail':652,725,864 'failur':290,448,450,453 'fallback':642 'featur':69,261 'file':177,189,411,424,666,868 'first':363,689 'flag':101,395,402 'flow':35,123 'form':306 'format':180 'global':268 'group':174,251,735,739,758,762,773,782,788,789,905,922 'grp':907,924 'hello':310 'help':98,106,110,114,118,623 'helper':148,515,522,841,885 'helper-on':521 'hidden':538 'hook':37,211,452,698 'id':172,175,249,252,427,671,708,740,751,766,776,785,787,790,827,832,903,906,920,923 'includ':146,497,883 'inlin':459 'insensit':580 'insid':55,686 'invalid':229,867 'invoc':860 'jq':240,254,872,926 'json':202,222,705 'jsonc':191 'keep':664,697 'key':266,297,342,344,349,367 'label':324 'lane':24,52 'lane-styl':51 'last':370 'last-write-win':369 'leakag':626 'level':265 'lightweight':699 'limit':754,767 'list':67,117,141,144,542,743,748,757,763,881,888 'live':76 'local':10,90 'locat':178 'lookup':585 'machin':233 'machine-saf':232 'main':476 'map':295 'maximum':466 'merg':587 'metadata':814,816,836,854,857 'migrat':22,850 'multi':12 'multi-step':11 'name':293,323,330,406,560,569,593,742,756,769,791,819,849 'need':50 'nest':470 'non':226 'non-zero':225 'notic':800 'notifi':737,792 'o':635 'object':313 'occur':291 'ok':257,929 'one':364 'oper':685 'orchestr':30 'order':582 'os.getenv':591 'output':196,210,212 'overrid':184,333,500,503 'param':166,341,377,482,499,911 'part':461 'pass':387 'path':182,185 'pipefail':636 'pipelin':28,650 'possibl':676 'practic':661 'preced':475 'pretti':410,882,890 'preview':150,216,610,628,891 'print':221,609 'privat':147,299,509,518,525,837,840,884 'prs':83 'put':383 'raw':617 'real':695,893 'refer':131,376,551,554 'releas':34,799,801 'repeat':31,366 'repo':9,79 'repo-loc':8 'report':326 'resolut':581 'result':203 'return':224 'review':81,809 'rule':663 'run':7,61,86,109,157,160,169,188,215,246,273,280,287,311,315,348,393,398,409,415,419,422,433,440,446,478,529,565,596,600,603,615,631,693,696,745,759,777,796,821,852,894,897,900,909,917 'run-tail':392 'runnabl':302 'runtim':165,340 'safe':234 'schema':258 'secret':384,625 'secrets/env':391 'semant':430 'sent':798 'separ':353,360 'sh':644 'shell':33,316,379,629,657 'shorthand':308 'show':616,876 'side':153,702 'side-effect':701 'skill':47 'skill-asc-workflow' 'slack':794 'sort':752 'source-rorkai' 'status':204,256,716,928 'stderr':207,612 'stdout':200 'step':13,205,208,276,284,304,305,312,338,374,436,443,449,465,487,501,563,564,632,673,687,741,810,847,848 'store':808 'string':307 'structur':129,201 'style':53 'sub':41,321,455,468,484,491,506 'sub-workflow':40,320,454,467,483,490,505 'subcommand':103 'submit':803,820,823 'succeed':444 'success':283,914 'support':194,262,351 'sync':813,835 'sync-metadata':812,834 'tail':394 'testflight':734,761 'therefor':651 'tool':25 'top':264 'top-level':263 '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' 'true':243,519,574,838,875 'truthi':571,572 'unavail':649 'unknown':549 'unless':543 'uploadedd':753 'use':20,45,58,97,511,517,546,633,670,680,859 'valid':5,64,113,128,134,219,239,242,547,688,851,862,871,874 'valu':343,345,350 'var':329,381,559,568,592 'version':354,356,668,710,805,828,829 'via':378,389,845 'way':89 'webhook':795 'win':365,372 'wire':26 'without':152,619 'workflow':3,17,42,44,60,63,66,105,108,112,116,133,138,140,143,156,168,187,218,238,245,292,294,296,318,322,336,347,397,405,414,421,456,469,477,485,488,492,507,510,512,516,524,526,536,541,550,588,599,665,720,724,726,811,842,846,870,878,880,887,896,916 'workflow-cal':335 'workflow.env':480 'write':371 'xyz':253 'y':576 'yes':575 'zero':227","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-02T18:53:03.411Z"}],"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":776,"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-04-24T08:59:37Z","description":"Skills to automate app store deployed and everything related to it using the asc cli","skill_md_sha":"b8b036584f11151b31f366306e258ea17cdf248e","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, and run repo-local multi-step automations with `asc workflow` and `.asc/workflow.json`. Use when migrating from lane tools, wiring CI pipelines, or orchestrating repeatable `asc` + shell release flows with hooks, conditionals, and sub-workflows."},"skills_sh_url":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-workflow"},"updatedAt":"2026-05-02T18:53:03.411Z"}}