iOS E2E

Compilation, exécution et test d'applications iOS sur simulateur, avec Gateway isolé, capture d'écran, logs, crashs, et preuve de bout en bout.

Qu'est-ce que iOS E2E ?

Cette compétence permet de développer et tester des applications iOS sur simulateur de manière isolée et reproductible. Elle s'appuie sur les outils `mobilebuildmcp` et `simctl` pour construire, installer, lancer l'application, et interagir avec son interface utilisateur via des commandes de tap, saisie de texte, swipe, etc. Elle inclut également la capture d'écran, la récupération des logs et des rapports de crash, et l'exécution de tests unitaires ciblés. Pour les validations de bout en bout, elle met en place un Gateway local dédié (profil `ios-sim`) qui n'interfère pas avec l'environnement de production, et permet de comparer le comportement entre la branche de modification et `main`. La compétence prend en charge Xcode, xcodegen, SwiftFormat, SwiftLint, MobileBuildMCP, et le Gateway OpenClaw. Elle est conçue pour les projets iOS utilisant un espace de travail avec `mobilebuildmcp` et un fichier de configuration `.mobilebuildmcp/config.yaml`. Les cas d'usage typiques incluent le développement itératif, les tests de régression, et les preuves fonctionnelles avant merge.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait iOS E2E ?

Travaillez depuis la racine du checkout. Un fichier .mobilebuildmcp/config.yaml local (Configuration) fournit le projet, le scheme et DerivedData, donc les commandes mobilebuildmcp n'ont pas besoin d'indicateurs de projet.

Deux valeurs reviennent :

  • $sim : l'UDID du simulateur (pnpm ios:sim:pair en affiche un). Passez --simulator-id "$sim" à chaque appel mobilebuildmcp ; sans cela, la configuration par défaut cible le simulateur nommé iPhone 17.
  • $bundle : l'ID du bundle, qui dépend de l'équipe de signature. Lisez-le depuis la build : bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).

Construction et exécution

  1. Construction : mobilebuildmcp simulator build. Après avoir modifié apps/ios/project.yml, exécutez d'abord pnpm ios:gen.

  2. Installation et lancement avec simctl, qui prend des arguments de lancement (pnpm ios:run n'en prend pas) :

    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 et launch-app attachent une capture de log qui ne se termine jamais.

  3. Déboguer les arguments de lancement : grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u. --openclaw-screenshot-mode associé à un indicateur --openclaw-*-fixture affiche un écran de fixture sans Gateway ; -AppleLanguages "(de)" -AppleLocale de_DE exécute dans une autre langue. Le schéma d'URL de débogage est openclaw-debug://.

Piloter l'interface utilisateur

  1. mobilebuildmcp ui-automation snapshot-ui --style minimal liste les cibles tactiles sous la forme ref|action|role|label|value|id. Le texte qui n'est pas un contrôle (bulles de chat, titres de lignes) apparaît uniquement avec --output json.
  2. Agissez sur une ref avec tap, type-text, long-press (--duration est en millisecondes), swipe ou gesture. Attendez avec wait-for-ui : --predicate exists --label '…' --role button pour un élément, --predicate textContains --text '…' pour du texte. Un sélecteur d'attente qui correspond à plusieurs éléments échoue ; ajoutez --role ou --identifier. Gardez --timeout-ms sous 30000 : le démon termine toute requête après 30 s avec DAEMON_TRANSPORT_FAILED ; répétez l'attente pour plus long.
  3. Les refs appartiennent à un instantané ; prenez-en un nouveau après chaque changement d'écran.
  4. Voir l'écran : mobilebuildmcp simulator screenshot, puis lisez le JPEG imprimé.

Pièges :

  • L'onboarding et les feuilles listent également les écrans derrière eux ; faites correspondre par label ou id et prenez la dernière correspondance.
  • Sur iPhone, la barre latérale recouvre le contenu : tapez sur RootTabs.Sidebar.Show avant ses lignes.
  • xcrun simctl openurl met en file d'attente une alerte système « Ouvrir dans OpenClaw ? » par appel ; tapez sur Open ou Cancel pour chacune.
  • L'interface système en dehors du processus de l'application (sélecteur de photos, feuille de partage) est absente des instantanés. Tapez dessus par coordonnées avec le binaire AXe fourni dans MobileBuildMCP : "$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Les coordonnées sont en points : pixels de la capture d'écran × largeur de l'écran en points ÷ largeur de la capture d'écran.

Logs et crashs

Agissez d'abord, puis lisez une fenêtre limitée :

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

Les crashs atterrissent dans ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips ; la première frame OpenClaw du thread triggered nomme le coupable. Les préférences et bases de données de l'application se trouvent dans le conteneur de l'application (xcrun simctl get_app_container "$sim" "$bundle" data) ; simctl spawn … defaults read ne peut pas les voir. LLDB et xctrace : DEBUG.md.

Tests

  1. Exécutez les suites touchées : pnpm ios:test <Suite> (sélecteurs et IOS_SIM : apps/ios/README.md).
  2. Prouvez qu'un test de régression échoue sur la base : commitez la modification, extrayez la version de base des fichiers source modifiés (git checkout <base> -- <paths>), exécutez la suite, puis git checkout HEAD -- <paths>.

Fait : les suites touchées passent, et chaque nouveau test de régression échoue sur la base.

Prouver une modification de bout en bout

  1. Démarrez le Gateway isolé (profil unique dans Configuration) en tant que service longue durée : node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Il ne touche jamais au Gateway de l'opérateur ni à ~/.openclaw. Pendant son exécution, appelez la CLI avec node openclaw.mjs --profile ios-sim … ; run-node refuse de reconstruire sous un Gateway en cours d'exécution.
  2. Appairez un nouveau simulateur via l'interface d'onboarding réelle : sim=$(pnpm --silent ios:sim:pair | tail -1) (--app pour une autre build, --profile pour un autre profil).
  3. Exercez la modification via les contrôles visibles. Un aller-retour de chat : tapez dans chat-message-input, tapez sur chat-send-message, puis attendez un mot que seule la réponse contient.
  4. Comparez les builds : les mêmes étapes sur main et sur la modification, chacune sur son propre simulateur frais, avec des captures d'écran correspondantes.
  5. Arrêtez le Gateway et supprimez les simulateurs.

Commandes Node, permissions, échecs d'authentification, pannes, envois rejetés, mises à niveau et disposition iPad : PROOF.md, qui liste également ce que seul un appareil peut prouver.

Fait : des captures d'écran ou une sortie enregistrée montrent le comportement sur la modification et son absence sur main ; le port du Gateway est fermé et aucun simulateur openclaw-pair-* ne subsiste.

Configuration

Une fois par machine ; chaque étape se termine par une vérification.

  1. Xcode, runtimes de simulateur, xcodegen et la chaîne d'outils Watch Rust : prérequis de apps/ios/README.md. Vérifiez : xcrun simctl list devices available affiche iPhone 17.

  2. SwiftFormat et SwiftLint à la version du dépôt : scripts/install-swift-tools.sh <dir on PATH>. Vérifiez : scripts/check-swift-tools.sh se termine avec le code 0.

  3. MobileBuildMCP, CLI Sentry XcodeBuildMCP : brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Ces étapes ont été écrites pour la version 2.7.1. Vérifiez : mobilebuildmcp --version.

  4. Checkout : pnpm install --frozen-lockfile, puis pnpm ios:gen (le projet Xcode est généré, pas commité). Créez ensuite .mobilebuildmcp/config.yaml et ajoutez /.mobilebuildmcp/ à .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 # partagé avec pnpm ios:run
    

    Vérifiez : mobilebuildmcp simulator list-schemes liste OpenClaw, et mobilebuildmcp simulator build réussit.

  5. Le profil Gateway ios-sim, avec le Gateway arrêté (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)". Les réponses de chat nécessitent un modèle pour son agent main : oc models auth login ou add avec des identifiants de test. Vérifiez : le Gateway démarre, et pnpm ios:sim:pair se termine sur l'écran 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.

Skills associés