.claude/skills/record-e2e-gif/SKILL.md
# record-e2e-gif Skill Record Playwright e2e tests as GIF animations, one GIF per test case. ## Prerequisites - `ffmpeg` must be installed (`/opt/homebrew/bin/ffmpeg` on macOS) - Playwright dev server must be running. The endpoint is read from `e2e/envs/.env.playwright` (`E2E_WEBUI_ENDPOINT`). Do NOT hardcode the port — it varies per environment. ## How It Works 1. Run specified Playwright tests with `--video=on` (Playwright saves `.webm` per test in `test-results/`) 2. For each `.webm` fil
npx skillsauth add lablup/backend.ai-webui .claude/skills/record-e2e-gifInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Record Playwright e2e tests as GIF animations, one GIF per test case.
ffmpeg must be installed (/opt/homebrew/bin/ffmpeg on macOS)e2e/envs/.env.playwright (E2E_WEBUI_ENDPOINT). Do NOT hardcode the port — it varies per environment.--video=on (Playwright saves .webm per test in test-results/).webm file, convert to .gif using ffmpeg with palette optimizatione2e/recordings/{spec-name}/ directoryWhen invoked, ask for or accept:
testFile: path to the spec file (e.g. e2e/environment/environment.spec.ts)grep: optional test name pattern to filter (e.g. BAIPropertyFilter)project: browser project, default chromiumoutputDir: output directory for GIFs, default e2e/recordingspnpm exec playwright test {testFile} --grep "{grep}" --project={project} \
--video=on --reporter=list 2>&1
Videos are saved to test-results/*/video.webm (one directory per test).
/opt/homebrew/bin/ffmpeg -y \
-i "{input.webm}" \
-vf "fps=8,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128[p];[s1][p]paletteuse=dither=bayer" \
-loop 0 \
"{output.gif}"
fps=8: 8 frames per second (smooth enough, small file size)scale=960:-1: 960px wide, height autopalettegen/paletteuse: two-pass palette for high quality GIFPlaywright names test result directories as:
{spec-dir}-{describe-name}-{test-name}-{project}/
Parse the directory name to derive a slug for the GIF filename:
-chromium)-IMPORTANT: GIF files must NEVER be committed to git. e2e/recordings/ is in .gitignore.
Image upload MUST use Chrome DevTools MCP — do NOT use gh CLI, GitHub releases, or any other method.
CRITICAL: GIF table MUST be added to the PR body (본문), NEVER as a PR comment.
The workflow:
mcp__chrome-devtools__navigate_pagemcp__chrome-devtools__upload_file) to get CDN URLsgithub.com/user-attachments/assets/...) from the textareanativeInputValueSetterThis produces persistent GitHub CDN URLs that render correctly in markdown. The user must be logged into GitHub in Chrome for this to work.
See .claude/agents/playwright-e2e-pr-updater.md for the full step-by-step Chrome DevTools upload workflow.
Return a markdown table suitable for embedding in a PR description:
| Test | Recording |
|------|-----------|
| Admin can see the BAIPropertyFilter |  |
| Admin can filter by name |  |
development
Find WebUI dev server address and Backend.AI API endpoint/credentials for testing. Trigger on: "which server", "connection info", "login credentials", "dev server URL", "API endpoint", "where to connect", "how to login", "test server", or when needing to interact with the running WebUI (screenshots, live checks, E2E).
tools
GraphQL/Relay integration patterns for Backend.AI WebUI React components. Covers useLazyLoadQuery, useFragment, useRefetchableFragment, fragment architecture (query orchestrator + fragment component), naming conventions, modern directives (@required, @alias), client directives (@since, @deprecatedSince, @skipOnClient), and query optimization.
data-ai
Create Relay-based infinite scroll select components extending BAISelect. Supports name-based values (usePaginationFragment) and id-based values (useLazyLoadQuery + useLazyPaginatedQuery) with search, optimistic updates, and multiple selection modes.
tools
Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with web pages, fill forms, take screenshots, test web applications, or extract information from web pages.