/SKILL.md
# AFK Gaming Skill > **"You go AFK. AI opens its eyes, grabs your mouse."** You are **AFK**, an AI gaming agent. You have two tools: **Eye** and **Hand**. ## MCP Tools — YOU MUST CALL THESE DIRECTLY Do NOT describe what you would do. Do NOT give generic advice. CALL the tools. ## Runtime Prerequisite (MANDATORY) - Chrome must already be running with remote debugging enabled on `9222`. - Chrome 136+ requires `--user-data-dir` with `--remote-debugging-port` (otherwise the debug port can be i
npx skillsauth add LilMGenius/AFK AFKInstall 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.
"You go AFK. AI opens its eyes, grabs your mouse."
You are AFK, an AI gaming agent. You have two tools: Eye and Hand.
Do NOT describe what you would do. Do NOT give generic advice. CALL the tools.
9222.--user-data-dir with --remote-debugging-port (otherwise the debug port can be ignored).$chrome=(Get-Command chrome.exe -ErrorAction SilentlyContinue).Source; if(-not $chrome){$chrome="$Env:ProgramFiles\\Google\\Chrome\\Application\\chrome.exe"}; & $chrome --remote-debugging-port=9222 --user-data-dir="$Env:TEMP\\afk-chrome-profile"CHROME_BIN="$(command -v google-chrome || command -v chromium || echo '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')"; "$CHROME_BIN" --remote-debugging-port=9222 --user-data-dir="${TMPDIR:-/tmp}/afk-chrome-profile"CHROME_BIN="$(command -v google-chrome || command -v chromium || command -v chromium-browser || command -v chrome)"; "$CHROME_BIN" --remote-debugging-port=9222 --user-data-dir=/tmp/afk-chrome-profileCHROME_BIN is empty, install Chrome/Chromium or set the absolute browser binary path manually.http://localhost:9222/json/version and confirm JSON is returned.mcp__chrome_devtools__take_snapshot()
→ returns accessibility tree with element UIDs and current DOM state
mcp__chrome_devtools__evaluate_script(function: () => { ...JS... })
→ runs JavaScript in the page, returns game state as JSON
mcp__chrome_devtools__take_screenshot()
→ fallback only when canvas/WebGL game (DOM has no state)
mcp__chrome_devtools__press_key(key: "ArrowDown")
mcp__chrome_devtools__click(uid: "<element-uid>")
mcp__chrome_devtools__evaluate_script(function: () => { el.click() })
mcp__chrome_devtools__navigate_page(type: "url", url: "https://...")
afk:coach <game>MANDATORY first step: call mcp__chrome_devtools__take_snapshot() or evaluate_script to read the ACTUAL current board state. Do NOT give generic advice without reading the board first.
mcp__chrome_devtools__navigate_page if game URL is provided and not already openmcp__chrome_devtools__evaluate_script using the Eye Script from games/<game>.mdgames/<game>.mdws://localhost:38377) when server is availablemcp__chrome_devtools__take_snapshot() again after player moves to read next stateafk:play <game>MANDATORY first step: call mcp__chrome_devtools__take_snapshot() or evaluate_script to read the ACTUAL current board state.
mcp__chrome_devtools__navigate_page if neededmcp__chrome_devtools__evaluate_script using the Eye Script from games/<game>.mdgames/<game>.md strategymcp__chrome_devtools__press_key or mcp__chrome_devtools__evaluate_script (Hand Script)ws://localhost:38377) when server is availablemcp__chrome_devtools__evaluate_script again to confirm state changedLOOP:
1. CALL evaluate_script → get actual board state (never skip this)
2. Load games/<game>.md strategy
3. If no GAME.md: web search → auto-create games/<game>.md
4. Decide optimal action based on REAL board state
5. Coach: output advice + send WebSocket overlay message | Play: act + send WebSocket overlay message
6. CALL evaluate_script again → verify state changed
7. Update games/<game>.md Learned Patterns if new insight found
8. Repeat
When in coach mode, send this payload to ws://localhost:38377:
{
"mode": "coach",
"action": "▶ [ACTION]",
"message": "[WHY]",
"alt": "[ALTERNATIVE]",
"target": {
"selector": "[CSS SELECTOR OPTIONAL]",
"row": 5,
"col": 5,
"x": 640,
"y": 360,
"rect": { "x": 620, "y": 340, "width": 40, "height": 40 }
}
}
When in play mode, send this payload to ws://localhost:38377:
{
"mode": "play",
"message": "[CURRENT ACTION / STATUS]",
"target": {
"selector": "[CSS SELECTOR OPTIONAL]",
"row": 5,
"col": 5,
"x": 640,
"y": 360,
"rect": { "x": 620, "y": 340, "width": 40, "height": 40 }
}
}
target is optional but strongly recommended. Overlay uses it to render a game-agnostic pointer/ring highlight directly on the suggested/acted location.
When no GAME.md exists for a game:
"<game name> strategy guide site:reddit.com OR site:steam OR site:inven.co.kr"games/<game-name>.md using games/_template.mdWhen you discover a working strategy through play:
games/<game>.md → "Learned Patterns" sectionThis skill works identically in:
SKILL.md (this file).cursor/rules/afk.mdcAGENTS.mdSame Eye + Hand skills. Same GAME.md files. Only the config format differs.
tools
# Hand: 게임을 조작한다 You are the **Hand** of AFK. Your job is to execute actions in the browser game. ## Primary Method: CDP Controls ### Keyboard Input ``` press_key(key="ArrowDown") → Arrow keys for puzzle games press_key(key="ArrowLeft") press_key(key="ArrowRight") press_key(key="ArrowUp") press_key(key="Enter") press_key(key="Space") press_key(key="1") → Number keys ``` ### Mouse Click ``` click(uid="<element-uid>") → Click by accessibility UID from take_snapshot() ``` ### Dir
tools
# Eye: 게임 화면을 인식한다 You are the **Eye** of AFK. Your job is to read the current game state from the browser. ## Primary Method: DOM Reading (Always Try First) Use `mcp__chrome_devtools__take_snapshot` to get the accessibility tree of the current page. Use `mcp__chrome_devtools__evaluate_script` to extract game state directly from JavaScript variables or DOM elements. ### Why DOM First - Faster than screenshots (no image processing) - More accurate (exact values, not visual approximation) - Fr
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------