Native macOS control center for the local Xcode Agent backend.
Most app code lives in the local Swift package at XcodeAgentUI/XcodeAgentUIPackage/:
XcodeAgentUICore— models, services, connection state, theming, shared modifiers/transitionsXcodeAgentUIFeatures— feature views and UI flows built on top of the core moduleXcodeAgentUIAppShell— shell UI/glue used by the app target (ContentView, menu bar views, app chrome)
The macOS app target should stay thin: app entry, app delegate/configuration, assets, entitlements, and package wiring.
XcodeAgentUI/
├── AGENTS.md
├── README.md
└── XcodeAgentUI/
├── XcodeAgentUI.xcodeproj
├── XcodeAgentUIWorkspace.xcworkspace
├── XcodeAgentUI/ # App target (entry point, assets, config)
│ ├── XcodeAgentUIApp.swift
│ ├── Config/
│ │ ├── Credentials.template.xcconfig
│ │ └── Providers.xcconfig
│ ├── Assets.xcassets/
│ └── XcodeAgentUI.entitlements
└── XcodeAgentUIPackage/ # Local Swift package
├── Package.swift
├── Sources/
│ ├── XcodeAgentUICore/
│ ├── XcodeAgentUIFeatures/
│ └── XcodeAgentUIAppShell/
└── Tests/
└── XcodeAgentUICoreTests/
If Xcode does not automatically link the local package products into the app target:
- Open
XcodeAgentUI/XcodeAgentUIWorkspace.xcworkspace. - Select the XcodeAgentUI target.
- In General > Frameworks, Libraries, and Embedded Content, add:
XcodeAgentUICoreXcodeAgentUIFeaturesXcodeAgentUIAppShell
- In Build Phases > Link Binary With Libraries, verify the same three products are present.
- If the package itself is not attached yet, use File > Add Packages... and choose the local package at
XcodeAgentUI/XcodeAgentUIPackage/.
The happy path is local-first and explicit:
- Backend HTTP API on
http://127.0.0.1:3800 - Backend WebSocket bridge on
ws://127.0.0.1:9300 - Dashboard can start the local backend
- Mission Control can start a session and trigger the backend
- Mission Control sends steering commands to the active ticket target
- The backend emits the typed envelope protocol the UI expects
- macOS 14+
- Xcode 16+
- Swift 6 toolchain
- Node 20+
claudeCLI installed for real agent execution- Backend repo cloned locally
git clone <ui-repo-url> XcodeAgentUI
git clone <backend-repo-url> xcode-agentcd xcode-agent
npm install
cp .env.example .envPut at least this in .env:
PORT=3800
BRIDGE_WS_PORT=9300
GITHUB_TOKEN=ghp_...
ALLOW_LOCAL_UNAUTHENTICATED=truecd xcode-agent
npm test
npm run smoke:connectioncd XcodeAgentUI/XcodeAgentUI/XcodeAgentUI/Config
cp Credentials.template.xcconfig Credentials.xcconfigFill in your tokens in Credentials.xcconfig. This file is gitignored.
Supported providers: GitHub, GitLab, Jira, Shortcut. Tokens can also be managed in-app via the Providers settings tab.
cd XcodeAgentUI/XcodeAgentUI/XcodeAgentUIPackage
swift testOr open XcodeAgentUI/XcodeAgentUI/XcodeAgentUIWorkspace.xcworkspace in Xcode and run the XcodeAgentUI scheme.
In the backend repo:
cd xcode-agent
npm startThen launch the macOS app from Xcode.
- Open the app.
- In Settings or Dashboard, point
Agent Directoryat the backend repo. - From Dashboard, start the backend.
- Wait for HTTP and bridge status to go green.
The default backend path expected by the app is:
~/.openclaw/workspace/xcode-agent
Change it in-app if your clone lives elsewhere.
- Make sure the backend is running.
- Open Mission Control (Cmd+2).
- Click Start Session.
- Choose provider, project, ticket id, model, optional acceptance criteria.
- Click Start.
What the app does:
- Creates the local session state immediately
- Triggers backend
/triggervianpm run trigger:ui - Opens/uses the bridge connection as a human client
- Routes steering commands to the active ticket id instead of broadcasting blindly
| Shortcut | Action |
|---|---|
| Cmd+1 | Dashboard |
| Cmd+2 | Mission Control |
| Cmd+3 | Queue |
| Cmd+0 | Toggle Sidebar |
| Cmd+Return | Approve Pending Action |
| Cmd+Shift+W | End Session |
| Cmd+Shift+K | Switch Connection |
| Cmd+Shift+R | Reconnect |
The UI expects bridge messages in this envelope shape:
{
"type": "agent_output",
"from": "agent",
"ts": "2026-03-26T15:00:00.000Z",
"payload": "message text"
}Relevant event types consumed in Mission Control:
agent_outputagent_erroragent_statusfile_changedagent_approval_requestacceptance_criteriacriterion_mettoken_usagebuild_resultsystem
- Real ticket runs still require a valid GitHub token and repo access because the backend resolves issue metadata from GitHub
- The app has rich UI for approvals/diffs/criteria, but backend production of structured diff and criteria events is still opportunistic rather than fully semantic
- The working local dev path is
npm start; the bridge is served from the main backend process
MIT