Skip to content
Deployment
Skill

/asc-ad-hoc-distribution

Prepare, publish, resume, and verify private iOS release-testing installs with asc distribute. Use when distributing an IPA to registered devices outside TestFlight, reconciling ad hoc profiles, publishing through caller-owned S3-compatible storage, or diagnosing a resumable

From plugin
rorkai-asc
1k25 skills
Install
$ npx -y skills add rudrankriyam/asc-skills --skill asc-ad-hoc-distribution --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/asc-ad-hoc-distribution

Context preview

The summary Claude sees to decide when to auto-load this skill.

Prepare, publish, resume, and verify private iOS release-testing installs with asc distribute. Use when distributing an IPA to registered devices outside TestFlight, reconciling ad hoc profiles, publishing through caller-owned S3-compatible storage, or diagnosing a resumable

SKILL.md

asc-ad-hoc-distribution.SKILL.md
name: asc-ad-hoc-distribution
description: Prepare, publish, resume, and verify private iOS release-testing installs with asc distribute. Use when distributing an IPA to registered devices outside TestFlight, reconciling ad hoc profiles, publishing through caller-owned S3-compatible storage, or diagnosing a resumable private distribution run.

ASC ad hoc distribution

Use the experimental `asc distribute` workflow to turn an existing iOS archive into a private, verified install link for registered devices. Use TestFlight or the App Store release skills instead when the build should go through Apple-hosted distribution.

Confirm the installed contract before acting:

asc distribute --help
asc distribute plan --help
asc distribute apply --help
asc distribute resume --help
asc distribute status --help
asc distribute verify --help

Choose the workflow

  • Use `plan` -> `apply` -> `resume`/`status` -> `verify` for an end-to-end,

hash-authorized run starting from an `.xcarchive`.

  • Use `inspect` -> `prepare` -> `publish` only when the caller already owns the

ad hoc IPA and wants to operate the lower-level boundaries separately.

Guardrails

  • Treat the distribution spec, devices file, PKCS#12 identity, password file,

run state, and exact install-link artifact as private. Keep them out of Git and require owner-only permissions.

  • Never put S3 credentials or presigned URLs in the distribution spec, command

output, logs, issues, or chat. Use `ASC_S3_ACCESS_KEY_ID`, `ASC_S3_SECRET_ACCESS_KEY`, and optional `ASC_S3_SESSION_TOKEN`, or the standard AWS SDK credential chain.

  • `plan` is read-only and may exit successfully with `ready: false`. Inspect the

typed blockers and effects before continuing.

  • `apply` can register missing devices, create safe App IDs and successor ad hoc

profiles, write local artifacts, and publish immutable objects. Run it only after the user authorizes the exact plan hash and effect inventory.

  • The orchestrated workflow supports private access to an existing

S3-compatible bucket. It does not create buckets, change policies, delete old builds, install the app, or launch it.

  • Input drift, an immutable-object conflict, expired signing material, or an

expired private link requires a new plan. Do not force the old run forward.

Preconditions

  • An existing iOS `.xcarchive` with one main app target. Embedded apps,

extensions, Watch apps, and App Clips make the v1 plan not ready.

  • A local iOS distribution PKCS#12 identity and optional protected password file.
  • A protected strict-v1 devices file. For example:
{"schemaVersion":1,"devices":[{"name":"Test iPhone","udid":"DEVICE_UDID","platform":"IOS"}]}
  • App Store Connect authentication with access to devices, Bundle IDs,

certificates, and profiles.

  • An existing S3-compatible bucket and valid credentials.

1. Create the private distribution spec

Relative paths resolve from the spec directory. The spec does not interpolate environment variables or accept credentials. A representative private config is:

{
  "schemaVersion": 1,
  "devicesFile": "devices.json",
  "signing": {
    "identity": {
      "format": "pkcs12",
      "path": "../signing/distribution.p12",
      "passwordFile": "../secrets/distribution-p12-password"
    },
    "minimumValidityDays": 7,
    "maxMutations": 32
  },
  "publication": {
    "endpoint": "https://objects.example.com",
    "downloadEndpoint": "https://downloads.example.com",
    "region": "auto",
    "bucket": "ios-builds",
    "prefix": "team/app",
    "addressingStyle": "path",
    "urlTtl": "24h",
    "downloadGrace": "1h",
    "verifyTimeout": "30s"
  },
  "metadata": {
    "title": "App",
    "channel": "pull-request-42",
    "sourceRevision": "abc123",
    "sourceUrl": "https://example.com/team/app/commit/abc123"
  }
}

`passwordFile`, `certificateSha256`, `downloadEndpoint`, and every metadata field are optional. An omitted password file means the PKCS#12 must use an empty password. Protect the config and secret inputs before planning:

chmod 600 ".asc/distribution/config.json" ".asc/distribution/devices.json"
chmod 600 ".asc/signing/distribution.p12" ".asc/secrets/distribution-p12-password"

2. Plan without mutation

asc distribute plan \
  --archive-path ".asc/artifacts/App.xcarchive" \
  --config ".asc/distribution/config.json" \
  --plan ".asc/distribution/plan.json" \
  --state-dir ".asc/distribution/runs" \
  --output json

Inspect `ready`, `planHash`, signing validity, destination, and the complete ordered `effects` inventory. Resolve blockers and create a new plan when `ready` is false. Do not infer readiness from exit code alone.

3. Apply the exact authorized plan

After approval of the exact effects, pass the full 64-character hash:

PLAN_HASH="$(jq -er '.planHash' ".asc/distribution/plan.json")"
asc distribute apply \
  --plan ".asc/distribution/plan.json" \
  --confirm "$PLAN_HASH" \
  --output json

Missing, malformed, or unequal confirmation is rejected before side effects. Success means publication and live fetch verification completed; it does not mean a device installed or launched the app.

4. Inspect, resume, and verify

Use the returned `runId`:

asc distribute status --run "RUN_ID" --state-dir ".asc/distribution/runs" --output json
asc distribute resume --run "RUN_ID" --state-dir ".asc/distribution/runs" --output json
asc distribute verify --run "RUN_ID" --state-dir ".asc/distribution/runs" --timeout 30s --output json

`status` is local-only and succeeds for `running`, `recoverable`, and `blocked` runs; branch on typed fields rather than prose. `resume` revalidates durable evidence before retrying and never blindly repeats a remote write. `verify` is read-only but performs live fetches. Add `--device "DEVICE_SELECTOR"` only when the user asks to observe the matching installed bundle, version, and build on a connected device; th

Read more
Ships withrorkai-asc

A collection of Agent Skills for shipping with the asc cli (asc). These skills help agents run builds, TestFlight, metadata, submissions, signing, and Apple Ads workflows. This is a community-maintained, unofficial skill pack and is not affiliated with Apple.

Get the whole plugin
Stats
1,026
Stars
62
Forks
Active
Maintenance
Python
Language
MIT
License
6h ago
Last commit
7mo ago
Created

Repo: rudrankriyam/asc-skills

Other skills on rorkai-asc.