mcpField
A
asc-builds-upload

asc-builds-upload

github.com/tddworksCloud & DevOps587 installsUpdated 5w ago
Repository

About asc-builds-upload

asc-builds-upload is a skill for uploading builds to App Store Connect and managing their distribution through the `asc` CLI. It includes upload status checks, TestFlight beta group actions, compliance answers, and linking builds to versions.

Key features

  1. 01Upload IPA or PKG builds
  2. 02Check, list, and delete uploads
  3. 03Add builds to or remove them from beta groups
  4. 04Set encryption compliance answers
  5. 05Link a build to an app version

Use cases

  1. 01Upload a build and wait for processing
  2. 02Distribute a build to a TestFlight beta group
  3. 03Resolve missing encryption compliance
  4. 04Prepare a version for App Store review

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/tddworks/asc-cli-skills --skill asc-builds-upload

After installing, type/asc-builds-uploadin Claude Code to confirm it loaded.

Bundled filesreferences/workflow.md

Details

From the project README

asc Builds Upload

Upload and distribute builds via App Store Connect. See workflow.md for the full end-to-end flow and error handling.

Commands

Upload a build
asc builds upload \
  --app-id <APP_ID> \
  --file MyApp.ipa \
  --version 1.0.0 \
  --build-number 42 \
  [--platform ios|macos|tvos|visionos]  # auto-detected from extension
  [--wait]                               # poll until processing completes

Platform is auto-detected: .pkg → macos, everything else → ios.

Poll status
asc builds uploads get --upload-id <UPLOAD_ID>
asc builds uploads list --app-id <APP_ID>
asc builds uploads delete --upload-id <UPLOAD_ID>
TestFlight distribution
# Add build to a beta group
asc builds add-beta-group --build-id <BUILD_ID> --beta-group-id <GROUP_ID>

# Remove build from a beta group
asc builds remove-beta-group --build-id <BUILD_ID> --beta-group-id <GROUP_ID>

# Set "What's New" notes (creates or updates the localization)
asc builds update-beta-notes \
  --build-id <BUILD_ID> \
  --locale en-US \
  --notes "Bug fixes and improvements."
Export-compliance answer (ITSAppUsesNonExemptEncryption)

When an IPA is uploaded without ITSAppUsesNonExemptEncryption in Info.plist, ASC marks the build "Missing Compliance" and TestFlight external testing is blocked. Set the answer post-upload:

asc builds set-encryption-compliance --build-id <BUILD_ID> --uses-non-exempt-encryption true|false
  • false — exempt (most apps that only use HTTPS/TLS, Apple's default crypto, etc.).
  • true — uses non-exempt encryption — you'll also need an AppEncryptionDeclaration (currently only manageable via App Store Connect web UI).

Builds in the missing-compliance state advertise the affordance:

{
  "id": "build-1",
  "affordances": {
    "setEncryptionCompliance": "asc builds set-encryption-compliance --build-id build-1 --uses-non-exempt-encryption <true|false>"
  }
}

The affordance is suppressed once the answer is supplied (Build's usesNonExemptEncryption becomes non-nil).

Link build to version
asc versions set-build --version-id <VERSION_ID> --build-id <BUILD_ID>

Required before submitting a version for App Store review.

Resolve App ID

See project-context.md — check .asc/project.json before asking the user or running asc apps list.

Typical Workflow

APP_ID=$(cat .asc/project.json 2>/dev/null | jq -r '.appId // empty')
# If empty: ask user or run `asc apps list | jq -r '.data[0].id'`

# 1. Get the next build number automatically
BUILD_NUMBER=$(asc builds next-number --app-id "$APP_ID" --version 1.2.0 --platform ios)

# 2. Upload and wait
asc builds upload --app-id "$APP_ID" --file MyApp.ipa \
  --version 1.2.0 --build-number "$BUILD_NUMBER" --wait

# 3. Get the processed build ID
BUILD_ID=$(asc builds list --app-id $APP_ID | jq -r '.data[0].id')

# 4. Distribute to beta group
asc builds add-beta-group --build-id $BUILD_ID --beta-group-id $GROUP_ID

# 5. Set notes
asc builds update-beta-notes --build-id $BUILD_ID --locale en-US --notes "..."

# 5b. Answer export compliance if Info.plist didn't carry ITSAppUsesNonExemptEncryption
asc builds set-encryption-compliance --build-id $BUILD_ID --uses-non-exempt-encryption false

# 6. Link to version and submit
asc versions set-build --version-id $VERSION_ID --build-id $BUILD_ID
asc versions submit --version-id $VERSION_ID

CAEOAS Affordances

Upload responses include affordances with ready-to-run follow-up commands:

{
  "data": [{
    "affordances": {
      "checkStatus": "asc builds uploads get --upload-id abc123",
      "listBuilds": "asc builds list --app-id 123456789"
    },
    "state": "COMPLETE"
  }]
}

listBuilds only appears when state == "COMPLETE". Use affordances to navigate without memorizing IDs.

Reference

See workflow.md for:

  • Full 5-step upload API flow internals
  • Build upload states and polling logic
  • Error scenarios and troubleshooting

Comments

Markdown supported