PluginWorld
Sw

swift-auto-gui

Claude Code✓ SPEC VERIFIED

A Swift library for macOS automation — mouse, keyboard, screenshots, image recognition, and AI-powered agents.

@NakaokaRei · MIT · updated 3d ago

SECURITY

A

SCORE

87

STARS

93

PLUG IN

/plugin marketplace add NakaokaRei/SwiftAutoGUI

Then run /plugin install <name> for any plugin it lists

README

SwiftAutoGUI

SPM is supported Github issues Github forks Github stars Github top language Github license

A Swift library for macOS automation — mouse, keyboard, screenshots, image recognition, and AI-powered agents.

This repository is inspired by pyautogui.

Demo

AI Agent that autonomously observes the screen and executes actions to achieve a goal.

sagui agent "Open Safari and search for Swift"

Demo: sagui agent

Requirements

  • macOS 26.0+
  • Swift 6.0+

Installation

Swift Package Manager

SwiftAutoGUI is available through Swift Package Manager.

in Package.swift add the following:

dependencies: [
    // Dependencies declare other packages that this package depends on.
    .package(url: "https://github.com/NakaokaRei/SwiftAutoGUI", branch: "master")
],
targets: [
    .target(
        name: "MyProject",
        dependencies: [..., "SwiftAutoGUI"]
    )
    ...
]

Homebrew (sagui CLI)

The sagui command-line tool is available via the Homebrew tap:

brew install NakaokaRei/tap/sagui

After install, grant Accessibility permission to your terminal in System Settings → Privacy & Security → Accessibility.

sagui --version
sagui key list
sagui key shortcut return
sagui mouse click --x 100 --y 200
sagui mouse click --right --x 100 --y 200

Optional Chromium CDP backend

Quick start: Browser Agent guide

SwiftAutoGUIBrowser adds semantic automation for an existing Chrome, Edge, or other Chromium debugging session. It is a separate product, so applications that use only native macOS automation do not acquire browser-specific code.

Add the optional product to the client target:

.target(
    name: "MyProject",
    dependencies: [
        .product(name: "SwiftAutoGUI", package: "SwiftAutoGUI"),
        .product(name: "SwiftAutoGUIBrowser", package: "SwiftAutoGUI")
    ]
)

Start Chromium with a dedicated profile and a loopback debugging port. Chrome 136 and later do not honor remote debugging against the default profile.

"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing" \
  --remote-debugging-port=9222 \
  --user-data-dir=/tmp/swift-auto-gui-browser-profile

Connect with an explicit navigation allowlist:

import SwiftAutoGUI
import SwiftAutoGUIBrowser

let browser = try await BrowserSession.connect(
    endpoint: URL(string: "http://127.0.0.1:9222")!,
    securityPolicy: BrowserSecurityPolicy(
        allowedDomains: ["example.com", "*.example.org"]
    )
)

let observation = try await browser.observe()
print(observation.formattedContext)

let apiKey = ProcessInfo.processInfo.environment["OPENAI_API_KEY"]!
let browserAgent = Agent(
    backend: OpenAIVisionBackend(apiKey: apiKey),
    automationBackend: browser
)

The browser Agent is intentionally browser-only: native app, window, AX-label, and coordinate mouse actions fail as unsupported instead of falling back to Accessibility or CGEvent. Stale DOM elements also fail safely without clicking a saved coordinate. Cross-origin navigation and downloads require a BrowserActionAuthorizing implementation; without one they are denied.

The sagui CLI supports deterministic CDP commands as well as the browser-only Agent:

sagui browser tabs
sagui browser observe --tab-id TARGET_ID
sagui browser click --tab-id TARGET_ID --role link --name "Issues" --domain github.com
sagui browser agent "Open issue 118" --domain github.com --allow-cross-origin

Example Usage

For complete API and module documentation, see the SwiftAutoGUI DocC site.

AI Agent

SwiftAutoGUI includes an Agent that can autonomously observe the screen, reason about what it sees, and execute actions in a loop until a goal is achieved. This follows the ReAct (Observe → Think → Act) pattern using a vision-capable LLM.

import SwiftAutoGUI

let backend = OpenAIVisionBackend(apiKey: "sk-...", model: "gpt-5.6-sol")
let agent = Agent(
    backend: backend,
    maxIterations: 15,
    visionMode: .automatic
)

let result = try await agent.run(goal: "Open Safari and search for Swift")
print("Completed: \(result.completed), Steps: \(result.iterationsUsed)")

The CLI prints the effective reasoning effort when it starts and the model-provided reasoning summary for every agent step:

sagui agent "Open Safari and search for Swift" --reasoning-effort low
sagui agent "Press the Save button" --vision-mode automatic

--reasoning-effort accepts none, low, medium, high, xhigh, or max. It defaults to low for GPT-5.6 models. The per-step Reasoning: line is the agent's concise explanation of its chosen actions, not the model's hidden chain of thought.

When screen context is enabled, actionable Accessibility elements receive step-local identifiers such as [#12]. The agent can target these identifiers directly, resolves them again immediately before execution, and rejects stale elements safely. Each action returns a structured result describing the execution method, failure, UI change, and focus change. If an action changes the UI, the remaining batch is stopped and the agent observes the new state before continuing.

--vision-mode accepts always, automatic, or never. automatic omits the screenshot when actionable Accessibility elements are available; always preserves the original behavior and remains the default.

Basic Usage

import SwiftAutoGUI

// Execute single actions
await Action.leftClick.execute()
await Action.write("Hello, World!").execute()
await Action.keyShortcut([.command, .a]).execute()  // Select all

// Build and execute action sequences
let actions: [Action] = [
    .move(to: CGPoint(x: 100, y: 100)),
    .wait(0.5),
    .leftClick,
    .write("Hello, SwiftAutoGUI!"),
    .keyShortcut([.returnKey])
]
await actions.execute()

Claude Code Plugin

SwiftAutoGUI ships as a Claude Code plugin so Claude can control native macOS applications and Chromium pages through the sagui CLI.

Install from the marketplace

Inside Claude Code:

/plugin marketplace add NakaokaRei/SwiftAutoGUI
/plugin install swift-auto-gui@swift-auto-gui

This installs two skills:

  • macos-control, invoked as /swift-auto-gui:macos-control, controls native macOS UI.
  • browser-control, invoked as /swift-auto-gui:browser-control, controls Chromium pages through CDP without native input fallback.

The skills walk Claude through installing or updating the sagui binary when needed.

Permissions

Grant the application running Claude Code (Terminal.app, iTerm, etc.) both:

  • Accessibility — System Settings → Privacy & Security → Accessibility
  • Screen Recording — System Settings → Privacy & Security → Screen Recording

These permissions are required for macos-control; browser-only CDP actions do not require them.

For full details, see the macos-control and browser-control skill definitions.

Contributors

License

MIT license. See the LICENSE file for details.

SIMILAR PLUGINS