Triggered when the user asks the AI to directly operate their macOS desktop: open an app, click a button, fill a form inside a native window, read what's currently on screen, automate a local GUI flow. Typical phrasing: "in Finder, please…", "click X in the Y app", "what's on my screen right now". **Available only in OpenLoaf Desktop (macOS)**; other platforms return a desktop-only error — fall back to `BrowserAct` or hand the task back to the user. **Not for**: in-page web interaction (→ `browser-ops-skill`), local file I/O (→ `Read`/`Edit`/`Write`).
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Do not see an app and immediately click. When a human opens an unfamiliar app they look around first — they notice which region is business UI, where the close button is, what entry points exist. You have to do the same.
Three-phase framework:
1. Survey → MacosSurvey(app) — get a mental model of the app
2. Plan → pick a path from the "Recommended path order" the survey gives you
3. Act+Verify → MacosAct executes; MacosObserve confirms the resultSkipping Survey and going straight to Act is the single most common failure mode. WeChat / QQ / Feishu / DingTalk / Teams are self-drawn — their AX tree exposes only 3 window chrome buttons (close / min / zoom). A model that guesses path=["0","0"] lands on the red close button and kills the window. Survey will tell you in advance when you're in that trap.
| Tool | When |
|---|---|
MacosSurvey(app) | First call for every new app in a session. Returns the mental model: known intents, AX richness, menu bar map, window list, recommended path order. Cached per session × app for 5 minutes. |
MacosObserve(appFilter?) | Look at the current UI state — screenshot + AX tree + window list. Use after Survey and after every MacosAct to verify the result. |
MacosAct | Execute an action. Supports intent / launch_app / menu_click / applescript / key / click / type / scroll / drag / wait / ax_action. |
MacosListWindows(appFilter?) | Lighter than Observe — just enumerate windows. Useful when you need a specific window in a multi-window app. |
MacosCaptureWindow(windowID) | Screenshot a specific window by id; covered / off-screen / minimized windows still capture (Window Server keeps the composition buffer). |
All tools are desktop-only. They aren't registered off-macOS; don't try to call them.
MacosSurvey's response contains a Recommended path order section, highest confidence first:
1. Known intents MacosAct type="intent" 100% confidence
2. Menu navigation MacosAct type="menu_click" works on self-drawn apps too
3. Keyboard shortcut MacosAct type="key" read the shortcut from the menu tree
4. AX path click MacosAct type="click" ref=... only when Survey verdict is ax-rich
5. Coord click MacosAct type="click" point=... last resort, read pixels off a screenshotGo down the list in order. Never skip ahead. On apps classified self-drawn, step 4 is off-limits — AX path clicks on window chrome buttons are refused (you'll get WINDOW_CHROME_BLOCKED).
App: 微信 (WeChat.app) (com.tencent.xinWeChat, pid=86795)
AX profile: self-drawn — AXWindow children are only chrome buttons
richness: 0.995 (203 nodes)
windowChildRoles: [AXCloseButton, AXFullScreenButton, AXMinimizeButton]
Known intents (from registry):
- id: open_moments — Open Moments feed
- id: open_chats — Switch to chats tab
- id: open_discover — Open Discover tab
...
Menu bar (34 entries with shortcuts, sample):
- File > Lock WeChat (⌘L)
- View > Chats (⌘1)
- View > Moments (⌘⇧4)
...
Windows (2):
- windowID=227474 visible 1060×859 "Weixin" (main)
- windowID=260481 hidden 710×831
Recommended path order:
1. Known intents (highest confidence): MacosAct type="intent" — 5 registered
2. Menu navigation: MacosAct type="menu_click" — 34 reachable entries
3. Keyboard shortcut: MacosAct type="key"
4. AX path click: **DO NOT USE** on this app.
5. Coordinate click: last resort."Known intents" are paths that have been vetted for you. Use them first.
1. MacosAct { type: "launch_app", app: "WeChat" }
2. MacosSurvey { app: "WeChat" }
→ sees Known intents contains open_moments
3. MacosAct { type: "intent", app: "WeChat", intent: "open_moments" }
4. MacosObserve { appFilter: "WeChat" } — verify Moments is showingDo NOT observe + click AX tree right after launch_app. That's the old path, and it lands on the close button.
1. MacosSurvey { app: "Safari" }
→ Known intents has open_url (requires url arg)
2. MacosAct { type: "intent", app: "Safari", intent: "open_url", args: { url: "https://github.com" } }
3. MacosObserve { appFilter: "Safari" } — verify the page loadsUser asks "what's on my screen / what's in this app": one MacosObserve call — use the screenshot + AX tree to answer. No Survey, no Act needed.
Survey returns ax-rich but no matching intent. Prefer menu_click or key, then AX path click:
1. MacosSurvey { app: "Finder" } → ax-rich; recommends menu_click / AX path click
2. Want a new Finder window → menu bar shows "File > New Finder Window (⌘N)"
3. MacosAct { type: "key", keys: ["cmd", "n"] } — shortcut beats click
4. MacosObserve to verify1. MacosSurvey { app: "WeChat" } → Windows: 2 entries, windowIDs 227474/260481
2. MacosCaptureWindow { windowID: 227474 } — capture the main window directly (even if preview covers it)
3. Subsequent MacosAct click coords are now based on that window's image1. MacosObserve { appFilter: "..." } to get the text field ref
2. MacosAct { type: "click", ref: { app, path: [...] } } to focus
3. MacosAct { type: "type", text: "..." }
4. MacosAct { type: "ax_action", ref: { app, path: [submit button] }, action: "AXPress" }
5. MacosObserve to verifyMenu bar section — almost every app's menu bar is menu_click-able(⌘⇧X), MacosAct type="key" is more reliable than clickintent / menu_click, if no further action is needed you can skip the verify.ax-rich apps. mixed = cautious; self-drawn = forbidden — chrome buttons are hard-blocked (WINDOW_CHROME_BLOCKED).BrowserAct or hand back.First call prompts for missing permissions; the server auto-opens the matching System Settings pane. Required:
screen — Screen Recording (Survey / Observe / CaptureWindow all need it)accessibility — Accessibility (AX tree + synthetic input)Some system-level apps need an OpenLoaf Desktop restart after granting.
point.{x,y} refers to pixels on the most recent MacosObserve or MacosCaptureWindow screenshot — read them straight off the image. The tool converts to screen coords automatically; you don't handle retina scale, window offset, or multi-display yourself.
Screenshot: window 2120×1718 px line in observe/capture_window output is the coordinate rangepermissionsMissing → settings pane already opened, prompt user, waitdesktop-only → not running under OpenLoaf Desktop; switch platformsWINDOW_CHROME_BLOCKED → you clicked a chrome button. Pick one of the 4 suggested fallbacks (menu_click / key / coord / URL). Do NOT add confirm_window_chrome:true unless you really do mean to close the window.MacosSurvey to list available intents; otherwise degrade to menu_click.key cmd+tab back first.a1ab5be
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.