desktop
Skill2 starsChanged 9 days agoApache-2.0View on GitHub
Operate desktop apps through the OS accessibility tree with agent-desktop: read a window as a short table of controls, click, fill, toggle, pick menu items, read values, manage windows, without taking the mouse or the foreground. Use when a task needs a native app's GUI: "click in the app", "fill the dialog", "what does the window show", "press the button in X", "automate this program", "check the setting in the app", "close the popup"; and when an app has no command line or API for what is needed. Websites are `browser`. An app with its own MCP server or scripting API (an editor, a 3D tool) goes through that first. Pixel-only surfaces (games, canvases, remote screens) are the harness's screenshot computer use.
9 other projects use a version of this.
Adopted by
Most recently taken up by
- lobehub/lobehubtheir own version, first seen Nov 5, 2026
- outof-place/claude-acctheir own version, first seen Oct 15, 2026
- gridaco/gridatheir own version, first seen Oct 8, 2026
- lobehub/lobe-chattheir own version, first seen Oct 8, 2026
- uvwt/agentdock-skillstheir own version, first seen Aug 30, 2026
- Aster110/mycctheir own version, first seen Aug 6, 2026
Used with
Projects with it also use cli and testing.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
tieroSkillcli
Also in 4 projects that use this
NVIDIASkilltesting
Run Python and Rust tests for physicsnemo-curator using uv + pytest with coverage reporting via pytest-cov, and cargo-nextest for Rust tests. Includes benchmark workflows with pytest-benchmark and criterion.
Also in 3 projects that use this
Other versions9 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 9
- lobehub/lobe-chat★ 84ksame name
- lobehub/lobehub★ 84ksame name
- gridaco/grida★ 2.7ksame name
- Aster110/mycc★ 165same name
- uvwt/agentdock-skills★ 6same name
- outof-place/claude-acc★ 2same name
- zjl4616/feishu-claude-code★ 2same name
- bagaswap111/usability-heuristics-skill★ 0same name
- muxammadmamajonov/dot-claude★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository20 other files it gives its agents.
- browserSkill
- clean-memorySkill
- codebase-designSkill
- commitSkill
- graphicsSkill
- grillingSkill
- implementSkill
- latexSkill
- memory-reviewSkill
- mistakeSkill
- notesSkill
- pdfSkill
- routerSkill
- setupSkill
- skill-quality-suiteSkill
- tddSkill
- to-specSkill
- to-ticketsSkill
- vault-indexSkill
- videoSkill
The file
Files
desktop
Engine: agent-desktop (Apache-2.0, Vercel Labs), a
native CLI that reads UI Automation on Windows, AX on macOS and AT-SPI on Linux and prints one JSON
envelope per command. This skill adds scripts/ad.py, a stdlib wrapper: the tree as one line per
control, bare refs, a change report after every action, and a guard before overwriting text. No
agent-desktop code is copied. Install and what was checked: references/setup.md.
Script first, the GUI is reconnaissance
A GUI run is the slow, fragile way. Before opening a window, look for the app's own route: a CLI flag, a config file, a scripting API, an MCP server. Use the GUI for what has no other way, or to find out how the app does something so a script can do it next time.
| Task | Tool |
| The app has a CLI, config file, scripting API or MCP server for it | that, not the GUI |
| A native window: buttons, dialogs, settings, forms, menus, tray | this skill |
| A website | browser |
| No accessibility tree (a game, a canvas, a remote desktop) | screenshot computer use |
Running
uv run --no-project "${CLAUDE_PLUGIN_ROOT}/skills/desktop/scripts/ad.py" windows
uv run --no-project "${CLAUDE_PLUGIN_ROOT}/skills/desktop/scripts/ad.py" snap --app CalculatorApp.exe
uv run --no-project "${CLAUDE_PLUGIN_ROOT}/skills/desktop/scripts/ad.py" act click e34
uv run --no-project "${CLAUDE_PLUGIN_ROOT}/skills/desktop/scripts/ad.py" raw get e6 --property valuesnap prints eN role 'name' =value [states]; a bare e34 means that ref in the last snapshot.
act <action> eN [args] runs any ref action (click, set-value, clear, toggle, check,
select, expand, scroll-to ...), re-reads the same scope and prints what changed: - lines
gone, + lines new with their fresh refs, or nothing changed. Anything else goes through raw
with refs expanded. Flags after the arguments reach agent-desktop unchanged (--root e3,
--timeout-ms 30000, --window-id w-123). Full command semantics: agent-desktop skills get
desktop and agent-desktop skills get platform, which always match the installed binary.
Loop
windows: find the window and the app name to pass to--app.snap --app NAME: the controls. A big app:snap --app NAME --skeleton, thensnap --root eNinto one region.--allkeeps static text (labels of repeated rows).act ACTION eN: read the change report. It is the verification: a click whose report saysnothing changeddid nothing visible.- Repeat from 2 only when the report does not show the refs you need next.
Rules learned from runs
The window's app name is not the name you launched. launch calc answered calc.exe, the
window belongs to CalculatorApp.exe, and list-apps did not list Calculator at all (Windows 11,
03.11.2026). Take the name from windows, which reads windows, not processes.
close-app knows only list-apps names. It answered APP_NOT_FOUND for CalculatorApp.exe.
Close such a window you opened with its own close button (act click on 'Close ...'); the
report then says the window is gone.
A new window can hold the user's own document. launch notepad on Windows 11 reopened every
tab of the user's previous session, and the editor field held their file. act set-value,
clear and type refuse a field that already holds text and print what is in it; pass
--overwrite only when the user named that field or document. A text field you mean to fill
starts empty: if it does not, you are in the wrong place.
An element whose value lives in its name goes stale after it changes. Calculator's display is
statictext 'Display is 7'; after a click its old ref returned STALE_REF, because a ref is
identified by role and name. Read the result from the change report or a fresh snap, not with
get on the old ref.
Headless by default, and keep it. Ref actions use accessibility calls: no cursor, no focus
steal, no keystrokes into whatever window is in front. Calculator computed 7 + 8 with the user's
foreground untouched. --headed (physical mouse and keys, needed for type, hover, drag,
double-click on Windows) only with the user's explicit yes for that run, never as a retry after a
headless failure. Synthetic keys landing in the wrong window is how one session deleted every clip
on a video timeline: select-all and Backspace went to the main window instead of a panel.
Retry only what was not delivered. Each result carries delivery; an error prints
retry=safe only for not_delivered. Anything else may have landed: read the state, then decide.
A second click can submit twice, a second toggle undoes the first.
An app running as administrator cannot be driven from a normal terminal. Windows blocks the
input (PERM_DENIED, E_ACCESSDENIED); a window title with [Admin] is the hint. Reading still
works. Do not elevate on your own: tell the user.
Irreversible controls need the user's yes. Send, delete, submit, pay, accept terms, save over a file: name the control and what it will do, and wait for an answer in chat, as with any action on their behalf.
Chromium and Electron apps start nearly empty. The first read starts the renderer's
accessibility and returns a fraction of the tree; a cold app takes 10-25 s (agent-desktop docs, not
measured here). Pass --timeout-ms 30000 before concluding a control is missing.
Never
- Solve a CAPTCHA, a sign-in challenge or a UAC prompt. The secure desktop is unreachable anyway; hand the window to the user.
- Type passwords, keys or payment details into a field.
- Close an app the user had open before the run (
close-app), or one with unsaved work.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

