yliust/tactile/tactile-windows
Claude Code and agent skill by yliust/tactile
- community
Checking that the SKILL.md file is still in the repository.
Operate and diagnose local Windows apps through Tactile's Windows UI Automation harness. Use when Codex/Tactile needs to list or open Windows apps, inspect UIA trees, run targeted OCR, click/type/scroll, send keyboard shortcuts, execute bounded observe-plan-act workflows, or debug Windows desktop app flows for WeChat, Feishu/Lark, chat apps, Office, Electron apps, and sparse UIA surfaces.
Install
npx vskill@latest install yliust/tactile/tactile-windowsSKILL.md
Tactile Windows
Use this skill to inspect and operate local Windows applications through UI Automation, input events, targeted OCR, and bounded observe-plan-act workflows.
Requirements
- Run on Windows with a working Python 3.11+.
- The Windows UI Automation runtime is bundled at
vendor/WindowsUseSDK; no separate WindowsUseSDK checkout is required for a normal clone. - Pass
--repo <path>or setWINDOWS_USE_SDK_ROOTonly when intentionally testing a different WindowsUseSDK checkout. - For LLM-driven workflows, install the optional Python dependencies from
pyproject.tomland setTACTILE_OPENAI_API_KEY; optionally setTACTILE_OPENAI_BASE_URLandTACTILE_MODEL.
Primary CLI
Use the skill-local CLI from this directory:
PowerShell can also call:
The CLI wraps scripts/windows_interface.py, which uses the bundled vendor/WindowsUseSDK/WindowsUseSDK.ps1 by default. This skill keeps Tactile-specific guidance, app guides, and session-scoped artifacts next to the Windows command surface.
App Resolution Rule
When the user asks to operate an app, resolve the target from installed apps or current top-level windows before acting. Do not rely only on a display name, because window titles, localized names, executable names, app IDs, and multiple windows can differ.
Prefer compact discovery and keep the returned hwnd, frame, title, and process information for subsequent commands:
For multi-window tasks, re-list or re-observe after a dialog, popup, child process, login window, media viewer, or secondary app window appears.
Core Workflow
- Resolve and activate the target app/window with
list-apps,open, orobserve. - Start every multi-step task with structured observation:
elements --target <app>orobserve <app>. - For sparse Electron/WebView apps, run
elements --view rawbefore OCR. Raw UIA paths can still be used byuiaandocr. - Use the observation priority
UIA > targeted OCR/probe > workflow visual context > raw coordinates. Do not use screenshots as the primary reasoning path. Visual inspection of screenshots or OCR capture images is the last resort: use it only after UIA, focused probes, and targeted OCR cannot answer the question, keep the crop tight, and name why the fallback was needed. - Treat every click, keypress, text input, scroll, and wait as a single-action boundary. Re-observe before deciding the next action.
- For high-risk external actions such as sending messages, posting comments, payments, destructive edits, account changes, and form submissions, split the task into locate, draft/open controls, verify, submit.
- Before final submit/send, verify the active window, target recipient/context, and draft/action state from the latest observation or targeted OCR.
- If permissions or platform limits block automation, report the specific Windows/UIA/OCR limitation and what was verified instead.
CLI Examples
Fast App Paths
- Use
wechat-send-messagefor routine WeChat contact/group messaging only after the current WeChat session has a verified search-focus path, or when the intended chat is already open and the flow can skip searching. The helper resolves WeChat once, computes frame-relative profile regions, selects any existing compose draft before pasting, uses direct Win32 input by default, focuses the compose area, presses Enter to send, and writes one JSON result. For routine short messages, prefer--require-title-match --no-draft-ocrso the command performs one targeted recipient check and avoids the slower, less reliable compose OCR pass. - For a routine WeChat send, do not spend time on broad discovery once
open 微信returns a visible main window with a validhwndandframe.list-appsmay surface minimized/offscreen auxiliary WeChat windows such as media viewers; ignore those afteropenrecovers the main chat window. Skipdry-run, extraartifact-dir, and repeatedobserve/elementspasses unless the main window, focus path, or recipient state is ambiguous. - Do not split WeChat sends into
wechat-send-message --draft-onlyfollowed by a manualinput keypress enter. The helper's contact-search Enter is not a harmless navigation action if focus missed the search box; it can send the contact name into the currently open chat, and a later title check can still pass when that chat is already the target. If the user asks to draft only, stop after the draft and report that it is prepared. If the user asks to send, use one verified send path rather than a helper draft plus a separate submit. - Before typing a WeChat contact name into search, check whether the intended chat is already open. If targeted title verification already matches the recipient, skip search entirely and operate only on the compose area. Never paste the recipient/search token into the UI unless the latest UIA observation or targeted probe confirms the search field is focused; in sparse WeChat UIA, a click on the profile search center followed by the search placeholder disappearing/clearing in a targeted probe is enough focus evidence for a routine helper send.
- For WeChat send verification, prefer structured state and targeted UIA/probe checks over broad visual fallback. Screenshots/OCR are supporting evidence only; if focus, active chat, or draft state is uncertain, stop or re-locate through UIA/profile regions instead of pressing Enter.
- For WeChat read-and-reply tasks, treat message reading as content extraction rather than send verification. First verify the active chat title, then use the latest frame-relative message-region OCR crops. If the OCR text is unreadable, retry with a tighter line-specific crop or a UTF-8 readback of the saved OCR JSON before opening an image. Inspect the OCR capture image only when the reply depends on exact content and text extraction is still semantically ambiguous.
- For important WeChat messages that contain meeting links, meeting numbers, or other must-preserve details, prefer a single-line message or send short sequential messages. Some shells and chat controls can treat multiline CLI arguments as separate input; verify the final visible chat content, not only command success.
- Do not add a separate
dry-run, manual character-code check, or extra OCR pass for routine user-supplied Chinese text. Console rendering may show mojibake even when JSON and Python strings are correct; treatstatus: successplustitle_verification.matched: trueas the result signal, and only investigate encoding if the JSON bytes/value are wrong when read as UTF-8. - Distinguish console mojibake from OCR corruption. If
Get-Contentor PowerShell output shows Chinese as mojibake, re-read the saved JSON with an explicit UTF-8 path (Get-Content -Encoding UTF8or another UTF-8 byte reader) before assuming the action or OCR failed. If the UTF-8 JSON itself contains mojibake-like OCR text while the crop image is readable, treat that OCR text as corrupted for exact message reading and do not base a semantic reply on it. - Use
--draft-onlyonly when the user asks to prepare without sending or the message contains high-value details that need human-visible review. Use--dry-runto inspect computed regions without typing,--sdk-inputwhen direct Win32 input is blocked,--keep-existing-draftonly when intentional,--send-method buttononly when Enter is known not to send in that WeChat setup, and--require-draft-matchonly when compose OCR reliably returns readable text for the current language. - For unsupported WeChat flows such as Moments, comments, media viewers, or unusual popups, fall back to the manual observe-plan-act workflow in
references/app-guides/WeChat.md. - For Tencent Meeting scheduling, read
references/app-guides/Tencent-Meeting.md. Treat schedule, time-picker, and invitation dialogs as separate windows; after invoking预定会议, re-runlist-apps --query wemeetappbefore retrying clicks in the main window. - Use
feishu-switch-orgbefore Feishu/Lark messaging when the user names an account or organization, then usefeishu-send-message --draft-onlyfor risky or first-time sends. Feishu search must choose a verified contact/result title row from OCR, not a row where the target only appears in包含..., group-message metadata, search history, or snippets.feishu-send-messageautomatically retries Enter against the compose-areaChrome_RenderWidgetHostHWNDchild when the top-level Feishuhwndleaves the draft visible. If doing the fallback manually, do not reopen the chat or paste again; use the childnative_window_handle, click the verified compose area, sendinput keypress enter --hwnd <child-hwnd>, and verify the compose placeholder or cleared draft. Seereferences/app-guides/Feishu-Lark.mdfor the detailed fallback.
UIA, OCR, And Coordinates
- Prefer
uia click <hwnd> <uia_path>for click-like actions. It resolves the element and clicks the current center from UIA data. - Prefer
uia focus,uia select, oruia invokeonly when that semantic action is the goal or known to work for the app. - Use
probewhen one candidate control is ambiguous. It combines UIAFromPointwith a local OCR crop. - Use OCR only after UIA is insufficient. Prefer targeted OCR with
--hwnd + --uia-path,--hwnd + --rect, orprobe; whole-window OCR is a fallback. - Use
input clickonly from a fresh UIA element center, OCR result center, app-guide profile region, or same-window frame-relative calculation. - Do not reuse absolute coordinates across app activation, restore, monitor move, DPI scaling change, popup creation, or window resize.
- If a UIA action returns success but the visible state does not change, treat success as inconclusive. Re-observe, then use one current center-coordinate fallback only if the action is low risk.
Text Input
- Prefer
input streamtextorinput writetextfor normal typing. They use real input events and do not borrow the clipboard. - Use
input pastetextfor long text, multiline content, WeChat Chinese input, or when Unicode streaming fails. - After text entry into search, compose, or form fields, re-observe or use targeted OCR to require the expected text or resulting state before submit.
- If the current observation already shows the intended text in the correct target field, do not write it again. Submit, finish, or clear and replace only when the visible text is wrong.
Workflow Mode
Use workflow for multi-step work. The bundled WindowsUseSDK includes workflows/llm_app_workflow.py:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/tactile-windows/SKILL.md
Popularity
- Repository stars
- 614
- Repository forks
- 13
- 7-day trend score
- 32
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 2 Aug 2026, 2 months ago.
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/yliust/tactile/tactile-windows)