iOS E2E

Constrói, executa e testa o aplicativo iOS no simulador, emparelhando com um Gateway isolado, acionando a interface do usuário, capturando telas e logs, e provando alterações de ponta a ponta.

O que é iOS E2E?

Este skill permite que um agente de IA (como Claude Code, Cursor ou Codex) realize testes completos de ponta a ponta do aplicativo iOS OpenClaw diretamente no simulador. Ele gerencia todo o ciclo de vida do teste: construção com `mobilebuildmcp`, instalação e inicialização via `simctl`, automação da interface do usuário (toques, digitação, gestos), captura de screenshots e análise de logs e crashes. A configuração é centralizada em um arquivo YAML local, eliminando a necessidade de flags repetitivas de projeto. O fluxo principal inclui: parear um simulador limpo com um Gateway isolado (para não interferir com o ambiente de produção), executar a alteração no código, verificar o comportamento visual, e comparar com a versão base (`main`) usando screenshots pareadas. O skill também suporta execução de testes unitários e provas de regressão, garantindo que cada nova falha de teste esteja vermelha na base e verde na alteração. Ele é compatível com ferramentas de automação que implementam o protocolo MCP (Model Context Protocol) e foi projetado para ambientes macOS com Xcode, `mobilebuildmcp` e os pré-requisitos descritos no SKILL.md. A documentação inclui seções de setup detalhado, dicas de automação (como lidar com onboarding, sidebar, e interface do sistema fora do processo) e links para guias avançados de depuração.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/ios-e2e

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que iOS E2E faz?

Trabalhe a partir da raiz do checkout. Um arquivo local .mobilebuildmcp/config.yaml (Setup) fornece o projeto, scheme e DerivedData, portanto comandos mobilebuildmcp não precisam de flags de projeto.

Dois valores são recorrentes:

  • $sim: o UDID do simulador (pnpm ios:sim:pair exibe um). Passe --simulator-id "$sim" para cada chamada mobilebuildmcp; sem ele, o padrão da config mira o simulador chamado iPhone 17.
  • $bundle: o bundle ID, que depende do time de signing. Leia-o do build: bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).

Construir e executar

  1. Construir: mobilebuildmcp simulator build. Após editar apps/ios/project.yml, execute pnpm ios:gen primeiro.

  2. Instalar e iniciar com simctl, que aceita argumentos de inicialização (pnpm ios:run não aceita nenhum):

    xcrun simctl install "$sim" apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app
    xcrun simctl launch --terminate-running-process "$sim" "$bundle" --openclaw-reset-onboarding
    

    mobilebuildmcp simulator build-and-run e launch-app anexam uma captura de log que nunca termina.

  3. Depurar argumentos de inicialização: grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u. --openclaw-screenshot-mode junto com uma flag --openclaw-*-fixture mostra uma tela de fixture sem um Gateway; -AppleLanguages "(de)" -AppleLocale de_DE executa em outro idioma. O esquema de URL de depuração é openclaw-debug://.

Acionar a interface do usuário

  1. mobilebuildmcp ui-automation snapshot-ui --style minimal lista alvos tocáveis como ref|action|role|label|value|id. Texto que não é um controle (bolhas de chat, títulos de linha) aparece apenas com --output json.
  2. Aja em um ref com tap, type-text, long-press (--duration em milissegundos), swipe ou gesture. Aguarde com wait-for-ui: --predicate exists --label '…' --role button para um elemento, --predicate textContains --text '…' para texto. Um seletor de espera que corresponde a vários elementos falha; adicione --role ou --identifier. Mantenha --timeout-ms abaixo de 30000: o daemon encerra qualquer requisição após 30 s com DAEMON_TRANSPORT_FAILED; repita a espera para durações maiores.
  3. Refs pertencem a um snapshot; tire um novo após cada mudança de tela.
  4. Veja a tela: mobilebuildmcp simulator screenshot, depois leia o JPEG impresso.

Pegadinhas:

  • Onboarding e sheets também listam as telas atrás deles; combine pelo label ou id e pegue a última correspondência.
  • No iPhone, a sidebar sobrepõe o conteúdo: toque em RootTabs.Sidebar.Show antes de suas linhas.
  • xcrun simctl openurl enfileira um alerta do sistema "Abrir no OpenClaw?" por chamada; toque em Open ou Cancel para cada um.
  • A interface do sistema fora do processo do aplicativo (seletor de fotos, share sheet) está ausente dos snapshots. Toque nela por coordenadas com o binário AXe empacotado no MobileBuildMCP: "$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Coordenadas são pontos: pixels da screenshot x largura da tela em pontos ÷ largura da screenshot.

Logs e crashes

Aja primeiro, depois leia uma janela limitada:

xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'

Crashes vão para ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips; o primeiro frame OpenClaw da thread triggered nomeia o culpado. Preferências do app e bancos de dados ficam no contêiner do aplicativo (xcrun simctl get_app_container "$sim" "$bundle" data); simctl spawn … defaults read não consegue vê-los. LLDB e xctrace: DEBUG.md.

Testes

  1. Execute os suites tocados: pnpm ios:test <Suite> (seletores e IOS_SIM: apps/ios/README.md).
  2. Prove que um teste de regressão fica vermelho na base: faça commit da alteração, checkout da versão base dos arquivos fonte alterados (git checkout <base> -- <paths>), execute o suite, depois git checkout HEAD -- <paths>.

Feito: os suites tocados passam, e cada novo teste de regressão falha na base.

Provar uma alteração de ponta a ponta

  1. Inicie o Gateway isolado (perfil único em Setup) como um serviço de longa duração: node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Ele nunca toca o Gateway do operador ou ~/.openclaw. Enquanto ele estiver em execução, chame a CLI como node openclaw.mjs --profile ios-sim …; run-node se recusa a reconstruir sob um Gateway em execução.
  2. Emparelhe um simulador novo através da interface de onboarding real: sim=$(pnpm --silent ios:sim:pair | tail -1) (--app para outro build, --profile para outro perfil).
  3. Exercite a alteração através de controles visíveis. Um round trip de chat: digite em chat-message-input, toque em chat-send-message, depois aguarde uma palavra que apenas a resposta contém.
  4. Compare builds: os mesmos passos em main e na alteração, cada um em seu próprio simulador novo, com screenshots correspondentes.
  5. Pare o Gateway e delete os simuladores.

Comandos Node, permissões, falhas de autenticação, indisponibilidades, envios rejeitados, upgrades e layout do iPad: PROOF.md, que também lista o que apenas um dispositivo prova.

Feito: screenshots ou saída gravada mostram o comportamento na alteração e sua ausência em main; a porta do Gateway está fechada e nenhum simulador openclaw-pair-* permanece.

Setup

Uma vez por máquina; cada passo termina com uma verificação.

  1. Xcode, runtimes de simulador, xcodegen e a toolchain Rust para Watch: pré-requisitos de apps/ios/README.md. Verifique: xcrun simctl list devices available mostra iPhone 17.

  2. SwiftFormat e SwiftLint no pin do repositório: scripts/install-swift-tools.sh <dir on PATH>. Verifique: scripts/check-swift-tools.sh sai com 0.

  3. MobileBuildMCP, CLI Sentry's XcodeBuildMCP: brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Estes passos foram escritos contra a versão 2.7.1. Verifique: mobilebuildmcp --version.

  4. Checkout: pnpm install --frozen-lockfile, depois pnpm ios:gen (o projeto Xcode é gerado, não versionado). Em seguida, crie .mobilebuildmcp/config.yaml e adicione /.mobilebuildmcp/ ao .git/info/exclude:

    schemaVersion: 1
    enabledWorkflows: [simulator, simulator-management, ui-automation, debugging]
    sentryDisabled: true
    sessionDefaults:
      projectPath: ./apps/ios/OpenClaw.xcodeproj
      scheme: OpenClaw
      configuration: Debug
      platform: iOS
      simulatorName: iPhone 17
      derivedDataPath: ./apps/ios/build/DerivedData # compartilhado com pnpm ios:run
    

    Verifique: mobilebuildmcp simulator list-schemes lista OpenClaw, e mobilebuildmcp simulator build é bem-sucedido.

  5. O perfil de Gateway ios-sim, com o Gateway parado (oc = node openclaw.mjs --profile ios-sim): oc config set gateway.mode local, oc config set gateway.port 19031, oc config set gateway.auth.mode token, oc config set gateway.auth.token "$(openssl rand -hex 24)". Respostas de chat precisam de um modelo para seu agente main: oc models auth login ou add com credenciais de teste. Verifique: o Gateway inicia, e pnpm ios:sim:pair termina na tela de chat.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills and agent Templates when requested; add Templates; install, verify, update, uninstall, publish, or sync skills.

Habilidades Relacionadas