mcpField
E
eas-simulator

eas-simulator

github.com/expoテスト・品質3.5k21.2k 回インストール今日更新
リポジトリ

eas-simulator について

eas-simulatorは、EAS上のリモートiOSシミュレーターやAndroidエミュレーターを起動・操作するためのエージェントスキルです。ローカルでシミュレーターを実行できないクラウドやLinux環境での利用を想定し、アクセス確認やセッション終了も案内します。

主な機能

  1. 01リモートiOS・Androidセッション
  2. 02開始前の利用可否確認
  3. 03agent-deviceによる端末操作
  4. 04ブラウザプレビューの共有
  5. 05セッション時間と終了の案内

活用シーン

  1. 01Linuxホストでのアプリテスト
  2. 02クラウドエージェントによる変更確認
  3. 03シミュレーターのライブプレビュー共有

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/expo/skills --skill eas-simulator

インストール後、Claude Code で/eas-simulatorを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
references/
controllers.md
logs-and-crashes.md
run-your-app.md
troubleshooting.md

詳細

EAS Simulator

EAS サービス — 費用が発生します。 セッションはアカウントの料金と利用上限にカウントされ、最大利用時間に達すると停止します。作業が完了したら、eas simulator:stop でセッションを停止してください。現在の条件については https://expo.dev/pricing をご覧ください。

EAS Simulator は、EAS インフラストラクチャ上でリモートの iOS シミュレーターまたは Android エミュレーターを起動し、お使いのマシンから操作できるサービスです。CLI、AI エージェント(agent-device 経由)、ブラウザーのプレビューから操作できます。シミュレーターをローカルで実行できない環境(Linux マシン、Cursor Cloud などのクラウド/バックグラウンドエージェント)での利用や、コードについて推論するだけでなく、実際のデバイスで変更をエージェントに検証させる場合に役立ちます。

simulator:* コマンドは実験的で非表示であり、最近の eas-cli(執筆時点では ≥ 20.3.0)が必要です。そのため、このスキルではすべての操作に npx --yes eas-cli@latest を使用します。フラグやサブコマンドは変更される場合があります。各サブコマンドの --help 出力が正式な情報源です。

使用するタイミング

フロントマターの description に、使用するきっかけとなるフレーズが記載されています。要するに、ユーザーのアプリをクラウドシミュレーターで起動して操作する場合、特に Mac を利用できない環境やクラウド/サンドボックスのエージェントから操作する場合に使用します。ローカルのシミュレーター(expo run:ios、Xcode、Android Studio)、ストア向けのビルド/署名(これは EAS Build の担当)、物理デバイスには使用しません。macOS の場合は、次の「クラウドかローカルか」をご覧ください。

クラウドかローカルか:最初に判断する

  • クラウド/リモート/共有可能な環境を明示的に希望している場合: アクセス権を確認してから、どのホストでも EAS Simulator を使用します。
  • シミュレーターを一般的に希望している場合: 利用可能なら適切なローカルシミュレーターを使用します。ホストで希望するシミュレーターを実行できない場合(たとえば Linux での iOS やクラウドサンドボックス)、アクセス権を確認してから EAS Simulator を使用します。macOS 以外のホストでも、ローカルの Android エミュレーターを利用できる場合があります。
  • ローカル環境を明示的に希望している場合は、その選択に従い、適切に expo run:ios/Xcode/Android Studio に引き継ぎます。希望する環境が不明確で、その違いが作業に影響する場合に限り、確認してください。

ユーザーが EAS Simulator またはクラウドシミュレーターを希望した場合は、改めて確認せずにセッションを開始し、依頼された作業を行ってください。作業が完了したらセッションを停止します。ユーザーが設定した上限を超える場合、または作業が依頼内容を超えて拡大する場合に限り、ユーザーに確認してください。

前提条件

  • すべての eas コマンドは npx --yes eas-cli@latest … 経由で実行してください — simulator:* に対応した十分に新しい CLI を使用できます(グローバルの eas は古すぎることがよくあります)。また、--yes により npx の確認プロンプトが省略されます。(eas --version で最新だと確認できる場合は、eas を直接実行してもかまいません。)
  • 認証済みであること。 対話型のマシンでは、npx --yes eas-cli@latest login を実行してください。クラウドサンドボックス/CI/ヘッドレスエージェントではブラウザーでログインできないため、代わりに環境変数として EXPO_TOKEN(expo.dev → Account → Access Tokens)を設定してください。いずれの場合も、npx --yes eas-cli@latest whoami で確認します。
  • Expo プロジェクトディレクトリから実行してください。新しいアプリでは、初回のみセットアップが必要です。projectId がない場合は npx --yes eas-cli@latest init を実行してプロジェクトを作成/リンクし、ios.bundleIdentifier がアプリ設定にない場合は設定してください — 新規の create-expo-app では設定されていないことがよくあり、prebuild/eas build にはこれが必要です(設定しないと確認を求められるか、失敗します。例:dev.<owner>.<slug>)。npx expo config --json で現在の設定を確認してください(app.config.js に記載されている場合があります)。Mode-C の初回実行は時間がかかります(ネイティブビルドのため)。以降の実行では既存のビルドが再利用されます。
  • デバイスを操作するコントローラーが必要です。このスキルでは agent-device(MIT ライセンスのオープンソース)を使用し、必要に応じて npx agent-device@latest で実行します — グローバルへのインストールは不要です。Appium と argent は代替の自動化インターフェースです。web-preview-only には自動化インターフェースがありません。references/controllers.md を参照してください。
  • .env.eas-simulator は eas-cli が書き込み、管理します(このスキルではありません)。セッション ID(EAS_SIMULATOR_SESSION_ID)とデーモンの URL/トークンが保存されるため、get/stop/exec はデフォルトでそのセッションを対象にします(通常は --id を省略します。別のセッションを対象にするには --id <id> を渡します)。このファイルにはトークンが含まれます → 必ず gitignore に追加してください(eas-cli は「コミットしないでください」と示しますが、ignore ルールを追加しない場合があります。また、新しいアプリの .gitignore では対象にならないため、ない場合は .env.eas-simulator を追加してください)。
  • コマンドブロックは POSIX シェル(bash/zsh)を前提としています — printf、lsof、$(seq …) を使ったループは cmd/PowerShell では実行できません。Windows では WSL または Git Bash で実行するか、必要に応じて書き換えてください(eas-cli/agent-device の呼び出し自体はクロスプラットフォームです)。

セッションの有効期間

  • --max-duration-minutes N は自動停止までの厳密な期限です。どのプランでも設定でき、プランの上限まで指定できます(Free では 40 分、有料プランでは 115 分)。タイマーはセッションの準備が完了した時点で開始します。
  • --max-idle-time-minutes N を指定すると、指定した時間だけ非アクティブだった後にセッションが停止します。省略するとアイドルタイムアウトはありません。セッションは最大実行時間に達するか、明示的に停止されるまで実行されます。
  • コントローラーの操作はアイドルタイマーをリセットします(agent-device、argent、Appium のコマンドは、プロデューサー appium のセッションイベントとして記録されます)。ブラウザープレビューの操作ではリセットされません。 ユーザーが操作するブラウザープレビューでは、セッション時間の上限としてアイドル時間ではなく最大実行時間を利用してください。

まず利用可否を確認する

EAS Simulator は利用制限のある EAS 機能で、現在も段階的に提供されているため、すべてのアカウントで有効になっているわけではありません。セッションを開始する前にアクセス権を確認してください。この読み取り専用コマンドはセッションを作成しません。

npx --yes eas-cli@latest simulator:availability --json
# → {"available": true, ...}  enabled → continue to the core loop
# → {"available": false, ...} not enabled → do NOT start a session

利用できない場合は、simulator:start を呼び出さないでください(失敗します)。代わりに、このスキルを使わなくても作業を続けられるよう、次の方法で適切に切り替えてください。

  • ユーザーに、アカウントではまだ EAS Simulator を利用できないこと、近日中に利用可能になることを伝えます。
  • 実際の目的には通常のローカル環境での方法を使います — ローカルのシミュレーター/エミュレーターには expo run:ios/Xcode/Android Studio、または EAS Build など、目的に合った方法を選びます。クラウドシミュレーターに固執して行き詰まらないでください。依頼のほとんどは「特に EAS Simulator を使う」ことが目的ではありません。

(simulator:availability が認識されない場合、CLI が古すぎます — アップグレードしてください。または simulator:start で not enabled for this account エラーが発生した場合も、同様に中止して別の方法に切り替えてください。)

コアのループ(常に同じ)

セッションは start → (アプリをインストール) → drive → stop です。eas-cli が セッション を管理し、デバイスの 操作(open/tap/screenshot)はコントローラーが提供します。npx --yes eas-cli@latest simulator:exec は、セッションの接続環境変数を読み込んだ状態でコントローラーを実行します。

# 1. Start a session (boots the remote sim + agent-device daemon; writes .env.eas-simulator).
# If the dotenv names a session, inspect it with simulator:get --json first. Reuse it when it
# belongs to this run; stop it only when it is in scope and no longer needed. An IN_PROGRESS
# session may be intentionally concurrent, so preserve its id/config before resetting the dotenv.
# Continue below only after choosing how to handle that existing session.
printf '# managed by eas-cli\n' > .env.eas-simulator   # clear only after resolving any live session
npx --yes eas-cli@latest simulator:start --platform ios --type agent-device --non-interactive \
  --name "Checkout flow screenshots"   # always name it — see 'Always name the session'
#    Then confirm it's live: simulator:get --json → status IN_PROGRESS (bounded poll in run-your-app.md).

# 2. Drive it through `exec` (loads the session env, then runs the command you give it).
#    agent-device runs on demand via npx — nothing installed globally.
npx --yes eas-cli@latest simulator:exec npx agent-device@latest open <app-or-url> --platform ios
npx --yes eas-cli@latest simulator:exec npx agent-device@latest snapshot -i          # interactive UI tree → @e1, @e2 refs
npx --yes eas-cli@latest simulator:exec npx agent-device@latest press @e2            # tap a ref (use 'press' or 'click')
npx --yes eas-cli@latest simulator:exec npx agent-device@latest screenshot ./shot.png

# 3. Stop the session and reset the dotenv. Omit --id to target the dotenv session.
npx --yes eas-cli@latest simulator:stop
printf '# managed by eas-cli\n' > .env.eas-simulator

ライブで確認するには、start が出力する webPreviewUrl をユーザーに渡します(--json では remoteConfig.webPreviewUrl、web-preview-only セッションでは remoteConfig.previewUrl)。現在のすべてのセッションタイプには、iOS と Android の両方でブラウザープレビューが含まれます。agent-device、appium、argent では自動化も利用できますが、web-preview-only には自動化インターフェースがありません。Android では、expo.dev のセッションページにプレビューはまだインライン表示されません。Open preview を選ぶと、新しいタブで開きます。Android のサポートは開発中のため、一部の iOS 機能は動作しない場合があります。この URL はユーザーのブラウザー用です。ユーザーに代わって開くことはできず、シミュレーターで絶対に開いてはいけません。

  • 「ここで開く」(Cursor/VS Code) → URL を単独の行に出力し、ユーザーに Simple Browser を開いて(Cmd/Ctrl+Shift+P → 「Simple Browser: Show」)、URL を貼り付けるよう伝えます。その後は停止します。システムブラウザーや Cursor/VS Code の URL ハンドラーをシェルから起動してはいけません。また、「タブが表示されましたか?」と尋ねてもいけません。確認することはできず、引き渡しは完了しています。
  • **シミュレーターで webPreviewUrl を open してはいけません。**これはブラウザープレビューであり、ディープリンクでも agent-device open の引数でもありません。デバイスに送ると、ブラウザーの中にブラウザーが表示されます(過去に実際に起きた失敗です)。
  • ヘッドレスエージェント(ディスプレイなし)→ URL を成果物としてそのまま返します。
  • ユーザーが操作できるように稼働状態を保つ場合 → --max-duration-minutes N を使用します(プランの上限まで)。ブラウザープレビューのアクティビティでは --max-idle-time-minutes はリセットされないため、この場合、アイドルタイムアウトは信頼できる稼働時間の上限ではありません。CLI が報告する期間または有効期限を使って、セッションの期限が切れるタイミングをユーザーに伝えます。要求されたプレビューの間は稼働状態を保ち、1 回限りのタスク用に作成したセッションはタスク完了時に停止します。

start はジョブ実行 URL も出力します。

セッションには必ず名前を付ける

すべての simulator:start に --name "<description>" を指定してください。名前は simulator:list、simulator:get、expo.dev の Simulator sessions ページに表示され、各行の汎用的なタイトルに置き換わります。名前を付けないと、すべての行がランダムな ID の上に「Simulator session」と表示されます。同じ項目ばかりが並び、どれを選べばよいか分からなくなります。実行中の自分向けではなく、数日後に一覧を確認する人が見て分かる名前を付けてください。

セッションの目的を、分かりやすい短い言葉で表してください。

--name "Checkout flow screenshots"     # what you did
--name "Dev build — dark mode fix"     # what you were testing
--name "Login repro for issue 412"     # why it exists

ルール:

  • モードやツールではなく、ユーザーのリクエストから名前を決めてください。Mode C session、agent-device ios、test では何も伝わりません。
  • 長さは3~6語、約40文字を目安にし、実用上の上限は50文字としてください。 狭いテーブル列に1行のタイトルとして表示されるため、長い名前は途中で切れてしまいます。API が受け付けるのは最大 255文字で、空または空白のみの名前は拒否されますが、255文字は決して目指す長さではなく、上限にすぎません。文章ではなく、名詞句にしてください。
  • この長さの範囲で具体的な名前にしてください。該当する番号があれば、チケット番号または PR 番号を含めてください。
  • 文頭のみ大文字にしてください。 識別子は本来の大文字・小文字を維持します(Dev build for expo-router v4、Repro for EXPO-1234)。一覧の行タイトルなので、各単語を大文字で始めたり、すべて小文字にしたりせず、末尾にピリオドも付けないでください。
  • テーブルにすでに表示される情報は繰り返さないでください。 各行にはセッション ID、プラットフォーム、開始時刻、所要時間、作成者がすでに表示されます。したがって、ID、iOS、日付、自分の名前は含めないでください。予算のすべてを、他の列では伝わらない目的の説明に使ってください。
  • ユーザーが名前を指定した場合は、その名前をそのまま使ってください。
  • セッションは実行ごとに作成されるため、新しいセッションにはその実行に合わせた名前を付けてください。異なる作業に古い名前を使い回さないでください。

--name は simulator:start 自体より新しい機能のため、古い eas-cli が指定を拒否することがあります。その場合は npx --yes eas-cli@latest を使って実行するか、アップグレードしてください。最終手段として、--name なしでもう一度だけ実行できます(セッションに名前は付きません)。references/troubleshooting.md を参照してください。

コマンド一覧

デフォルト以外の開始フラグ、機械可読形式または設定の出力、一覧のフィルター、セッションイベントを使う前に、インストール済み CLI に問い合わせて、現在の完全なフラグ一覧を確認してください。

# Replace `start` with the simulator subcommand you are about to run.
npx --yes eas-cli@latest simulator:start --help

以下の例では一般的なワークフローを示していますが、CLI の全機能を網羅しているわけではありません。このスキルに含まれる、特にセッションの有効期間に関する、挙動上の重要なガイダンスは、--help を使ってコマンドを組み立てる場合も必ず守ってください。

コマンド目的
npx --yes eas-cli@latest simulator:availability [--json] [--non-interactive]セッションを作成せずにアクセスを確認します。
npx --yes eas-cli@latest simulator:start --platform ios|android --name "<description>" [flags]セッションを作成し、シミュレーターと選択したインターフェースを起動します。デフォルトでは .env.eas-simulator を書き込み、プレビューとジョブ実行の URL を表示します。必ず --name を指定してください。--json では dotenv の書き込みは抑止されません。ファイルに書き込みたくない場合は --out-config-type env を使ってください(コントローラーの export 行のみが表示され、EAS_SIMULATOR_SESSION_ID は含まれないため、get/stop/events には --id を渡してください)。
npx --yes eas-cli@latest simulator:exec <cmd> [args…].env.eas-simulator を読み込んでから、その環境変数を設定して <cmd> を実行します。コントローラーへのブリッジです。
npx --yes eas-cli@latest simulator:get [--id <id>] [--json] [--non-interactive]セッション名を含む、セッションの状態と接続の詳細を表示します。準備完了の確認に使ってください(運用の原則を参照)。
npx --yes eas-cli@latest simulator:list [filters] [--limit N] [--after <cursor>] [--json]プロジェクトのセッションを一覧表示し、ページ送りします。ステータス、タイプ、プラットフォーム、名前のプレフィックス、タグで絞り込めます。
npx --yes eas-cli@latest simulator:events [--id <id>] [--follow|--json]記録されたアクティビティイベントを表示します。--follow を指定すると、セッションが終了するまで監視します。
npx --yes eas-cli@latest simulator:stop [--id <id>] [--json] [--non-interactive]セッションを停止します(冪等)。

ユーザーのアプリを実行する — モードを選択

リモートシミュレーターは空の状態で起動します — Expo Go もアプリもありません。ビルドをインストールしてから操作します — ただし、まず目的に合わせてビルドの 種類 を選んでください(下のボックスを参照)。ここでライブセッションの実行が行き詰まります。手順の全容はreferences/run-your-app.mdを参照してください — モードを実行する前にお読みください。

**何かをインストールする前に、目的に合ったビルドを選んでください — ここでライブセッションの実行が行き詰まります。**原因が同じ2つの落とし穴があります(依頼に合わないビルドを選んでしまうこと)。

  1. 種類が違う。ライブ編集(モード C)には開発ビルドが必要です。 静的 ビルド — ローカルの Release ビルド(A)、既定の EAS シミュレータービルド(B)、または以前のスクリーンショット撮影でシミュレーターに残されたビルド — はビルド時点の JS を固定するため、**ホットリロードはできません。**ライブでの操作を依頼された場合は、既存のビルドをすべて無視し、開発ビルド(ローカル Debug、または developmentClient: true を指定した EAS ビルド)をインストールしてください。再読み込みを期待して静的ビルドに Metro を再接続しないでください — 再読み込みされません。
  2. **古くなっている。**静的な表示には現在のソースが反映されている必要があります — フィンガープリントが一致するビルドのみ再利用し、それ以外は新たにビルドしてください。再利用するのは明示的に指示された場合のみです。

つまり、残っている EAS/release ビルドは「ライブで反復する」ための**近道ではなく、間違ったバイナリです。**ビルドが 存在する からといって、それが適切なビルドになるわけではありません。

モード内容選択するタイミングライブ編集
A — ローカルのリリースビルドRelease .app をローカルでビルドし、agent-device install でインストールします(アップロードします)ユーザーが Mac のツールチェーンを持ち、「現在のコードをクラウドデバイスで実行」したい場合いいえ(変更を確認するには再ビルドが必要です)
B — EAS ビルド(まれ、明示的な指示がある場合のみ)eas build でシミュレータービルドを作成し、agent-device install-from-source <url> を実行します(VM がダウンロードします)明示的に依頼された場合のみ — ユーザーが既存のビルド/EAS ビルドを指定した場合、または CI/共有用の静的な EAS アーティファクトを求めている場合です。「見せて」「反復して」には使いません(C を使用してください)。シミュレータービルドに認証情報は不要です。いいえ
C — ローカルの開発ビルド+トンネル開発(Debug)ビルド+EXPO_UNSTABLE_TUNNEL_V2=1 expo start --tunnel+開発クライアントを Metro に接続エージェントによる編集・確認のループ — コードを変更して、ライブで確認します(Fast Refresh)はい

簡単な選択方法 — 既定では C を選択します。A と B は明示的な指示がある場合のみです。

  • **C(ほとんどの場合):**反復、操作、アプリの確認、ライブ編集 — そして「アプリを見せて」のほとんど(現在のコードにはいずれにせよビルドが必要なので、ライブで最新の状態を確認できるほうが適しています)。Mac がある場合は開発クライアントをローカルでビルドします。Mac がない場合は EAS でビルドします(developmentClient: true)。迷ったら C です。
  • **A:**Mac で静的なスクリーンショットを1回だけ撮るよう明示的に依頼された場合のみ。
  • **B:**ユーザーが既存のビルド/EAS ビルドを指定した場合、または静的な EAS アーティファクト(CI/共有用)を求めている場合のみ — 「反復」に静的ビルドが適さない理由は上のボックスを参照してください。

モード C のトンネルを開始する前、または開発クライアントを接続する前に、トンネルの適用範囲と承認をお読みください。このプロジェクトのリモート開発用通信に対する既存の承認は、トンネルの作成、接続、ライブ編集にも引き継いでください。承認を求める際は、その承認の出所と具体的なデータフローを含めてください。

デバイスの操作(agent-device)

コントローラーが録画をダウンロードできない場合は、EAS セッションのアーティファクトから取得してください。

agent-device はコントローラーです。よく使う動詞(それぞれ npx --yes eas-cli@latest simulator:exec npx agent-device@latest <verb> として実行します):

動詞機能
apps --platform iosユーザーがインストールしたアプリを一覧表示します(空のシミュレーターには何も表示されません)。システムアプリも含めるには --all を追加します
install <appId> <path> --platform iosローカルの .app をインストールします(アップロードされます)
install-from-source <url> --platform iosURL からインストールします。VM がダウンロードします(EAS アーティファクトに使用します)
open <appId|deep-link> --platform iosアプリ(バンドル ID)を起動するか、アプリの ディープリンク(exp+slug://…)を開きます。初回のディープリンクでは、システムの 「''で開きますか?」 ダイアログが表示されます。表示されることを想定してください(確認のためにスナップショットを無駄に撮らないでください)。press 'label="Open"' で引き継ぎます。時間がかかる場合があるため、agent-device 自体の --timeout(例:press 'label="Open"' --timeout 120000)で制限してください。シェルの timeout ラッパーは使用しないでください(macOS には timeout バイナリがありません)。Mode C では Metro 接続リンクに「URLを手動で入力」を使うことで、このダイアログを回避できます(run-your-app.md を参照)。webPreviewUrlには使用しないでください。これはユーザー向けのブラウザープレビューであり、デバイス用ではありません。
snapshot -iアクセシビリティツリーを対話形式で表示します → @e1形式の参照
press <ref|selector>タップします(例:press @e2 または press 'label="Open"')。click <target> も使用できます。press または click を使用してください。tap は隠しエイリアスで、古いバージョンでは拒否されます
fill <ref> "text"フィールドにテキストを入力します
screenshot <path>画面をローカルの PNG にキャプチャします(デーモンからダウンロードされます)。アプリが開いている必要があります(先に open を実行してください)。iOS では既定で論理ポイントの1倍(iPhone 17では402x874)です。フル解像度にするには --pixel-density 3 を追加します
record start [path] / record stoprecord start のパスに画面を動画として録画します(record stop にはパスを指定しません)。単一のスクリーンショットでは捉えられない動き(アニメーション、ジェスチャー、遷移、タイミング)の確認に使用します
metro prepare / metro reload開発クライアントを Metro に接続する/再読み込みします(Mode C)

スクリーンショットと動画。 静止状態には既定で screenshot を使用しますが、アニメーション、遷移、ジェスチャー、タイミングやカクつきの確認など、何かが動く場合は、代わりに動画を録画してフレームを確認してください。静止画では動きを証明できません。どちらのコントローラーでも録画できます(agent-device の record start/stop、argent の screen-recording-start/stop)。録画は約30fpsでサンプリングされるため、目に見えるカクつきの確認には十分ですが、フレーム未満の60/120Hzの引っかかりを証明することはできません。特にタイミングを確認する場合、argent は既定で静止フレームを除外します(trimStatic をオフにしてください)。この設定と、コントローラーごとのその他の注意点については、references/controllers.mdを参照してください。

動詞の全一覧と、代替コントローラー argent については、references/controllers.mdを参照してください。

アプリがクラッシュしたとき:デバイスログとクラッシュレポート(iOS)

アプリがクラッシュしたり、起動時に閉じたりした場合は、スクリーンショットから推測する前に、iOS セッションのクラッシュレポートとデバイスログを確認してください。simulator:get --json のプレビュ― API URL から読み取ります。この URL にはセッショントークンが含まれるため、絶対に出力しないでください。

クラッシュを再現する前に、デバイスログの記録を開始してください。 記録を開始していないと、クラッシュレポートは作成されますが、ログの末尾は空になります。コマンド、フィールド、代替手段については、references/logs-and-crashes.mdを参照してください。

運用原則

直感的ではありませんが、理解しておく価値のあるメンタルモデルです。具体的なエラーと対処法(ハングした動詞、tap が拒否される、--platform、--json、pod install のロケール、孤立したセッション、起動時間のばらつき)については、references/troubleshooting.md を参照してください。

  1. まず事実を確認し、その後リセットします。場当たり的な修正を繰り返さないでください。 既存のセッションや Metro が自分のもの、または正常な状態だと決めつけないでください。操作を始める前に、次の点を確認します。

    • cwd — 意図した Expo プロジェクトのディレクトリにいることを確認します(誤ったディレクトリからの start/exec は、別のアプリのセッションを開始し、余計な .env.eas-simulator を残します。pwd を実行するか、app.json を確認してください)。
    • セッションが稼働中であること — simulator:get --json で IN_PROGRESS になっていることを確認します(停止したセッションは ID と remoteConfig が残るため、dotenv があるだけでは稼働中の証拠になりません)。
    • Metro が専用ポートで稼働していること — このセッションで起動した場合に限り再利用してください。それ以外の場合は、空いているポートで起動します(--port <N>、例:8082)。別のサーバーを終了させて :8081 を空けないでください(run-your-app.md)。
    • ビルドが目的に合っていること — リリースビルドではライブリロードできません。ライブ編集したい場合にリリースビルドがインストールされているなら、再接続せず、開発ビルドをインストールしてください。

    最初の接続後に現在のコードが表示されない場合は、稼働中の状態をあれこれ操作せず、ベースラインにリセットします(セッションを停止 → dotenv をクリア → Metro を終了)。その後、同じモードを一度だけやり直してください。2回目も失敗したら、そこで停止して報告します。Metro をその場で再起動したり、複数回再接続したり、JS/接続の問題を解決するためにネイティブクライアントを再ビルドしたり、状態が不明なままプレビュー URL を提示したりしないでください。(デーモンの切断 — ERR_NGROK_3200/Remote daemon is unavailable — も同様です。再試行せず、リセットしてください。)

  2. exec はラッパーであり、操作用ドライバーではありません。 simulator:exec は .env.eas-simulator を読み込み、渡されたコマンドを起動します。デバイス操作の動詞はコントローラー(npx agent-device@latest)から提供されます。simulator:tap はありません。

  3. すぐに操作し、アイドル状態のセッションを放置しないでください。 セッションは短時間しか維持されません。start の直後にインストールして操作してください。アイドル状態で放置するとトンネル/デーモンが切断されます(#1 に従ってリセットしてください)。

  4. 完了時または失敗時には、作成したセッションを停止し、dotenv をリセットしてください。 --non-interactive を指定しても、タスクの終了時にセッションは停止されません。ライブプレビューを依頼された場合は、上記の時間に関するガイダンスに従ってください。起動に時間がかかる場合は、既存のセッションをポーリングします。別のセッションを開始すると余分なセッションが作成され、dotenv のセッション ID が上書きされます。

  5. 正しい最新ビルドのスクリーンショットだけを撮影してください。 モード C は、開発クライアントが Metro に接続した後に限ります。モード A/B は、現在のソースに一致するビルドからのみ撮影してください。既存のビルドを再利用することが、「編集内容が表示されない」原因の第1位です(上記のビルドに関する注意事項を参照)。(ステータスバーの 9:41 はシミュレーターのデフォルトであり、古い状態を示すものではありません。)

停止とクリーンアップ

タスクの完了後、作成したセッションを停止し、dotenv もリセットしてください。そうしないと、次回の実行で停止済みのセッションが再利用されてしまいます。ライブプレビューを依頼された場合は、代わりに合意した期間中、利用できる状態にしておきます。

npx --yes eas-cli@latest simulator:stop          # omit --id → stops the dotenv session (or pass --id <id>)
printf '# managed by eas-cli\n' > .env.eas-simulator   # clear the stale session id so it isn't reused
# if you started Metro for Mode C, stop it too (Ctrl+C in its terminal, or kill the expo process)

参考資料

信頼できる情報源は、Expo のドキュメントと eas/agent-device CLI です(npx --yes eas-cli@latest simulator:* --help、npx --yes eas-cli@latest simulator:exec npx agent-device@latest help [topic]。simulator:exec の後に --help を付けると、EAS CLI のヘルプが表示されます)。このスキルでは、それらの適用方法を説明しますが、置き換えるものではありません。

フィードバックの送信

このスキルにエラー、誤解を招く情報、または古い情報がある場合は、Expo の改善に役立てるため報告してください。

npx --yes @expo/agent-cli@latest feedback --category skills --subject "eas-simulator" "<actionable feedback>"

具体的で実行可能な内容がある場合にのみ送信してください。関連するコンテキストをできるだけ詳しく含めてください。 エージェントが Expo のタスクに繰り返し失敗した場合や、ユーザーが介入する必要があった場合は、タスクの内容、期待される結果、問題の内容を簡潔に報告し、--category evals と、関連する Expo パッケージまたはコマンドを --subject として指定してください。

コメント