agentsclimarketplace

Appstore release

Skill beydemirfurkan/appstore-release/skills/appstore-release

Ship an iOS app (built with EAS/Expo) to App Store review end-to-end via the App Store Connect API — credentials, build attach, metadata, screenshots, pricing, age rating, content rights, review info, subscriptions, and the review submission. Use when the user says "publish/submit my app", "send it to App Review", "ship the iOS app", "fill out App Store Connect", "upload metadata/screenshots", or "automate App Store Connect". Parametric: works for any app given an ASC API key + app id + a config file.From its SKILL.md

Install
npx -y skills add beydemirfurkan/appstore-release --skill appstore-release

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

4 things to look at

  • skips confirmationTells the agent to proceed without asking first, 3 times: "Do not ask the user to re-confirm things that are already in the config or have sensible defaults" and 2 more.
  • reads credentialsReads from 7 credential sources: `ASC_KEY_ID` and 6 more.
  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 7 commands, including `node cli.mjs status` and 6 more.

SKILL.md

5.9 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

App Store Release

Drive an entire iOS App Store submission from the App Store Connect API. Design goal: the user provides credentials + a config.json once, then the agent does everything that is automatable and only interrupts the user for the handful of things Apple genuinely does not expose via API. Do not ask the user to re-confirm things that are already in the config or have sensible defaults.

Operating principle (read this first)

  1. Config-driven, not prompt-driven. All app content lives in config.json. Run commands; don't interview the user.
  2. Only two things are UI-only (Apple has no API): App Privacy data-collection and first-time subscription attach + submit. The tooling detects and surfaces these with exact clicks. Everything else is scripted.
  3. Ask the user only when: config is missing a required field (tell them exactly which), a business decision isn't in config (subscription price, release timing), or before the single irreversible action (final submit). Otherwise proceed.
  4. Idempotent: every command is safe to re-run. node cli.mjs release can be run repeatedly.

Architecture (SOLID, so you can extend it)

scripts/
  cli.mjs                 single entrypoint / dispatcher (node cli.mjs <command>)
  lib/                    injected services, one responsibility each
    env.mjs               parse+validate env (creds, app id)
    jwt.mjs               ES256 token provider
    client.mjs            AscClient — auth + HTTP + uniform errors
    discovery.mjs         locate ASC resources by natural key (no hardcoded ids)
    assets.mjs            reserve→upload→commit binary uploader
    config.mjs            load + validate config, list what's missing
    log.mjs               structured results + machine-readable summary
    context.mjs           composition root (dependency injection)
  commands/               one file per task; uniform contract (see _contract.md)

Add a capability = add a commands/x.mjs (meta + run(ctx)) and register it in cli.mjs.

Setup (one time) — see references/setup.md

  1. ASC API key (App Manager): download AuthKey_XXXX.p8, note Key ID + Issuer ID.
  2. App record exists in ASC (bundle id registered). ASC_APP_ID = numeric id from the app's ASC URL.
  3. EAS project configured, eas login done.
  4. Fill config.json from references/config-template.json. Validate anytime: any command prints exactly which fields are missing.

Environment

export ASC_KEY_ID=... ASC_ISSUER_ID=... ASC_P8_PATH=/abs/AuthKey_XXXX.p8   # gitignore the .p8
export ASC_APP_ID=1234567890
export APPSTORE_CONFIG=/abs/config.json
cd scripts   # then: node cli.mjs <command>

Runbook

1. Orient

node cli.mjs status          # full read-only overview
node cli.mjs check           # readiness + the UI-only steps still pending

2. Build the binary (EAS)

  • If eas build fails with stale credentials ("provisioning profile expired / no certificate with serial…"):
    node cli.mjs credentials     # fresh dist cert + profile → credentials.json
    
    then set "credentialsSource":"local" on the eas.json production profile.
  • Build + submit the binary (export EXPO_ASC_API_KEY_PATH/KEY_ID/ISSUER_ID + EXPO_APPLE_TEAM_ID + EXPO_APPLE_TEAM_TYPE for non-interactive):
    eas build -p ios --profile production --non-interactive --no-wait
    eas submit -p ios --profile production --id <buildId>
    
    Wait until the build is VALID (node cli.mjs status).

3. Fill the entire listing in one shot

node cli.mjs release         # attach build → metadata → pricing → content-rights →
                             # age-rating → category → review-info → screenshots →
                             # subscription → check

release runs the whole pipeline (idempotent) and ends with check, which prints the remaining UI-only steps. Screenshots must exist first (config.screenshots.dir) — see references/screenshots.md to generate them.

4. The two UI-only steps (hand off with exact clicks)

check lists these when they apply:

  1. App Privacy → Data Collection: declare the data types matching the app's privacy manifest, then Publish. ⚠️ If the binary ships NSUserTrackingUsageDescription but you declare no tracking, Publish is blocked → remove the key, rebuild (references/gotchas.md).
  2. First-time subscription: version page → In-App Purchases and Subscriptions → Select → <product> → Save → Add for Review → Submit. (The API can't attach a first subscription.)

5. Submit

node cli.mjs check                 # confirm nothing's missing
node cli.mjs submit --submit       # app-only / updates (no first-time IAP)

For a first-time subscription, the user submits in the UI (step 4.2). Verify with status: version + subscription both WAITING_FOR_REVIEW.

Rejections

On rejection the version becomes editable again (REJECTED/METADATA_REJECTED/DEVELOPER_REJECTED). Read the resolution-center message, fix (metadata via release, or rebuild for binary issues), resubmit.

References

  • references/setup.md — key creation, app record, EAS, secrets hygiene.
  • references/gotchas.md — every real pitfall (read before the first run).
  • references/screenshots.md — generating exact-size PNGs (HTML → headless Chrome).
  • references/config-template.json — per-app config (validated by lib/config.mjs).

What ships with it: 27 files

65.2 KB alongside SKILL.md, 22 of them executable

references/

Gives 0 of the 12 instructions most ship operate skills give in ~1.3k tokens

Counted across 1,077 of the 1,713 authors here whose files we hold, read 2026-09-06

  • Create GitHub releasein 44 of 1077, across 43 files
  • Run the test suitein 30 of 1077, across 25 files
  • Create and push git tagin 27 of 1077, across 26 files
  • Push commits and tagsin 27 of 1077
  • Create annotated tagin 25 of 1077, across 22 files
  • Ensure working tree is cleanin 24 of 1077
  • Check for product marketing context firstin 23 of 1077, across 6 files
  • Commit version bump changesin 22 of 1077, across 21 files
  • Update CHANGELOG.mdin 21 of 1077, across 20 files
  • Structure launch marketing across three channel typesin 20 of 1077, across 5 files
  • Commit and tag the releasein 20 of 1077, across 18 files
  • Update the CHANGELOG for new releasesin 19 of 1077

Said here and by no other author read

  • Run commands instead of interviewing the user
  • Use config.json for all app content
  • Run node cli.mjs release to execute the full pipeline
  • Check remaining UI-only steps using node cli.mjs check
  • Run node cli.mjs credentials if eas build fails
  • Run node cli.mjs status to view full read-only overview

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.