mcpField
S
simulator-automation

simulator-automation

github.com/even-realitiesテスト・品質79135 回インストール1 週間前に更新
リポジトリ

simulator-automation について

Even Hub Simulatorが提供するHTTP自動化APIのガイドです。開発者はシミュレーターの画面やログを確認し、タッチパッド入力を送って操作テストを自動化できます。

主な機能

  1. 01ヘルスチェック用エンドポイント
  2. 02グラスとWebviewのスクリーンショット取得
  3. 03コンソールログの読み取りと消去
  4. 04タッチパッド入力の送信

活用シーン

  1. 01アプリ起動状態の自動確認
  2. 02画面表示と実行ログの調査
  3. 03ジェスチャー操作テストのスクリプト化

インストール

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

$npx skills add https://github.com/even-realities/everything-evenhub --skill simulator-automation

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

詳細

EvenHub Simulator Automation

--automation-port <PORT> を指定して起動すると、シミュレーターは localhost で HTTP API を公開します。

evenhub-simulator https://my-app.example.com --automation-port 9898

ベース URL:http://127.0.0.1:<PORT>

API リファレンス

ヘルスチェック
GET /api/ping
→ "pong"
メガネのスクリーンショット

現在の LVGL フレームバッファーを image/png(576×288、RGBA)として返します。

GET /api/screenshot/glasses
→ image/png binary (RGBA)

RGBA 形式 — 画像分析における重要事項:

  • 背景ピクセル:(R=0, G=255, B=0, A=0) — 透明(アルファ = 0)
  • 点灯/テキストのピクセル:(R=0, G=255, B=0, A=255) — 不透明(アルファ = 255)

常に RGBA モードで処理してください。RGB に変換しないでください。アルファチャンネルが失われ、背景ピクセルとテキストピクセルの区別がつかなくなります(どちらも純粋な緑色に見えます)。

from PIL import Image
img = Image.open('glasses.png')  # keep as RGBA — do NOT call img.convert('RGB')
pixels = img.load()
# Lit pixel test:
is_lit = lambda px: px[3] > 0   # alpha > 0
Webview のスクリーンショット

html2canvas を使用して、メインのブラウザー Webview をキャプチャします。image/png を返します。処理に数秒かかる場合があり、10 秒後にタイムアウトします。

GET /api/screenshot/webview
→ image/png binary
コンソールログ

メイン Webview からキャプチャした console.* の出力、捕捉されなかった例外、未処理のプロミス拒否、失敗した fetch 呼び出しを返します。

GET /api/console
→ { "entries": [...], "total": N }

各エントリー:

{ "id": 0, "level": "log|warn|error|info|debug|trace", "message": "...", "ts": 1712150400000 }

コンソール以外のソースのプレフィックス:

  • [uncaught] ... — 捕捉されなかった例外
  • [unhandledrejection] ... — 未処理のプロミス拒否
  • [fetch] ... — 失敗した fetch(成功以外のステータスまたはネットワークエラー)

新しいエントリーのみをポーリングする場合:

GET /api/console?since_id=42
→ entries with id > 42

since_id は 0 以上の整数である必要があります。 負の値(例:-1)を渡すと、空のリストではなくサーバーエラーが返されます。最初のポーリングではパラメーターを省略して現在のすべてのエントリーを取得し、その後、レスポンスの last_id を追跡してください。

# First poll — no since_id
resp = requests.get(f"{BASE_URL}/api/console")
entries = resp.json()["entries"]
last_id = max((e["id"] for e in entries), default=0)

# Subsequent polls
resp = requests.get(f"{BASE_URL}/api/console?since_id={last_id}")

バッファーをクリアする場合:

DELETE /api/console

タイミングに関する注意: 起動時のログ(「ready」シグナルなど)は一度だけ出力されるため、読み取る前にバッファーをクリアすると失われます。手順:まず ready シグナルをポーリングし、必要に応じてその後にクリアしてください。

# Safe: check for ready signal BEFORE clearing
poll_until(target="APP_READY")
requests.delete(f"{BASE_URL}/api/console")  # only if you need a clean slate after
メガネへの入力

メガネのディスプレイにタッチパッド操作を送信します。

POST /api/input
Content-Type: application/json

{ "action": "up" | "down" | "click" | "double_click" }

レスポンス:{ "ok": true }

操作はメガネのタッチパッドに対応します:

  • up / down — リスト項目またはテキストをスクロールします
  • click — 現在の項目を選択します
  • double_click — システムレベルのダブルクリックイベントを発生させます(通常は「戻る」または「閉じる」)

自動化のワークフロー

  1. サーバーが実行中であることを確認します: GET /api/ping
  2. アプリの準備完了をポーリングします(先にコンソールをクリアせずに):既知のログメッセージを探します。
  3. 状態を確認します: /api/screenshot/glasses(RGBA)または /api/console を使用します。
  4. 操作します: POST /api/input で入力を送信します。各操作の後、少し(約300ms)待ってから状態が変化したことを確認します。
  5. 繰り返します: コンソールのポーリング時に since_id を使用し、古いエントリーを再読み込みしないようにします。

ヒント

  • メガネのディスプレイは 576×288 ピクセルで、単色の緑色です。スクリーンショットは RGBA PNG です。
  • 入力が機能するのは、アプリがアクティブなイベントコンテナーを作成している場合のみです。アクティブなコンテナーがない場合、入力は何も通知されずに無視されます。
  • double_click は通常、前の画面に戻る、または現在のビューを閉じるために使用されます。
  • 起動後、ポーリングを開始するまでに 4 秒以上待ってください。SDK の初期化と createStartUpPageContainer に時間がかかります。

タスク

$ARGUMENTS

コメント