tddworks/asc-cli-skills

asc-beta-review

Manage beta app review submissions and review contact details for TestFlight external testing using the `asc` CLI tool. Use this skill when: (1) Submitting a build for beta app review: "asc beta-review submissions create --build-id ID" (2) Checking beta review submission status: "asc beta-review submissions list --build-id ID" (3) Getting a specific submission: "asc beta-review submissions get --submission-id ID" (4) Getting beta review contact details: "asc beta-review detail get --app-id ID" …

First seen Mar 14, 2026

Installation

$ npx skills add tddworks/asc-cli-skills --skill asc-beta-review

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from tddworks/asc-cli-skills · top by installs.

npx skills add tddworks/asc-cli-skills

Browse all from tddworks/asc-cli-skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 3
License MIT
Default branch main
Open issues 0
Status Active

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 7,939 B
  • docs SUMMARY.md 1,003 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 69 installs

SKILL.md

Beta App Review with asc

Submit builds for TestFlight external testing review and manage beta review contact details. Apple requires beta app review before distributing builds to external testers via TestFlight.

Authentication

Set up credentials before any beta review commands:

asc auth login --key-id <id> --issuer-id <id> --private-key-path ~/.asc/AuthKey.p8

CAEOAS — Affordances Guide Next Steps

Every JSON response includes "affordances" with ready-to-run commands:

BetaAppReviewSubmission affordances:

{
  "id": "sub-abc123",
  "buildId": "build-42",
  "state": "WAITING_FOR_REVIEW",
  "affordances": {
    "getSubmission": "asc beta-review submissions get --submission-id sub-abc123",
    "listSubmissions": "asc beta-review submissions list --build-id build-42"
  }
}

BetaAppReviewDetail affordances:

{
  "id": "d-xyz789",
  "appId": "app-1",
  "contactFirstName": "John",
  "contactEmail": "[email protected]",
  "demoAccountRequired": false,
  "affordances": {
    "getDetail": "asc beta-review detail get --app-id app-1",
    "updateDetail": "asc beta-review detail update --detail-id d-xyz789"
  }
}

Nil optional fields (contactFirstName, contactLastName, contactPhone, contactEmail, demoAccountName, demoAccountPassword, notes) are omitted from JSON output.

Commands

submissions list — list beta review submissions for a build

asc beta-review submissions list --build-id <BUILD_ID> [--pretty]

submissions create — submit a build for beta review

asc beta-review submissions create --build-id <BUILD_ID> [--pretty]

Creates a new beta app review submission. The build enters WAITINGFORREVIEW state.

submissions get — get a specific submission

asc beta-review submissions get --submission-id <SUBMISSION_ID> [--pretty]

detail get — get beta review contact details for an app

asc beta-review detail get --app-id <APP_ID> [--pretty]

Returns the beta app review detail record (contact info and demo account) for the app. Each app has one beta review detail record.

detail update — update beta review contact details

asc beta-review detail update --detail-id <DETAIL_ID> \
  [--contact-first-name <name>] \
  [--contact-last-name <name>] \
  [--contact-phone <phone>] \
  [--contact-email <email>] \
  [--demo-account-name <username>] \
  [--demo-account-password <password>] \
  [--demo-account-required] \
  [--notes <text>]

Only supplied flags are sent — unspecified fields are left unchanged.

Beta App Localizations — asc beta-app-localizations

Per-locale Beta App Description, tester feedback email, marketing URL, and privacy policy URL shown to TestFlight testers. Required by Apple before opening external testing — a missing/empty description for the primary locale is the most common reason an external-testing submission is rejected.

Distinct from the existing commands:
- asc beta-review detail → app-level review contact info + demo account
- asc builds update-beta-notes → per-build "What to Test" notes
- asc beta-app-localizations → per-locale beta app description (this section)

# List existing beta localizations for an app
asc beta-app-localizations list --app-id <APP_ID> [--pretty]

# Get a single localization
asc beta-app-localizations get --localization-id <ID>

# Create a new localization (Apple auto-creates one for the primary locale)
asc beta-app-localizations create \
  --app-id <APP_ID> \
  --locale en-US \
  [--description <text>] \
  [--feedback-email <email>] \
  [--marketing-url <url>] \
  [--privacy-policy-url <url>] \
  [--tv-os-privacy-policy <text>]

# Patch — only supplied flags are sent; omitted fields unchanged
asc beta-app-localizations update \
  --localization-id <ID> \
  [--description <text>] \
  [--feedback-email <email>] \
  [--marketing-url <url>] \
  [--privacy-policy-url <url>]

# Delete (e.g. removing a no-longer-supported locale)
asc beta-app-localizations delete --localization-id <ID>

Affordances on each localization: delete, get, listSiblings (asc beta-app-localizations list --app-id <appId>), update.

See docs/features/beta-app-localizations.md for the full reference.

BetaReviewState

State Description
WAITINGFORREVIEW Submitted, waiting for Apple review
IN_REVIEW Currently being reviewed
APPROVED Approved for external testing
REJECTED Rejected — fix issues and resubmit

Semantic booleans: isPending, isInReview, isApproved, isRejected.

Typical Workflow

APP_ID=$(cat .asc/project.json 2>/dev/null | jq -r '.appId // empty')

# 1. Upload a build
asc builds upload --file MyApp.ipa

# 2. Add the build to an external beta group
BUILD_ID=$(asc builds list --app-id "$APP_ID" | jq -r '.data[0].id')
GROUP_ID=$(asc testflight groups list --app-id "$APP_ID" | jq -r '.data[] | select(.isInternalGroup == false) | .id' | head -1)
asc builds add-beta-group --build-id "$BUILD_ID" --beta-group-id "$GROUP_ID"

# 3. Set up beta review contact details (first time)
asc beta-review detail get --app-id "$APP_ID" --pretty
DETAIL_ID=$(asc beta-review detail get --app-id "$APP_ID" | jq -r '.data[0].id')
asc beta-review detail update --detail-id "$DETAIL_ID" \
  --contact-first-name "John" \
  --contact-last-name "Doe" \
  --contact-email "[email protected]" \
  --contact-phone "+1-555-0100"

# 4. Set the Beta App Description for the primary locale (required for external testing)
EXISTING=$(asc beta-app-localizations list --app-id "$APP_ID" | jq -r '.data[] | select(.locale == "en-US") | .id')
if [ -z "$EXISTING" ]; then
  asc beta-app-localizations create --app-id "$APP_ID" --locale en-US \
    --description "Welcome to the beta — please test the new dashboard." \
    --feedback-email [email protected]
else
  asc beta-app-localizations update --localization-id "$EXISTING" \
    --description "Welcome to the beta — please test the new dashboard." \
    --feedback-email [email protected]
fi

# 5. Submit the build for beta app review
asc beta-review submissions create --build-id "$BUILD_ID" --pretty

# 6. Check submission status
asc beta-review submissions list --build-id "$BUILD_ID" --pretty

Key Computed Properties (BetaAppReviewDetail)

Property Logic
hasContact contactEmail != nil && contactPhone != nil
demoAccountConfigured `!demoAccountRequired \ \ (name != nil && password != nil)`

Resolve App ID

See [project-context.md](../shared/project-context.md) — check .asc/project.json before asking the user or running asc apps list.

Output Flags

--pretty          # Pretty-print JSON
--output table    # Table format
--output markdown # Markdown table