本文へ移動
cccskills
無料GitHub で公開日本語紹介

control-ui-e2e

OpenClaw Control UIの画面変更を、状態別の比較ギャラリーと実ブラウザの操作テストで確認し、利用者のコメントや変更前後の画像を残すスキル。

原文原文の説明を見る

Design, test, fix, or extend OpenClaw Control UI GUI; UI stress-test galleries with feedback inputs, Vitest + Playwright end-to-end checks, mocked Gateway flows, screenshots/videos, agent-verifiable browser proof.

インストール方法を見る

こんなときに便利

  • 読み込み・空・エラー状態の比較
  • 画面変更への意見を集めたいとき
  • 模擬Gatewayでチャット操作を検証
  • 画面変更前後の画像を残したいとき

日本語での紹介

できること

OpenClaw Control UIの画面設計や修正を、見た目と操作の両面から確認します。通常、読み込み中、空、エラーなどの状態を並べたHTMLギャラリーを作り、各例へのコメントを保存・書き出せます。VitestとPlaywrightでは、Gatewayの応答を模擬して、画面起動、通信、操作後の表示までを通して検証します。見た目の変更には、確認済みの変更前後の画像を残します。

こんなときに便利

複数の状態を持つ画面や部品を変更するとき、具体的な表示例を見ながら意見を集めたいときに向いています。チャット送信など、通信と画面表示を一緒に確かめたい開発にも使えます。

使い方の例

  • 「この画面の通常・空・エラー状態を比較できるギャラリーを作って」
  • 「Gatewayの応答を模擬して、送信後の表示をテストして」
  • 「レイアウト変更前後の画像を残して」

注意点

OpenClawの開発環境と導入済みの依存パッケージが前提です。通常は実際の認証情報を使わず検証します。ギャラリーは操作テストの代わりにはならず、生成画像や動画は原則コミットしません。

この紹介文は、公開されている SKILL.md をもとに AI(Claude Haiku)が作成しました。正確な仕様は下の原文を確認してください。

含まれるファイル(2)

  • SKILL.md10.0 KB
  • agents/openai.yaml221 B

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Control UI E2E

Control UI design feedback + real browser flows with deterministic Gateway data.

UI Stress Test

  • Substantial UI changes: build local HTML stress-test gallery early; let user compare meaningful states and give feedback on concrete examples.
  • Use for layouts, interactions, components with multiple states. Small copy/icon edits may skip when gallery adds no useful comparison.
  1. Derive examples from affected components + data contracts. Cover relevant normal, loading, empty, error, unavailable, permission, selected, expanded states; long text/dense content where they stress layout. Show mutually exclusive states separately; label proposed states unsupported by current implementation.
  2. One browser-openable HTML overview: stable example IDs, short state labels, enough context to understand each example. Prefer real components + deterministic mock fixtures. Label static/approximate renderings; link running UI for interactions they cannot reproduce. Generated galleries: task-owned artifact storage; no default commit.
  3. Every example: labeled feedback input. Persist locally across refreshes with gallery-specific storage key + stable example IDs. Copy feedback action exports example IDs, state labels, comments as Markdown/plain text for user to return to conversation.
  4. Open gallery in available preview browser; share URL/file path. Preserve same gallery, example IDs, existing comments through iteration. Apply user feedback to both gallery + implementation; keep comparable.
  5. Before requesting feedback: inspect rendered examples at relevant viewport sizes; verify feedback survives refresh + exports correct example labels. Report unsupported states/preview limitations.

Gallery supports design review; never replaces focused behavior tests or inspected before/after proof from running UI. Preserve final proof in fresh capture directories below, separate from evolving gallery.

Test Shape

  • Full GUI flows: ui/src/**/*.e2e.test.ts.
  • ui/src/test-helpers/control-ui-e2e.ts: start Vite Control UI + install mocked Gateway WebSocket.
  • Deterministic scenarios. No live provider keys, real channel credentials, real Gateway unless user explicitly asks for live proof.
  • Narrow rendering logic: prefer existing .browser.test.ts/unit tests. E2E lane: routing, app boot, Gateway handshake, requests, visible UI behavior together.

Commands

  • Target one E2E test in Codex worktree:
node scripts/run-vitest.mjs run --config test/vitest/vitest.ui-e2e.config.ts --configLoader runner ui/src/e2e/chat-flow.messaging.e2e.test.ts
  • Whole local lane in normal checkout:
pnpm test:ui:e2e
  • Use ready dependency installation or prepared normal checkout; never reconcile shared install while other jobs use it.
  • Follow $openclaw-testing: trusted development proof may run locally; remote proof needs browser/platform, clean-environment, or source-isolation reason.

Visual Proof Default

  • Appearance changes: inspected before/after visual evidence.
  • Other behavior: clearest appropriate boundary proof; video + screenshot set not mandatory when assertions already demonstrate change.
  • Deterministic Vitest E2E assertions; never commit generated screenshots/videos.
  • Shared suite disables Chromium partial rasterization + GPU rasterization to avoid observed paint-history-dependent edge pixels. Exact repeat comparisons still required before claiming reproducibility.
  • Transient states such as Saved: install page.clock before fixture; pause with pauseVirtualClock; advance only fixture work needed to enter state. setFixedTime alone does not pause timers. Capture readiness uses native layout delivery without advancing fixture clock.
  • Stills: takeControlUiScreenshotFrame from ui/src/test-helpers/control-ui-e2e-screenshot.ts, explicit semantic content + animations: "disabled". Pass viewport changes/intended scroll target through viewport/scrollTo; verifies retained centering, viewport/scroll-clip intersection, settled layout/fonts/visible images.
  • Pass all related element locators in elements; save returned page PNG + crops from that single frame. Crops enclose fractional bounds in measured PNG pixels; dimensions + unchanged bounds asserted. Never combine separate page/locator screenshots as same-frame evidence.
  • Default current-frame mode + existing viewport/element helpers preserve recording + sampled animation behavior. Static preparation stays active through bounds measurement + unclipped capture; full-page proofs must fit viewport-frame dimensions.
  • After/alongside focused E2E test: run mocked Control UI app when available, e.g. pnpm dev:ui:mock -- --port <port>.
  • Drive Chromium with Playwright against local mock URL. Capture needed states with screenshots/short video.
  • Use browser.newContext({ recordVideo: { dir, size }, viewport }), page.screenshot({ path }); close context before reporting video path.
  • Session-host command-state proof: viewport-only captures, verified with Playwright 1.62.1 + Chrome 151.0.7922.34 (Linux real Gateway; macOS arm64 synthetic reproduction). Other recording owners not migrated/certified by this fix; verify their required screenshot content + finalized video separately. See the verified capture path and upstream limitation.
  • Allocate retained proof with createControlUiE2eArtifactDir(scope, parentDir?) from ui/src/test-helpers/control-ui-e2e-artifacts.ts. Each call atomically creates fresh directory + logs actual path. Parent precedence: explicit parent → trimmed existing OPENCLAW_UI_E2E_ARTIFACT_DIR → repository's .artifacts/control-ui-e2e parent. Existing custom output controls select parents; never add/rewrite env vars to enable capture.
  • Allocate during test/scenario or beforeEach, once per attempt; standalone scripts once per invocation. Pass owner explicitly to shared capture helpers. Keep original gates, feature/stage names, viewports, waits, recording options. Distinct stages: distinct filenames. Keep screenshots/reports/video together.
  • Retain successful + failed evidence. Report actual allocated paths, including relocated filename overrides. Manually delete only exact owned directories after review; never clear shared parents before replay. Disposable build/media fixtures + owned temporary raw video may keep cleanup. New synthetic captures cannot recover overwritten evidence.
  • Timeout diagnostics: fresh children beneath existing diagnostic parent. Mantis retains every capture attempt under invocation-owned directory; refuses report overwrite. Real-Gateway suites, chat-outbox-*, chat-attachment-read-lifecycle: separate owners; coordinate before claiming replay-safe retention there.
  • Recording = validation, not only demo capture. Recorder fails/shows surprising behavior: stop, fix behavior, add/update regression test, rerecord.
  • Visual proof blocked: state exact blocker; still report textual E2E evidence.

Mock Pattern

Start app server; install mock before page.goto; assert Gateway traffic + visible UI:

const server = await startControlUiE2eServer();
const page = await context.newPage();
const gateway = await installMockGateway(page, {
  historyMessages: [{ role: "assistant", content: [{ type: "text", text: "Ready." }] }],
});

await page.goto(`${server.baseUrl}chat`);
await page.locator(".agent-chat__composer-combobox textarea").fill("hello");
await page.getByRole("button", { name: "Send message" }).click();

const request = await gateway.waitForRequest("chat.send");
await gateway.emitChatFinal({ runId: String(request.params.idempotencyKey), text: "Done." });
await page.getByText("Done.").waitFor();

New flow needs more Gateway surface: extend installMockGateway with typed scenario options/method responses.

Run Inspector evidence

  • Collect with withControlUiRunInspector from ui/src/test-helpers/control-ui-run-inspector.ts. Owns separate page; closes on success/failure; leaves caller's Chat page + unsent draft in place.
  • preparePage: mock Gateway or campaign's existing per-tab authentication setup. Shared browser context does not copy another tab's session-storage token.
  • Helper uses rendered component model's RunInspectorSelector + activityRunInspectorSelectorHref, including selected receipt's decision cursor.
  • Rendered panel's data-run-id + data-execution-id: returned present identity, not just requested URL. Selected detail's data-receipt-selector-id = DecisionReceiptDisplayV1.selectorId.
  • Missing/ambiguous identity or missing selected receipts must not count as matches.
  • Decision selectors separate from optional terminal transcript key agent.wait.terminalReceipt.assistantTranscriptIdempotencyKey. Never manufacture key from DOM selector/history row or claim Inspector evidence repairs its absence.
  • Sidebar run state's current accessible label: Active run, not Running.

Standalone Recording

  • Narrated captions, eased target zooms, fast-forwarded pauses: use proof-video dev skill. Standalone template records raw evidence + cue sidecar, renders captioned MP4 with system ffmpeg. Keep raw capture; attach inspected polished video.
  • Already-running mocked Control UI URL: temporary Playwright script or playwright test spec; keep recording flow focused:
    • Open mock URL; interact through stable data-*/user-facing role selectors; wait on asserted states, not fixed sleeps.
    • Request-driven flows: assert visible UI + mocked Gateway traffic. Example: expected count/row visible + sessions.list called with expected search, offset, limit.
    • Short sleeps only after assertions for readable captured video.
    • Generated video: invocation's fresh allocated directory. Never commit or remove older captures.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

1password

無料日本語概要

1Password CLIの導入と認証を確認し、保存したパスワードやAPIキーをコマンドや設定へ渡します。デスクトップ連携やサービスアカウントにも対応します。

  • 1Password CLIを導入したいとき
  • APIキーをコマンドに渡したいとき
  • CIでサービスアカウント認証を使う
openclaw/openclaw39.2万2026年10月12日 更新

acp-router

無料日本語概要

OpenClawへの自然な言葉の依頼をClaude Codeなどの外部コーディングエージェントへ振り分け、作業の開始や継続、スレッド内の会話をつなぐスキルです。

  • Claude Codeをスレッドで開始
  • 外部エージェントの作業を続けたいとき
  • acpxから直接指示を渡したいとき
openclaw/openclaw39.2万2026年10月12日 更新

add-model-provider

無料日本語概要

OpenClawにモデル提供サービスを追加し、実際の応答まで確認するスキル。認証情報は環境変数やファイルへの参照で扱い、設定の検証と結果報告も進めます。

  • OpenClawにモデルを追加したいとき
  • 認証情報を参照形式で設定したいとき
  • モデルの実際の応答を確認したいとき
openclaw/openclaw39.2万2026年10月12日 更新

agent-transcript

無料日本語概要

AIエージェントの作業ログから、GitHubのPRやissueに添える記録を作ります。関連部分を絞り、機密情報を除いてプレビューと掲載を扱います。

  • PRに添えるエージェント作業記録の作成
  • ローカルログから関連する依頼と結果を抽出
  • 機密情報を除いた記録のプレビュー
openclaw/openclaw39.2万2026年10月12日 更新

apple-notes

無料日本語概要

macOSのApple Notesをエージェントから作成・検索・編集・削除し、フォルダ間の移動やHTML・Markdownへの書き出しを行うスキル。

  • タイトルを付けてメモを作りたいとき
  • フォルダ指定やあいまい検索でメモ探し
  • メモの編集とフォルダ整理
openclaw/openclaw39.2万2026年10月12日 更新

apple-reminders

無料日本語概要

Apple Remindersの予定付きToDoをMacから確認・追加・編集するスキル。リストの管理や完了・削除にも対応し、iPhoneやiPadで見るタスクを整理できます。

  • 今日のタスクや期限超過を確認したいとき
  • 期限付きの個人ToDoを追加したいとき
  • iPhoneやiPadのタスクを整理
openclaw/openclaw39.2万2026年10月12日 更新

openclaw のスキルをすべて見る

このスキルの問題を報告する