auditing-appstore-readiness
Audit an iOS app repo (Swift/Xcode or React Native/Expo) for App Store compliance and release readiness; output a pass/warn/fail report and publish checklist.
What this skill does
# App Store Readiness Audit
This skill reviews an app repository and produces a release readiness report for iOS **App Store** / **TestFlight** submission.
It supports:
- Native iOS (Swift/Obj‑C, Xcode project/workspace)
- React Native (bare)
- Expo (managed or prebuild)
## Quick start (recommended)
Run the read‑only audit script from the repo root:
{ "tool": "exec", "command": "node {baseDir}/scripts/audit.mjs --repo . --format md" }
If you want JSON output as well:
{ "tool": "exec", "command": "node {baseDir}/scripts/audit.mjs --repo . --format md --json audit.json" }
If the repo is a monorepo, point at the app directory:
{ "tool": "exec", "command": "node {baseDir}/scripts/audit.mjs --repo apps/mobile --format md" }
## Output contract
Always return:
- Overall verdict: **PASS** / **WARN** / **FAIL**
- Detected project flavour and key identifiers (bundle id, version, build)
- A list of checks with evidence and remediation steps
- A **Publish checklist** the developer can tick off
Use: [references/report-template.md](references/report-template.md)
## Safety rules (don’t break the repo)
Default to **read‑only** commands. Do not run commands that modify the workspace unless:
- the user explicitly asks, **or**
- the fix is trivial and clearly desired (then explain what will change first)
Examples of mutating commands:
- dependency installs (`npm i`, `yarn`, `pnpm i`, `pod install`)
- config generation (`expo prebuild`)
- signing automation (`fastlane match`)
- archiving (`xcodebuild archive`, `eas build`) — creates artefacts and may require signing
If you must run a mutating command, label it clearly as **MUTATING** before running.
## Main workflow
### 1) Identify the repo and project flavour
Prefer scripted detection (`audit.mjs`). If doing manually:
- Expo likely: `package.json` contains `expo` and `app.json` / `app.config.*` exists
- React Native (bare): `package.json` contains `react-native` and `ios/` exists
- Native iOS: `*.xcodeproj` or `*.xcworkspace` exists
If multiple apps exist, pick the one matching the user’s intent; otherwise pick the directory with:
- a single `ios/<AppName>/Info.plist`, and
- exactly one `.xcodeproj` or `.xcworkspace` near the root.
### 2) Run static compliance checks (works everywhere)
Run these checks even without Xcode:
- Repo hygiene: clean git status; obvious secrets not committed
- iOS identifiers: bundle id, version, build number
- App icons: includes an App Store (1024×1024) icon
- Launch screen present
- Privacy & permissions:
- Privacy manifest present (`PrivacyInfo.xcprivacy`) or explicitly accounted for
- Permission usage strings present when relevant (camera, location, tracking, etc.)
- Avoid broad ATS exemptions (`NSAllowsArbitraryLoads`)
- Third‑party SDK hygiene: licences, privacy manifests, tracking disclosures
- Store listing basics: privacy policy URL exists somewhere in repo/docs; support/contact info
The script outputs PASS/WARN/FAIL for these.
### 3) Run build‑accuracy checks (macOS + Xcode, optional but high confidence)
Only if you have **Xcode** available (local macOS gateway or a paired macOS node).
Recommended sequence (creates build artefacts):
1) Show Xcode + SDK versions:
{ "tool": "exec", "command": "xcodebuild -version" }
2) List schemes (project/workspace as detected):
{ "tool": "exec", "command": "xcodebuild -list -json -workspace <path>.xcworkspace" }
or
{ "tool": "exec", "command": "xcodebuild -list -json -project <path>.xcodeproj" }
3) Release build for simulator (fast, avoids signing):
{ "tool": "exec", "command": "xcodebuild -workspace <...> -scheme <...> -configuration Release -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15' build" }
4) If you need a distribution artefact (**MUTATING / signing**):
- Prefer Fastlane if already configured
- Otherwise `xcodebuild archive` + `xcodebuild -exportArchive`
If build checks aren’t possible, the report must explicitly say so and keep the verdict at **WARN** (unless there are definite FAIL items).
### 4) Produce the final readiness report
- Use [references/report-template.md](references/report-template.md)
- Include a “Go / No‑Go” recommendation:
- **FAIL** → must fix before submitting
- **WARN** → submission may work, but risk areas remain
- **PASS** → ready to submit; remaining items are administrative
## Manual checks the agent cannot fully verify
Always include these as a final checklist section (even if automated checks pass):
- App Store Connect metadata: screenshots, description, keywords, age rating, pricing, categories
- Privacy Nutrition Labels match actual behaviour
- Export compliance (encryption) answers are correct
- Content/IP rights: licences, third‑party assets, trademarks
- Account / regional requirements (e.g. EU trader status if applicable)
- In‑app purchases / subscriptions configured if used
See: [references/manual-checklist.md](references/manual-checklist.md)
## When the user asks “make it compliant”
Switch to fix mode:
1) Identify failing items that can be fixed safely in‑repo (Info.plist strings, `PrivacyInfo.xcprivacy` template, ATS exceptions tightening, etc.)
2) Propose minimal patches and apply with `apply_patch`
3) Re‑run `audit.mjs` and update the report
## Quick search
- Permissions mapping: [references/permissions-map.md](references/permissions-map.md)
- Expo‑specific checks: [references/expo.md](references/expo.md)
- React Native iOS checks: [references/react-native.md](references/react-native.md)
- Native iOS checks: [references/native-ios.md](references/native-ios.md)
Related in Web Dev
generating-lwc-components
IncludedLightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use generating-apex), Aura components, or Visualforce.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Set up queries with useQuery, mutations with useMutation, configure QueryClient caching strategies, implement optimistic updates, and handle infinite scroll with useInfiniteQuery. Use when: setting up data fetching in React projects, migrating from v4 to v5, or fixing object syntax required errors, query callbacks removed issues, cacheTime renamed to gcTime, isPending vs isLoading confusion, keepPreviousData removed problems.
document-processor-api
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
nutrient-document-processing
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Covers useMutationState, simplified optimistic updates, throwOnError, network mode (offline/PWA), and infiniteQueryOptions. Use when setting up data fetching, fixing v4→v5 migration errors (object syntax, gcTime, isPending, keepPreviousData), or debugging SSR/hydration issues with streaming server components.
accelint-nextjs-best-practices
IncludedNext.js performance optimization and best practices. Use when writing Next.js code (App Router or Pages Router); implementing Server Components, Server Actions, or API routes; optimizing RSC serialization, data fetching, or server-side rendering; reviewing Next.js code for performance issues; fixing authentication in Server Actions; or implementing Suspense boundaries, parallel data fetching, or request deduplication.