TECH NOTES

匯出 Xcode beta 的 Agent Skills,讓 Claude Code 與 Codex 共用

最近在研究 Xcode 27.1 beta 時,
發現裡面內建了一批 Apple 自己撰寫的 Agent Skills。

這些 Skills 可以透過 xcrun agent skills export 匯出,
然後拿給 Claude Code、Codex 這類 coding agent 使用。

不過我的 Mac 上,
同時安裝了正式版 Xcode 和 Xcode beta。
如果沒有特別指定 Xcode ,xcrun 不一定會使用 beta 版 Xcode。
所以這篇就記錄一下這次研究的過程,包括:

  • 怎麼匯出的是 Xcode beta 裡的 Agent Skills
  • 哪些 Skills 需要搭配 Xcode MCP
  • 實際用 device-interaction 操作自己的 App 看看效果
  • 怎麼讓 Claude Code 和 Codex 共用同一份 Skills

預設匯出的可能是正式版 Xcode

xcrun 會使用目前 xcode-select 指定的那一套 Xcode。
而我的環境平常當然還是以正式版 Xcode 為主,所以直接執行:

xcrun agent skills export ...

指令會正常執行、Skills 也會正常匯出,
只是匯出來的是正式版 Xcode 裡的版本。

用 DEVELOPER_DIR 指定這一次要使用的 Xcode

當然可以直接用 xcode-select 切換到 beta:

sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer

不過我不太想為了匯出一次 Skills,就去動整台 Mac 的預設 Xcode。
比較適合我的方式,是只在這一行指令前面指定 DEVELOPER_DIR:

DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer \
xcrun agent skills export \
  --output-dir ~/Downloads/xcode-skills \
  --replace-existing

這樣 DEVELOPER_DIR 只會套用在這一行指令,以及它啟動的子程序。
執行完之後,原本 terminal 的環境不會被改掉,xcode-select 也完全不用動。
如果想確認現在指定到的是哪一套 Xcode,也可以先跑:

DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer \
xcodebuild -version

確認版本沒問題之後再 export。
agent skills export 本身的參數也不複雜,主要就是:

--output-dir
--replace-existing

有需要的話也可以直接跑:

xcrun agent skills export --help

查看目前這一版 Xcode 支援哪些選項。

匯出後的 Agent Skills

匯出後的結構就是標準的 Skill 形式。
每個 Skill 都有自己的資料夾:

skill-name/
  SKILL.md

有些 Skill 底下還會再附:

references/

我這次使用的 Xcode 27.1 beta,大致會匯出了以下 Skills。

  • swiftui-specialist
  • swiftui-whats-new-27
  • app-intents-specialist
  • app-resizability
  • modernize-tests
  • device-interaction
  • audit-xcode-security-settings

不是每個 Skill 都只是文件

一開始我以為這批 Skills 基本上就是 Apple 整理好的開發文件。
像 SwiftUI、App Intents、Resizable App 這幾個,主要就是 SKILL.md 加上相關 reference,agent 讀完之後就可以直接使用。

不過其中有兩個比較特別。
它們不是只有文件,而是需要 Xcode 透過 MCP 提供工具才能真正運作:

device-interaction

可以讓 agent 在 Simulator 或實體裝置上操作 App,同時取得畫面與 UI 結構。
另外一個是:

audit-xcode-security-settings

可以讀取甚至修改 build settings 和 entitlements,
用來檢查與強化 Xcode project 的安全設定。

如何連接上 Xcode MCP

要使用 device-interaction,還要讓 Claude Code 或 Codex 可以存取 Xcode 提供的 MCP tools。

Xcode 本身已經內建 mcpbridge。

Claude Code 可以這樣加:

claude mcp add --scope user xcode -- xcrun mcpbridge

Codex 則是:

codex mcp add xcode -- xcrun mcpbridge

設好之後,coding agent 就能透過 MCP 使用 Xcode 提供的工具。

實際試用 device-interaction skill

把 Skill 和 MCP 都接好之後,
我就拿自己的 App 來實際跑一次。

device-interaction 對操作流程其實有一套規範。

主要是由 main agent 建立 workspace session、build 並安裝 App。
真正的 UI 操作交給 subagent 執行。
最後再由 main agent 結束 session。

大致上的流程是:

DeviceInteractionStartWorkspaceSession
        ↓
DeviceInteractionInstallAndRun
        ↓
subagent
DeviceInteractionSynthesize
        ↓
DeviceInteractionSynthesize
        ↓
...
        ↓
DeviceInteractionEndSession

其中我覺得一個蠻方便的地方,是 InstallAndRun 可以只針對這一次執行加入 launch arguments。

例如:

["$(inherited)", "UI_TESTING", "DEMO_DATA"]

不用為了測試去修改 scheme。

我自己的 App 原本就有準備一些 testing / demo data 用的啟動參數,所以這樣剛好可以直接拿來用。

拿自己的 Fudo Note App 跑一個操作流程

我這次驗證的流程很簡單。
在自己 side project 的 Fudo Note App:

  1. 打開第一篇食記
  2. 點進其中一張照片
  3. 進入全螢幕照片檢視
  4. 往下滑把照片關掉

而 device-interaction 跟單純讓 AI 看 screenshot 的差異,
每次抓取目前 App 狀態時,它不只是拿到 screenshot。
同時還會拿到一份 UI structure tree。
裡面每個可以操作的元素,都會有系統建議的:

hitPoint

也就是適合點擊的位置。
這次實測中,agent 直接按照 hitPoint 去點,每一下都一次成功。
我這個畫面的 UI structure tree,每次大概會有 100 到 135 行。

因為 SwiftUI 畫面裡常常會有很多一層包一層的 element,
所以實際使用時,AI agent 認為最快的方法還是直接搜尋:

accessibility identifier

找到要操作的元件。

跟只看 screenshot 的方式比看看

做到這裡之後,我也有點好奇。
既然 Claude Code 原本就有工具可以操作 iOS Simulator:

那 device-interaction 到底有沒有比較好?

所以我又開了一個 subagent。
給它完全一樣的任務,但這次不使用 Xcode MCP,
而是改用原本只能看 screenshot、再根據畫面自己決定點擊座標的方式。

結果如下:

device-interaction 只看 screenshot
subagent token 約 83,500 約 79,100
tool calls 15 次 10 次
時間 約 49 秒 約 34 秒
點擊一次成功 全部 全部
結果 4 步全部通過 4 步全部通過

上面這些數字我覺得不能太認真看。
因為我兩種方式都只跑了一次。

而且這次的 UI 操作很簡單,沒有複雜的小按鈕,也沒有出現點錯位置需要 retry 的情況。

所以 hitPoint 帶來的優勢,其實沒有真的發揮出來。
另外 device-interaction 還有 main agent 負責建立 session、build、install,以及最後結束 session 的成本。
所以這比較比較像是一次實驗紀錄,而不是 benchmark。

小結

這次研究下來,我覺得 Xcode 內建的 Agent Skills 還蠻值得拿出來給其他 coding agent 用。

尤其我本來就同時使用 Claude Code 和 Codex,所以最後把 Skills 放在:

~/.agents/skills

再用 symlink 指過去:

~/.claude/skills

對我來說是最簡單的管理方式。

而如果電腦裡同時安裝正式版和 beta 版 Xcode,使用:

DEVELOPER_DIR=...

只指定單一指令要使用哪一套 Xcode,也比一直切換 xcode-select 來得簡單。

至於 device-interaction,這次實測下來,它沒有因為可以讀 UI tree 就明顯比較省 token 或比較快。
但是當畫面開始變複雜,或是要檢查 accessibility 相關問題時,我覺得很有機會比看 screenshot 要省用量。

總之, 開發 iOS 的朋友,
若還沒有 export Xcode 自帶的 skills,
趕快來試試看。