Agent skill

Auto QA Iphone

by imbue-ai in imbue-ai/sculptor

QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.

MITAuto-check passedFrontend & Design

Install Auto QA Iphone

skills CLI
$ npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install imbue-ai/sculptor auto-qa-iphone --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/auto-qa-iphone .claude/skills/auto-qa-iphone && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
auto-qa-iphone
GitHub stars
238
Token cost
~3.1k tokens
SKILL.md length
1,413 words
Files
4 (incl. scripts)
Skills in repo
29
Repo updated
First seen
Licence
MIT

At a glance

QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.

  • Works in 5 steps: Boot the device (idempotent) → Open the app → Drive the UI and narrate (see protocol… → …
  • Visually verifying mobile/responsive changes on an iPhone
  • SKILL.md covers Prerequisites (one-time, slow), Quick start, Available commands and Context management: never Read…, plus 4 more sections
  • Runs Python scripts from its folder; calls python3, just and xcrun

What it does

Auto QA Iphone is an agent skill from imbue-ai/sculptor. QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac. A single CLI boots a notched iPhone, launches the local frontend server (parsing its port — no hardcoding), opens the app in MobileSafari, taps/swipes via idb, and screenshots each step. Includes the Add-to-Home-Screen standalone flow — the only way to verify notch / status-bar / home-indicator safe-area rendering (env(safe-area-inset-) is 0 everywhere except real iOS). Use when visually verifying mobile/responsive changes on an…

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts (for example `scripts/devices.py` and `scripts/iphone_sim.py`).

It sits in Frontend & Design, covering Frontend development. It works with iOS. The repository describes itself as: Build product with grounded, parallel coding agents. The licence is MIT.

When your agent uses it

  • Visually verifying mobile/responsive changes on an iPhone
  • Tasks that involve Frontend development

Example prompts

  • “/auto-qa-iphone”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Boot the device (idempotent)
  2. Open the app
  3. Drive the UI and narrate (see protocol below)
  4. Verify safe areas via Add-to-Home-Screen (the important part)
  5. Clean up

What it can do on your machine

Read from SKILL.md and the folder at commit f847102. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 3 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • just
    • xcrun
    • xcodebuild
    • brew

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Auto QA Iphone loads about 3.1k tokens when it runs. Until then it costs about 135 tokens; SKILL.md has 1,413 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~135
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from imbue-ai/sculptor at commit f847102, republished under its MIT licence (© imbue-ai). 1,413 words, ~3,139 tokens.

Download SKILL.mdSave it as .claude/skills/auto-qa-iphone/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
auto-qa-iphone
description
QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac. A single CLI boots a notched iPhone, launches the local frontend server (parsing its port — no hardcoding), opens the app in MobileSafari, taps/swipes via idb, and screenshots each step. Includes the Add-to-Home-Screen standalone flow — the only way to verify notch / status-bar / home-indicator safe-area rendering (env(safe-area-inset-*) is 0 everywhere except real iOS). Use when visually verifying mobile/responsive changes on an iPhone.
argument-hint
[url-or-port (optional; defaults to launching `just frontend-custom`)]

iPhone Simulator QA (Simulator + idb)

This is the iPhone sibling of /auto-qa-changes. Instead of a headless Chromium at desktop size, it drives a real iOS Simulator so you can see how the mobile web UI actually renders on a notched iPhone — including the standalone PWA chrome (the app sets apple-mobile-web-app-capable, viewport-fit=cover, and a black-translucent status bar in sculptor/frontend/index.html).

Why a real simulator and not Playwright: env(safe-area-inset-*) — the insets the mobile shell uses for the notch/Dynamic Island, status bar, and home indicator — are 0 everywhere except a real iOS surface. Desktop browsers, Playwright, and the /auto-qa-changes Chromium harness all report 0. The only faithful check is Add-to-Home-Screen + a standalone launch on a notched device.

Everything is driven through one CLI:

.claude/skills/auto-qa-iphone/scripts/iphone_sim.py

Stdlib-only Python (no uv/venv needed to run it); it shells out to xcrun simctl, idb, and just.

Prerequisites (one-time, slow)

  • macOS + Xcode with an iOS Simulator runtime. setup checks for one and, if missing, prints the (~9 GB) download command xcodebuild -downloadPlatform iOS — it will not download automatically unless you pass --download-runtime.
  • Homebrew + idb (drives taps/swipes the simulator CLI can't). setup creates an idb venv at ~/.cache/sculptor-iphone-qa/idb-venv and brew install idb-companion for you.
  • A working frontend dev env (just rebuild once if this is a fresh checkout), since the default server command is just frontend-custom.

Quick start

Set a short alias and a screenshots dir (defaults to the workspace attachments/, so images render in chat and survive for MR reuse):

bash
SIM=".claude/skills/auto-qa-iphone/scripts/iphone_sim.py"
Step 1: Boot the device (idempotent)
bash
python3 "$SIM" setup            # default device: iphone-16-pro (notched)
# Other presets: --device iphone-16-pro-max | iphone-se (non-notched control)

This creates/reuses a SculptorQA-<preset> simulator, boots it, connects idb, and prints the UDID. Re-running is safe (it reuses the device). To watch it live: open -a Simulator.

Step 2: Open the app

Have your dev server running first (e.g. just frontend-custom or just start in your own terminal — it works reliably there). Then:

bash
python3 "$SIM" open

How open/serve resolve the URL (no port is ever hardcoded — the dev port is hashed per checkout):

  1. --url URL / --port N — attach to exactly that server.
  2. Otherwise auto-detect: probe listening ports for a running Sculptor SPA and attach to it (a vite dev server is preferred over a packaged/production app build; it warns when it could only find the latter). This is the normal, reliable path.
  3. If nothing is found, fall back to launching --command (default just frontend-custom), parse its port from the log, and verify it actually serves before using it.

The simulator shares the host network, so http://127.0.0.1:<port> is reachable.

Launching from inside a Sculptor agent is flaky. just frontend-custom drives Electron, which (a) races to load its renderer before vite is ready and dies under --unhandled-rejections=strict, (b) refuses a second instance via the .dev_sculptor single-instance lock, and (c) inherits a leaked SCULPTOR_API_PORT from the surrounding session. Prefer keeping your own dev server running and letting open auto-detect it (or pass --port/--url). Use --launch to force the fallback launch anyway.

Every action prints a screenshot: path and an <img> tag — paste the tag into chat to show the user (see "Context management").

Step 3: Drive the UI and narrate (see protocol below)
bash
python3 "$SIM" screenshot --label home          # capture current screen
python3 "$SIM" tap --frac 0.5 0.93              # tap by screen fraction (0..1)
python3 "$SIM" swipe 201 620 201 320            # swipe by points
python3 "$SIM" describe                          # a11y tree of the foreground app
Step 4: Verify safe areas via Add-to-Home-Screen (the important part)

Safari always shows its own chrome, so the standalone status bar and true safe-area insets only appear after adding to the home screen and launching.

First, make sure Safari's bottom toolbar is visible: if the page auto-focused an input, the on-screen keyboard hides the toolbar (and the Share button). Dismiss it by tapping an empty area, then screenshot to confirm the toolbar is back:

bash
python3 "$SIM" tap --frac 0.5 0.42              # tap empty space to blur the input

Then drive the flow (it screenshots after every tap because SpringBoard and the share sheet aren't in the accessibility tree, so they can't be located):

bash
python3 "$SIM" add-to-home-screen               # Share -> swipe -> Add to Home Screen -> Add

Verify each screenshot matches the expected step before trusting the next. Then launch the clip. The icon's position is not fixed, so locate it first and tap its artwork center (the text label sits ~40 pt below the artwork — aim at the glyph, not the label) via a describe-screenshot subagent, then:

bash
python3 "$SIM" screenshot --label home          # capture the home screen
# (locate the Sculptor icon ARTWORK center as a fraction, then:)
python3 "$SIM" launch-icon --frac 0.39 0.26 --settle 6

If the home screen is still showing afterward, the tap missed the artwork — re-locate and tap again.

Step 5: Clean up
bash
python3 "$SIM" teardown        # stops the managed server + shuts the sim down
# python3 "$SIM" teardown --delete   # also delete the simulator device

Available commands

CommandWhat it does
setup [--device P] [--download-runtime]Ensure runtime + idb; create/boot SculptorQA-<P>; connect idb; print UDID.
detectList running Sculptor servers (tagged dev/app) and show which one open would attach to.
serve [--port N | --url U | --command C | --launch]Resolve a server URL: attach to --port/--url, else auto-detect a running one, else launch --command.
open [--port N | --url U | --command C | --launch]Same URL resolution as serve, then simctl openurl → screenshot.
screenshot [--label NAME]Capture the current screen to a numbered PNG.
tap X Y [--frac]idb ui tap. --frac treats X/Y as 0..1 fractions of the screen. Auto-screenshots.
swipe X1 Y1 X2 Y2 [--frac] [--duration S]idb ui swipe. Auto-screenshots.
describeidb ui describe-all — JSON a11y tree (foreground app only).
add-to-home-screenDrive the AHS flow with a screenshot after each tap.
launch-icon [X Y] [--frac]Tap the home-screen clip to launch standalone; screenshot.
remove-home-screenGuidance for removing the clip (iOS caches launch config at add-time).
teardown [--delete]Stop the managed server; shut down (and optionally delete) the device.
statusPrint the device/server/idb state (JSON).

Shared options (after any subcommand): --screenshots-dir PATH, --settle SECONDS. State (UDID, point size, server pid/url, screenshot counter) persists to <screenshots-dir>/.iphone-sim-state.json, so commands chain without re-passing the UDID.

Show full SKILL.md (563 more words)Show less

Context management: never Read screenshots directly

Simulator screenshots are native-scale PNGs (iPhone 16 Pro is 3× → ~1206×2622), each large. Never call the Read tool on a screenshot yourself — a few will blow out your context. Same three rules as /auto-qa-changes:

  1. Display to the user via the <img> tag the CLI prints. This is free for your context — it renders on the user's side; no image data enters yours.

  2. Verify state programmatically when you can. describe (a11y tree), status, and the success/failure of each command tell you a lot without pixel inspection.

  3. When you genuinely need visual inspection (alignment, what text appeared, whether the status bar overlaps content), delegate to a subagent with a narrow question:

    Agent(description="Describe screenshot",
          prompt="Read /abs/path/0007_standalone.png. Focus on the top of the
                  screen: does any header content sit UNDER the status bar / notch,
                  or is there correct safe-area padding above it? 2-3 sentences.")

    The image stays in the subagent's context and is discarded when it returns.

Narrated visual walkthrough protocol

Same as /auto-qa-changes. Every screenshot you take, you MUST:

  1. Display it with the <img> tag (absolute src, descriptive alt).
  2. Describe what you see — inferred from describe/status, or via a describe-screenshot subagent. Do not Read the PNG yourself.
  3. Call out issues — note the safe areas especially: content under the notch, a chat input hidden behind the home indicator, clipped headers.
  4. Announce the next action.

Format each step:

<img src="/abs/path/attachments/iphone-screenshots/0002_open.png" alt="Mobile workspace shell, Safari">

**Step 2: Mobile shell in Safari**
Single-column layout: header, chat stream, floating input, agent pager at the
bottom. Safari's own toolbar is visible (expected — standalone chrome only shows
after Add-to-Home-Screen). No obvious layout issues.

**Next:** add to home screen and launch standalone to check the real status bar.

Driving taps without an accessibility tree

  • Coordinates are points, not pixels. iPhone 16 Pro is 402×874 pt; screenshots come out at 3× (1206×2622 px). idb wants points.
  • Prefer --frac. Spot the target in a screenshot, express it as a fraction of the image (e.g. a button 90% down the screen → --frac 0.5 0.9), and the CLI multiplies by the device's point size. This is robust across devices.
  • WebView elements (inside MobileSafari) appear in describe; SpringBoard, the share sheet, and the home screen do not — drive those by coordinate and verify with the screenshot after every tap.

Gotchas

  • The standalone status bar only appears via the home-screen launch, never in Safari (Safari always shows its own chrome). You MUST go through add-to-home-screen + launch-icon to exercise apple-mobile-web-app-status-bar-style and the real safe-area insets.
  • iOS caches the launch config at add-time. After changing index.html's <head> (meta tags, theme-color, icon), remove and re-add the clip — reloading isn't enough. See remove-home-screen.
  • AHS coordinates are empirical and only ship for iPhone 16 Pro. They can drift across iOS versions; the flow screenshots between steps so you can catch drift and re-derive with tap --frac. For other presets, drive AHS manually.
  • env(safe-area-inset-*) is 0 on non-notched devices — --device iphone-se is a deliberate "insets ≈ 0" control, not a notch test.
  • Hot reload works in Safari, since just frontend-custom runs the vite dev server: edit a .tsx/.scss and re-screenshot to see it. But a standalone (home-screen) clip does not pick up <head> changes without a remove/re-add.
  • The simulator shares the host network, so http://127.0.0.1:<port> works (unlike a physical device). No tunneling needed.
  • The server runs detached (own process group) and survives across turns; teardown stops it. status shows whether it's alive.

Cleanup

teardown stops the managed server and shuts the simulator down (keeping the device for next time; --delete removes it).

NEVER delete screenshot files — they're referenced by <img> tags in the user's chat history and may be attached to MRs. Leave them in the screenshots dir.

© imbue-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (scripts) in .claude/skills/auto-qa-iphone of imbue-ai/sculptor.

  • SKILL.md
  • scripts/.gitignore
  • scripts/devices.py
  • scripts/iphone_sim.py

Open the folder on GitHubat commit f847102

Compare with similar skills

Auto QA Iphone next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Auto QA Iphone compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Auto QA Iphone this skillimbue-ai/sculptor238—~3.1kAutomated safety check: PassMIT
Emilkowal Animationstheexperiencecompany/gaia3081 repos~2kAutomated safety check: PassCustom licence
Asc Shots PipelineCamilleScholtz/swmpc2394 repos~2.8kAutomated safety check: PassEUPL-1.2
AccessibilityGetStream/stream-chat-react-native1.2k—~6.5kAutomated safety check: PassCustom licence
iOS Hig Design Guidedavepoon/buildwithclaude3.6k—~735Automated safety check: PassMIT
Frontend UI StandardsMaxHan7/frontend-ui-standards-skill106—~2.4kAutomated safety check: PassMIT

Similar skills

  • Emilkowal Animations

    theexperiencecompany/gaia

    Emil Kowalski's animation best practices for web interfaces.

    308 GitHub starsUsed in 1 repo~2k tokens
    Frontend & DesignAuto-check passed
  • Asc Shots Pipeline

    CamilleScholtz/swmpc

    Orchestrate iOS screenshot automation with xcodebuild/simctl for build-run, AXe for UI actions, JSON settings and plan files, Koubou-based framing (asc screenshots frame), and screenshot upload (asc…

    239 GitHub starsUsed in 4 repos~2.8k tokens
    Frontend & DesignAuto-check passed
  • Accessibility

    GetStream/stream-chat-react-native

    Maintain VoiceOver/TalkBack-focused accessibility in stream-chat-react-native.

    1.2k GitHub stars~6.5k tokensUpdated today
    Frontend & DesignAuto-check passed
  • iOS Hig Design Guide

    davepoon/buildwithclaude

    Build, update, and apply iOS design specifications using Apple Human Interface Guidelines (HIG) source data.

    3.6k GitHub stars~735 tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Frontend UI Standards

    MaxHan7/frontend-ui-standards-skill

    A skill your agent uses when implementing, refactoring, or reviewing frontend UI across SwiftUI, React, React Native, Flutter, web, or mobile apps.

    106 GitHub stars~2.4k tokensUpdated 3 mo ago
    Frontend & DesignAuto-check passed
  • Maui Accessibility

    davidortinau/maui-skills

    Guide for making .NET MAUI apps accessible — screen reader support via SemanticProperties, heading levels, AutomationProperties visibility control, programmatic focus and announcements, and…

    175 GitHub stars~974 tokensUpdated 3 mo ago
    Frontend & DesignAuto-check passed

More from imbue-ai/sculptor

All 29 skills in this repo
  • Measure React Renders

    imbue-ai/sculptor

    Compare React component render counts between origin/main and the current branch during a user-defined UI scenario (e.g.

    238 GitHub stars~603 tokensUpdated today
    Auto-check passed
  • Post PR To Slack

    imbue-ai/sculptor

    Post a one-line PR announcement to a Slack channel, and mark it :merged: when the PR merges.

    238 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Batch Claude Runner

    imbue-ai/sculptor

    Run Claude programmatically against collections of files in the codebase.

    238 GitHub stars~308 tokensUpdated today
    Auto-check passed
  • Build Sculptor Extension

    imbue-ai/sculptor

    Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI.

    238 GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Code Review Checklist

    imbue-ai/sculptor

    Review a set of code changes against Sculptor's review categories and produce a markdown findings table.

    238 GitHub stars~3.6k tokensUpdated today
    Auto-check passed
  • Cut Release

    imbue-ai/sculptor

    Cut a new Sculptor release candidate from main: run just cut-release (which creates the release/sculptor-vX.Y.0 branch at X.Y.0rc1, pushes the tag that triggers the RC build, and opens a PR bumping…

    238 GitHub stars~1.8k tokensUpdated today
    Auto-check passed

Works with

Questions about Auto QA Iphone

What does Auto QA Iphone do?

QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac. Auto QA Iphone is an agent skill from imbue-ai/sculptor. QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.

When should I use Auto QA Iphone?

Auto QA Iphone fits situations like: visually verifying mobile/responsive changes on an iPhone; tasks that involve Frontend development.

How do I install Auto QA Iphone in Claude Code?

Run `npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a claude-code`. Or copy the skill folder (.claude/skills/auto-qa-iphone in imbue-ai/sculptor) into .claude/skills/auto-qa-iphone in your project. Claude Code loads it when a task matches its description.

How do I install Auto QA Iphone in Codex?

Run `npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a codex`. Or copy the skill folder (.claude/skills/auto-qa-iphone in imbue-ai/sculptor) into .agents/skills/auto-qa-iphone in your project. Codex loads it when a task matches its description.

Can I use Auto QA Iphone in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add imbue-ai/sculptor --skill auto-qa-iphone -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/auto-qa-iphone, .gemini/skills/auto-qa-iphone, .github/skills/auto-qa-iphone and .opencode/skills/auto-qa-iphone in your project.

What does Auto QA Iphone need to run?

Going by SKILL.md and its folder, Auto QA Iphone needs Python for the scripts in its folder and the command-line tools its instructions call (python3, just, xcrun, xcodebuild and brew). Our summary lists: Python 3.

Does Auto QA Iphone access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Auto QA Iphone safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Auto QA Iphone use?

Auto QA Iphone is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Auto QA Iphone use?

About 3.1k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Auto QA Iphone?

Skills that share tags, products or a category with Auto QA Iphone: Emilkowal Animations (theexperiencecompany/gaia, 308 stars), Asc Shots Pipeline (CamilleScholtz/swmpc, 239 stars), Accessibility (GetStream/stream-chat-react-native, 1.2k stars) and iOS Hig Design Guide (davepoon/buildwithclaude, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Auto QA Iphone?

imbue-ai (a GitHub organization) maintains it in imbue-ai/sculptor, which has 238 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 9, 2026.

Source: imbue-ai/sculptor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.