meituan-longcat/wbench/happy
Claude Code and agent skill by meituan-longcat/wbench
- community
Checking that the SKILL.md file is still in the repository.
Automate happyoyster.cn/create benchmark runs. Use when the user asks to run a case on Happy Oyster (e.g. "run case_XXX on happy", "用happy跑case_XXX"). Fully JS-driven (fetch + DataTransfer for image upload, no pyautogui coordinates).
Install
npx vskill@latest install meituan-longcat/wbench/happySKILL.md
Happy Oyster Benchmark Automation
Automates one benchmark case on https://www.happyoyster.cn/create. Input: case_<id>.json from the dataset's cases/ directory. Output: happy_video/case_<id>.mp4 under the repo root.
Paths below assume the repo is checked out and cd-ed into. Replace <repo> with the absolute checkout path when calling scripts from a non-repo cwd.
Key insight
happyoyster.cn does NOT enforce Private Network Access (unlike Project Genie). fetch('http://127.0.0.1:18888/...') works from the page, so images upload via DataTransfer — no native file dialog, no pyautogui coordinates, no window-handle juggling. Every interaction is a single browser-automation call.
Prerequisite
The local HTTP server must be running, serving the directory that contains the dataset's images/ tree. From the repo root:
Verify:
Should return 200.
Before each new case
Kill any leftover `auto_interact.py` process before navigating to /create. Stale key-press processes will leak into the next world.
Workflow
1. Navigate & inject prompt
For open-world navigation cases, append no obstacles, move freely to the environment clause — Happy Oyster otherwise tends to spawn blocking geometry.
2. Upload image (fetch + DataTransfer)
Use the path in settings.initial_image (the public dataset has no perspective subdirs). Wait ~1s, then screenshot to verify a thumbnail appears in the Image slot.
3. Flip perspective if first_person
Default is Third person. If the case is first_person, click the toggle once:
4. Click send
Small (~36×36) unlabeled icon button in the bottom-right of the prompt bar. Find by geometry, not pixel coordinates:
URL changes to /explore/wander/.... Recording auto-starts with a ~55s timer.
5. Start auto_interact in background
Start immediately once the URL leaves /create — the script internally waits for t2.png to appear before sending keys.
happy_oyster/t2.png— single "A" key template (not Genie3's WASD clustert.png).3— seconds per turn. Recording is time-limited so don't bump this above 4.
6. Wait for recording to end
Poll the active tab every ~10s until the URL transitions from /explore/wander/... to /end/travel/.... Typical duration: ~90-100s total from send to end (30-60s world generation + ~55s recording).
If the page shows 99% loading text for more than ~2 minutes without showing REC, navigate back to /create and retry from step 1.
7. Download
A "Download options" modal appears. Select "Without BGM", then click Download in the modal:
A "Preparing download..." banner shows at the top. Server rendering takes 20-60s.
8. Move file
File downloads to ~/Downloads/ as <world_title>.mp4 (e.g. CanineUrbanPulse.mp4, The Corinthian Archive.mp4). Find the newest non-Genie* mp4 and move:
9. Update progress
Optional — if you maintain a happy_progress.json:
Things that do NOT work (and why)
- pyautogui coordinate clicks: Unreliable. Multiple Chrome windows for the same tab can coexist; their rects change when
SW_RESTOREfires; the Image button's screen position varies with toolbar height, DevTools state, and window maximization. Use the JS-only flow instead. - `mcp__claude-in-chrome__upload_image`: Only accepts
imageIdfrom prior screenshots, not disk paths. - Inline base64 injection: A 500 KB image is ~680 KB of base64 — too long to paste into a single JS-evaluation call.
Gotchas
- Recording is a fixed ~55s timer. With
KEY_DURATION=3, cases with >15 navigation turns won't fit. - The "Without BGM" click must land on the parent
<div>, not the inner text node — walk up to the first DIV/BUTTON ancestor. - After download, the URL stays at
/end/travel/.... Navigate fresh to/createfor the next case. - Different cases produce different world_title names — find by "newest non-Genie mp4" rather than an expected filename.
Files referenced
auto_interact.py— shared keyboard driver (accepts template path as 2nd arg, turn duration as 3rd)happy_oyster/t2.png— Happy Oyster single-"A" key template (~636 bytes)serve.py— local HTTP server with CORS + Private Network Access headershappy_video/— output directory (create if missing)
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingsrc/models/action/web/.claude/skills/happy/SKILL.md
Popularity
- Repository stars
- 157
- Repository forks
- 7
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/meituan-longcat/wbench/happy)