expo/expo-skill-eval

Évalue les compétences Expo de bout en bout : précision des déclencheurs, qualité du code généré et captures d'écran d'exécution sur simulateur iOS et émulateur Android via Expo Go (web optionnel). Utilisez-la lorsque vous souhaitez évaluer une compétence Expo, tester qu'une compétence produit du code fonctionnel, comparer une compétence avec des captures d'écran, ou vérifier que la sortie d'une compétence s'affiche correctement.

Qu'est-ce que expo-skill-eval ?

Cette compétence automatisée évalue les compétences Expo du référentiel `plugins/expo/skills/` de manière approfondie. Elle vérifie la précision des déclencheurs (si la compétence est correctement invoquée par des invites réalistes), la qualité du code généré (via `tsc`, lint et `expo export`), et le rendu d'exécution en capturant des captures d'écran sur simulateur iOS et émulateur Android en utilisant Expo Go ou une version de développement. Son objectif principal est de garantir que les compétences Expo produisent un code fonctionnel et correct, tout en fournissant des preuves visuelles de leur comportement d'exécution. Le pipeline se compose de plusieurs étapes : sélection de la compétence et des invites d'évaluation, exécution de sous-processus `claude -p` avec la compétence chargée localement, construction d'une application Expo de base, et exécution sur les plateformes choisies pour capturer des captures d'écran. Les résultats sont compilés dans un visualiseur interactif (fichier `viewer.html`) qui montre le déclenchement de la compétence, la qualité du code et les captures d'écran côte à côte. La compétence prend en charge les invites intégrées (dérivées du fichier SKILL.md de la compétence et de `references/runtime-matrix.md`), les invites textuelles personnalisées, et les captures d'écran cibles téléchargées pour des tests visuels les plus stricts. Les utilisateurs peuvent choisir de vérifier l'exécution avec captures d'écran, la précision des déclencheurs, des contrôles de code sans appareil, ou toute combinaison de ces éléments. Le SDK Expo est automatiquement détecté comme la dernière version stable, mais les utilisateurs peuvent épingler une version plus ancienne si nécessaire. Lancez-la sur macOS avec Xcode et l'émulateur Android, et assurez-vous que les dépendances comme `bun` sont installées.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/.claude/skills/expo-skill-eval

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

Évaluation de compétence Expo

Évalue les compétences dans plugins/expo/skills/ pour la précision des déclencheurs, la qualité du code généré et/ou le rendu d'exécution dans Expo Go.

Configuration requise : macOS avec Xcode (simulateurs iOS), SDK Android avec au moins un AVD, et bun. Aucun autre outil d'appareil n'est supposé.

Racine de l'espace de travail : /private/tmp/expo-skill-eval-<nom-compétence>/iteration-N/ (par exemple /private/tmp/expo-skill-eval-expo-ui/iteration-4/).

Avant de commencer — clarifier le périmètre

Confirmez tous les éléments suivants à l'avance, avant tout travail de pipeline — n'en sautez aucun (ne sautez un élément que si la demande indique déjà ce choix). Regroupez-les en appels AskUserQuestion de ≤4 questions chacun, dans cet ordre :

  1. Quelle compétence évaluer (si ce n'est pas clair d'après la demande).
  2. Invites — quelles invites pilotent l'évaluation. Les invites intégrées (issues des cas d'évaluation de la compétence) sont pré-sélectionnées toutes ; supprimez-en une, ajoutez une invite textuelle personnalisée, ou construisez à partir d'une capture d'écran téléchargée (une interface utilisateur cible que la compétence doit reproduire). Voir Invites ci-dessous.
  3. Que vérifier — une sélection multiple de trois options : Exécution + captures d'écran / Précision des déclencheurs / Vérifications de code (sans appareil). Voir Que vérifier ci-dessous.
  4. SDK Expo — dernière version (par défaut, détection automatique) ou une version épinglée.
  5. Exécuteur — Expo Go (par défaut) ou build de développement.
  6. Plateformes — iOS / Android / web (proposez toujours les trois).
  7. Indicateur d'autorisation pour claude -p — ignorer les autorisations (par défaut) ou accepter les modifications.
  8. Livraison du visualiseur — local uniquement (par défaut) ou publier un Artifact partageable.
  9. Si la précision des déclencheurs est sélectionnée — confirmez que le plugin expo publié est désactivé (ou non installé).

Chacun est détaillé ci-dessous. Les éléments 4 à 6 (SDK, exécuteur, plateformes) tiennent naturellement dans un seul appel AskUserQuestion.

Si la compétence à évaluer n'est pas claire d'après la demande, listez les compétences disponibles dans plugins/expo/skills/ et demandez laquelle évaluer.

Comment la compétence testée est chargée — deux mécanismes, un par phase (ne choisissez pas un mécanisme globalement) : les exécuteurs de référence y accèdent par chemin de fichier (SKILL_PATH = plugins/expo/skills/<compétence>/SKILL.md, lecture explicite), tandis que l'évaluation des déclencheurs la charge comme un plugin (--plugin-dir plugins/expo, pour que le modèle puisse la sélectionner automatiquement à partir de sa description). Les deux pointent vers la version locale, dans le dépôt — c'est ce que vous évaluez. Vous n'avez pas besoin d'un indicateur spécial pour lancer la session du harnais elle-même (le harnais trouve la compétence par le chemin du dépôt) ; les mécanismes s'appliquent aux sous-processus claude -p qu'il génère. Voir les étapes 1 et 3 pour savoir pourquoi chaque phase diffère. Une vérification préalable (obligatoire lorsque l'évaluation des déclencheurs est dans le périmètre) : si le plugin expo publié est installé/activé, désactivez-le (via /plugin) avant de lancer le harnais et réactivez-le après. Une seule désactivation est un changement de configuration globale que cette session et les sous-processus claude -p générés héritent. Pourquoi c'est obligatoire pour l'évaluation des déclencheurs : cette phase charge la compétence locale via --plugin-dir, et un second expo installé entre en collision avec elle — le modèle pourrait déclencher le expo:expo-ui publié, et comme la détection ne voit que le nom de l'appel d'outil, vous noteriez silencieusement la description publiée au lieu de vos modifications locales (la collision pourrait aussi simplement générer une erreur). Les phases d'exécuteur / d'exécution / statique ne sont pas affectées — elles lisent la compétence testée par son SKILL_PATH local sans --plugin-dir — donc une exécution sans évaluation des déclencheurs peut ignorer la désactivation. Désactiver expo ne désactive pas expo-skill-eval (une compétence de projet autonome, ne faisant pas partie du plugin expo), donc le harnais reste disponible.

Présentez cela à l'utilisateur comme une confirmation explicite préalable — de la même manière que vous confirmez quelle compétence évaluer. Lorsque l'évaluation des déclencheurs est dans le périmètre, demandez à l'utilisateur de confirmer que le plugin expo publié est désactivé (ou non installé) avant de commencer l'étape 1 ; s'il est toujours activé, faites une pause et demandez-lui de le désactiver via /plugin. N'exécutez pas l'évaluation des déclencheurs tant qu'il n'a pas confirmé — le harnais ne peut pas détecter de manière fiable les plugins installés par lui-même (la lecture de la configuration globale du plugin ou claude plugin list générerait une invite), c'est donc une confirmation manuelle, pas une vérification automatique.

Choisissez les invites — intégrées, personnalisées ou une capture d'écran cible. Les invites sont les entrées qui pilotent l'exécuteur (avec compétence et sans compétence) ; elles sont distinctes de ce que vous vérifiez. Confirmez-les avec AskUserQuestion (sautez si la demande nomme déjà une invite) :

  • Invites intégrées — des invites représentatives que vous générez en lisant la compétence testée (son SKILL.md + references/) et references/runtime-matrix.md, couvrant les cas d'utilisation standard de la compétence. (Si la compétence fournit déjà des cas d'évaluation sous evals/evals.json, intégrez leurs champs prompt aussi — mais la plupart des compétences ne le font pas, vous les dérivez donc généralement.) Pré-sélectionnez toutes pour que l'exécution par défaut exerce les cas standard de la compétence ; laissez l'utilisateur en désélectionner certaines.
  • Invite textuelle personnalisée — une invite ponctuelle que l'utilisateur saisit. Ne consacrez pas un créneau d'option dédié à cela : AskUserQuestion ajoute automatiquement une entrée « Tapez quelque chose » / Autre, et tout ce qui est tapé devient un cas textuel personnalisé.
  • Construire à partir d'une capture d'écran téléchargée — l'utilisateur donne le chemin d'une capture d'écran cible (une interface utilisateur à reproduire). L'exécuteur doit l'ouvrir — claude -p lit les PNG avec son outil Read — et construire une application qui lui correspond ; le cas enregistre le chemin comme reference_image, et la notation compare l'application générée à cette cible (étape 6). C'est le test visuel le plus fort pour une compétence d'interface utilisateur : « construis ceci. »

Respectez la limite de 4 options par question de AskUserQuestion avec cette priorité (l'erreur à éviter : l'option de téléchargement silencieusement abandonnée une fois les quatre créneaux remplis) :

  1. Réservez toujours un créneau pour « Construire à partir d'une capture d'écran téléchargée. » C'est tout l'intérêt de l'évaluation visuelle et elle ne doit jamais être l'option qui est abandonnée.
  2. N'ajoutez pas d'option explicite « Invite textuelle personnalisée » — l'entrée automatique « Tapez quelque chose » / Autre la couvre déjà.
  3. Remplissez les ≤3 créneaux restants avec les invites intégrées/représentatives, pré-sélectionnées. S'il y en a plus de 3, regroupez-les en une option pré-sélectionnée « Toutes les invites intégrées (par défaut) » et proposez un sous-choix dans un appel court ultérieur, pour que l'option de téléchargement tienne toujours.

Présentez-le comme une sélection multiple. Lorsque « Construire à partir d'une capture d'écran téléchargée » est choisi, demandez le chemin de l'image cible dans un appel ultérieur. Chaque invite sélectionnée (intégrée, tapée ou image) devient un cas d'évaluation (exécuté avec compétence et sans compétence).

Confirmez toujours quoi vérifier sauf si la demande le rend sans ambiguïté. Présentez ces options et laissez l'utilisateur en choisir une ou plusieurs (les valeurs par défaut sont en gras en fonction de l'entrée references/runtime-matrix.md de la compétence) :

OptionCe qu'elle faitQuand la suggérer par défaut
Exécution + captures d'écranPipeline complet : fixture → exécuteur → passerelle statique → exécuter l'application sur iOS/Android et en faire une capture d'écran. L'exécuteur (Expo Go ou build de développement) est une question séparée — ne le nommez pas ici.Par défaut pour toute compétence qui affiche un écran d'application (les lignes expo-go/dev-build dans references/runtime-matrix.md). Nécessite un simulateur/émulateur démarré.
Précision des déclencheursExécutez des invites réalistes via claude -p, vérifiez si la compétence est lue. Mesure le rappel (requêtes qui doivent déclencher uniquement).Toujours utile comme vérification autonome.
Vérifications de code (sans appareil)tsc --noEmit + lint avec conscience des différences + expo export, et le correcteur vérifie le code généré par rapport à toutes les attentes personnalisées que vous fournissez. Pas d'appareil.Par défaut pour les compétences static-only et n/a, et chaque fois que vous voulez vérifier des motifs de code (chemin d'importation correct, un wrapper Host, …) sans exécuter l'application.
Présentez-les comme UNE question à sélection multiple — « Que voulez-vous vérifier ? » Ce sont des dimensions de notation (comment juger ce qui est construit) — distinctes de la phase Invites (quoi construire). L'utilisateur peut choisir n'importe quelle combinaison. Lorsqu'une invite est une capture d'écran téléchargée (voir Invites), incluez « Exécution + captures d'écran » pour que le harnais capture l'application générée et que le correcteur puisse la noter par rapport à la cible.

Lisez references/runtime-matrix.md pour trouver le mode par défaut de la compétence avant de suggérer. Si la demande spécifie déjà un mode (par exemple « vérifie juste si elle déclenche », « exécute-la sur l'appareil »), sautez la question et continuez.

Choisissez la version du SDK Expo — une fois, au début. Détectez la dernière avec bash /abs/path/expo-skill-eval/scripts/latest-sdk.sh (elle affiche la version majeure, par exemple 56 ; en interne, elle utilise bun pour exécuter npm view expo dist-tags --json et lire la majeure via JSON.parse/semver, et elle est couverte par la règle des scripts bash — donc n'exécutez pas la requête de registre en ligne vous-même, ce qui générerait une invite). Confirmez ensuite avec AskUserQuestion : par défaut, ce SDK le plus récent, ou laissez l'utilisateur épingler une version plus ancienne (par exemple pour reproduire un problème spécifique à une version). Utilisez la version choisie partout où la fixture est construite — passez-la comme argument <sdk> à make-fixture.sh et écrivez-la dans le champ runtime.sdk de chaque cas d'évaluation. Si la demande nomme déjà une version (« évaluer sur SDK 54 »), sautez la détection et utilisez-la.

Par défaut, la dernière version — elle reste compatible avec l'Expo Go qu'expo start installe sur l'appareil. Épingler un SDK plus ancien que l'Expo Go installé sur l'appareil fait qu'expo start tente de demander « Installer la version recommandée d'Expo Go ? » ; sans TTY (les scripts de capture lisent stdin depuis /dev/null), il échoue avec Input is required, but 'npx expo' is in non-interactive mode et chaque capture échoue. N'épinglez donc un SDK plus ancien que si vous pré-installez également un Expo Go correspondant sur le simulateur/émulateur — sinon restez avec la dernière version.

Choisissez l'exécuteur — Expo Go (par défaut) ou un build de développement. Demandez avec AskUserQuestion (sautez si la demande indique déjà lequel) :

  • Expo Go (par défaut) — les scripts de capture exécutent l'application avec expo start --ios / expo start --android tel quel. Rapide (pas de compilation native), et il exécute tout ce qu'Expo Go bundle (y compris @expo/ui sur SDK 56+). Impossible d'exécuter du code natif personnalisé (expo-modules, plugins de configuration, dépendances natives non présentes dans Expo Go).
  • Build de développement — les scripts de capture exécutent expo run:ios / expo run:android à la place, compilant un client de développement natif par fixture. Utilisez-le pour les compétences dont la sortie nécessite du code natif personnalisé (les cas qui seraient autrement static-only). Beaucoup plus lent — expo run pré-construit et compile nativement chaque fixture (minutes, surtout la première), et nécessite la chaîne d'outils de compilation iOS/Android complète — donc ne le choisissez que lorsque la compétence nécessite réellement du code natif. Lourd en disque : le build natif de chaque fixture fait plusieurs Go. La phase de capture exécute clean-fixture.sh après chaque fixture pour maintenir l'utilisation de pointe à environ un build, mais préférez quand même moins de cas d'évaluation et une plateforme unique pour les exécutions de build de développement, et gardez quelques Go libres. clean-fixture.sh supprime la sortie du build par fixture (node_modules, ios, android, .expo, dist, et le DerivedData iOS de la fixture) et conserve le code source de l'application + git. Le levier pour le disque de build de développement est moins de cas d'évaluation + une plateforme — il ne récupère que la sortie du build par fixture et ne touche jamais aux caches de dépendances partagés, donc rien n'est téléchargé à nouveau.

Passez le choix aux scripts de capture via la variable d'environnement EXPO_SKILL_EVAL_RUNNER (expo-go par défaut, ou dev-build), et reflétez-le dans le champ runtime.mode de chaque cas d'évaluation (expo-go ou dev-build). Voir l'étape 5.

Choisissez les plateformes — demandez toujours, quelle que soit la compétence. Proposez iOS / Android / web (sélection multiple) avec AskUserQuestion ; par défaut iOS + Android, mais présentez toujours le web comme option — ne filtrez pas par compétence. Le web est un choix valide pour la plupart des compétences : les composants universels d'@expo/ui (Host, Row, Column, Button, List, …) s'affichent sur le web, ainsi que expo-dom, NativeWind/Tailwind, les routes API, et React Native simple. La seule chose qui ne s'affichera pas sur le web est un arbre natif spécifique à une plateforme (@expo/ui/swift-ui ou @expo/ui/jetpack-compose), qui s'affiche vide — et ce vide est lui-même un signal utile, donc c'est toujours le choix de l'utilisateur. Le web s'exécute via snapshot-web.sh (expo start --web + Playwright/Chromium) indépendamment de l'exécuteur (expo run est natif uniquement ; il n'y a pas de build de développement web), et c'est le chemin le moins testé. Écrivez l'ensemble choisi dans le champ runtime.platforms de chaque cas d'évaluation et faites en sorte que run_snapshots.py les parcoure.

Confirmez comment les sous-processus claude -p s'exécutent — une fois, avant de commencer. Demandez avec AskUserQuestion s'ils peuvent s'exécuter avec --dangerously-skip-permissions, puis appliquez la même réponse à chaque sous-processus de cette exécution (ne demandez jamais à nouveau en cours d'exécution) :

  • Ignorer les autorisations (recommandé) — passez --dangerously-skip-permissions. Chaque sous-processus s'exécute sans surveillance dans une fixture jetable sous /private/tmp/expo-skill-eval-* et peut écrire des fichiers et exécuter des commandes de configuration sans invite.
  • Accepter les modifications uniquement — passez --permission-mode acceptEdits à la place. Les Bash/installations sont automatiquement refusées (pas de TTY), donc certaines évaluations peuvent produire une sortie partielle.

Un simple claude -p sans aucun des deux indicateurs ne peut pas du tout écrire de fichiers. Si la demande indique déjà une préférence (« ignorer les autorisations », « n'utilise pas l'indicateur dangereux »), sautez la question.

Confirmez comment livrer le visualiseur de résultats — une fois, au début. Publier sur claude.ai est tourné vers l'extérieur, donc ne le faites jamais en cours d'exécution par surprise ; demandez dans la même AskUserQuestion préalable (en même temps que l'indicateur d'autorisation) :

  • Local uniquement (par défaut) — generate_viewer.py écrit viewer.html et l'ouvre dans le navigateur local. Rien ne quitte la machine.
  • Publier un Artifact partageable — en plus, générez le visualiseur en un Artifact claude.ai (une page web privée par défaut que l'utilisateur peut partager avec ses collègues) à la toute fin. Ne le faites que si l'utilisateur l'accepte ici.

Si la demande indique déjà s'il faut partager/publier, sautez la question. Voir la section Visualiseur pour les mécanismes de publication.

Schéma du cas d'évaluation

Vous générez les cas d'évaluation de l'exécution — un par invite choisie — et les écrivez dans <workspace>/iteration-N/evals.json (le visualiseur les lit à partir de là). Chaque cas e

…[tronqué pour la traduction]

Individual skills in this repo

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

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui

Framework (OSS). Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

Skills associés