Need
분할 뷰 기반 앱 구조
Default options
NavigationSplitView, .sidebar 목록, inspector(isPresented:)
Why it's needed
사이드바를 항상 표시하고 상세 패널과 인스펙터를 함께 배치하면 터치 중심으로 화면을 차례로 열어 가는 방식보다 일반적인 Mac 앱 레이아웃에 더 잘 맞습니다.
.md to the page URL.
Codex use case
Codex로 사이드바, 상세 패널, 인스펙터, 명령어, 설정을 갖춘 Mac 네이티브 SwiftUI 앱의 기본 구조를 만드세요.
Codex와 Build macOS Apps 플러그인으로 앱 아이디어를 Mac에 맞는 NavigationSplitView 앱으로 구현하세요. 사이드바에서 선택한 항목이 그대로 유지되도록 하고 메뉴, 도구 막대, 키보드 단축키를 추가하세요. 환경설정은 전용 Settings 씬으로 옮기세요.
Codex로 사이드바, 상세 패널, 인스펙터, 명령어, 설정을 갖춘 Mac 네이티브 SwiftUI 앱의 기본 구조를 만드세요.
Codex와 Build macOS Apps 플러그인으로 앱 아이디어를 Mac에 맞는 NavigationSplitView 앱으로 구현하세요. 사이드바에서 선택한 항목이 그대로 유지되도록 하고 메뉴, 도구 막대, 키보드 단축키를 추가하세요. 환경설정은 전용 Settings 씬으로 옮기세요.
Codex와 Build macOS Apps 플러그인으로 앱 아이디어를 Mac에 맞는 NavigationSplitView 앱으로 구현하세요. 사이드바에서 선택한 항목이 그대로 유지되도록 하고 메뉴, 도구 막대, 키보드 단축키를 추가하세요. 환경설정은 전용 Settings 씬으로 옮기세요.
Related links
| Skill | Why use it |
|---|---|
| Build macOS Apps | macOS SwiftUI 패턴, 윈도우 관리, AppKit 연동, 빌드 및 실행 스킬을 활용하세요. 사이드바, 상세 패널, 인스펙터로 레이아웃을 구성하고 메뉴와 설정을 연결하세요. 앱의 기본 구조부터 빌드와 실행을 반복하며 동작을 확인하세요. |
터치 중심의 화면 구조를 데스크톱 크기로 늘리는 대신, 앱 아이디어를 Mac에 맞는 앱 셸로 구현하는 방법을 살펴봅니다. Codex에 먼저 씬 모델을 선택하도록 요청하세요. 그런 다음 선택 상태를 유지하는 사이드바, 선택한 항목을 보여 주는 세부 정보 패널, 보조 컨트롤이나 메타데이터를 담는 인스펙터를 중심으로 기본 윈도우를 설계하도록 하세요.

Codex가 이 데스크톱 구조를 적용하고 셸에서 빌드와 실행을 반복하도록 하려면 Build macOS Apps 플러그인을 사용하세요. 플러그인에 포함된 macOS SwiftUI 패턴 스킬은 씬, 사이드바, 인스펙터, 명령어, 설정을 설계하는 데 적합합니다. SwiftUI만으로 구현하기 어려운 Mac 고유 동작을 위해 작은 AppKit 브리지를 추가할 때도 이 스킬을 활용할 수 있습니다.
탐색 영역을 계속 표시하고 항목의 선택 상태를 유지하는 것이 유용한 기능이라면 NavigationSplitView를 우선 사용하세요. 사이드바의 각 행은 네이티브 요소로 간결하게 구성하고 배경은 시스템 기본값을 사용하세요. 사용자 지정 카드나 정보량이 많은 메타데이터는 세부 정보 패널이나 인스펙터에 배치하세요.
import SwiftUI
struct Item: Identifiable, Hashable {
let id: String
let title: String
let systemImage: String
}
let items = [Item(id: "notes", title: "Notes", systemImage: "note.text"), Item(id: "photos", title: "Photos", systemImage: "photo")]
struct ItemDetailView: View {
let selection: String?
var body: some View { Text(selection ?? "Select an item").frame(maxWidth: .infinity, maxHeight: .infinity) }
}
struct ItemInspectorView: View {
let selection: String?
var body: some View { Text("Metadata: \(selection ?? "No selection")").padding().frame(minWidth: 220) }
}
@MainActor final class LibraryStore: ObservableObject {
@Published var entries = items
@Published var selection: String?
@Published var showInspector = true
func addItem() {
let item = Item(id: UUID().uuidString, title: "New Item", systemImage: "doc")
entries.append(item)
selection = item.id
}
}
struct LibraryRootView: View {
@StateObject private var store = LibraryStore()
@SceneStorage("LibraryRootView.selection") private var savedSelection: Item.ID?
@SceneStorage("LibraryRootView.showInspector") private var savedShowInspector = true
var body: some View {
NavigationSplitView {
List(selection: $store.selection) {
ForEach(store.entries) { item in
Label(item.title, systemImage: item.systemImage)
.tag(item.id)
}
}
.listStyle(.sidebar)
.navigationTitle("Library")
} detail: {
ItemDetailView(selection: store.selection)
.inspector(isPresented: $store.showInspector) {
ItemInspectorView(selection: store.selection)
}
}
.focusedSceneObject(store)
.onAppear {
store.selection = savedSelection
store.showInspector = savedShowInspector
}
.onChange(of: store.selection) { _, selection in
savedSelection = selection
}
.onChange(of: store.showInspector) { _, showInspector in
savedShowInspector = showInspector
}
}
}분할 영역의 크기를 특수한 방식으로 조정하거나, 윈도우 간 동작을 저수준에서 조율하거나, 응답자 체인의 동작을 맞춤 설정해야 한다면 Codex에 SwiftUI 셸을 유지하면서 해당 동작에 꼭 필요한 만큼만 AppKit 브리지를 추가하도록 요청하세요.
Mac 사용자는 메뉴 막대와 도구 막대에서 주요 동작을 쉽게 찾고 해당 키보드 단축키도 확인할 수 있어야 합니다. Codex에 씬 수준의 commands, 상황에 따라 달라지는 메뉴 항목, 도구 막대 버튼을 동일한 앱 동작에 연결하도록 요청하세요. 이렇게 하면 데스크톱 사용자가 제스처로만 접근할 수 있는 컨트롤을 찾아 헤맬 필요가 없습니다.
@main
struct LibraryApp: App {
@FocusedObject private var store: LibraryStore?
var body: some Scene {
WindowGroup {
LibraryRootView()
}
.commands {
CommandMenu("Library") {
Button("New Item") {
store?.addItem()
}
.keyboardShortcut("n")
.disabled(store == nil)
Button("Toggle Inspector") {
store?.showInspector.toggle()
}
.keyboardShortcut("i", modifiers: [.command, .option])
.disabled(store == nil)
}
}
Settings {
LibrarySettingsView()
}
}
}명령어가 세부 정보 패널에 표시된 항목에 적용되어야 한다면 FocusedValue, 씬 상태 또는 명시적인 선택 상태를 사용하세요. 같은 단축키가 여러 곳에 등록될 수 있다면 Codex에 등록과 처리를 한곳에서 맡도록 요청해 명령어의 실행 경로를 하나로 정리하세요.
Settings에서 환경설정 관리하기앱 환경설정에는 전용 Settings 씬을 사용하고, 앱을 다시 실행해도 유지해야 하는 사용자 설정은 @AppStorage로 저장하세요. Mac 앱에는 대개 기본 콘텐츠 윈도우의 탐색 스택에 설정 화면을 추가하는 것보다 이 방식이 더 잘 맞습니다.
struct LibrarySettingsView: View {
@AppStorage("showItemMetadata") private var showItemMetadata = true
var body: some View {
TabView {
Form {
Toggle("Show Item Metadata", isOn: $showItemMetadata)
}
.tabItem { Label("General", systemImage: "gearshape") }
}
.frame(width: 460, height: 260)
.scenePadding()
}
}프롬프트에 어떤 앱을 만들려는지, 주로 다루는 콘텐츠 객체는 무엇인지, 사용자가 어떤 주요 동작을 수행하는지 명시하세요. 그런 다음 Codex에 그 워크플로우에 맞춰 데스크톱 셸부터 구현하도록 요청하세요. 에이전트가 앱을 빌드하고 실행해 간단히 확인한 뒤, 씬의 구성, 명령어가 연결된 동작, 상태를 관리하는 주체, AppKit 브리지가 필요했던 부분을 요약하도록 하세요.
사이드바의 각 행에는 아이콘 하나와 한 줄짜리 제목을 사용하고, 보조 텍스트는 짧게 한 줄까지만 넣으세요. 정보가 많은 카드, 개수를 나타내는 표시, 메타데이터는 세부 정보 패널이나 인스펙터로 옮겨 사이드바 목록을 한눈에 훑어볼 수 있도록 하세요.
앱 전체에 적용되는 사용자 설정이라면 Codex에 해당 컨트롤을 Settings에 배치하고 값을 @AppStorage로 저장하도록 요청하세요. 탐색 스택에 설정 화면을 하나 더 추가하는 대신 앱 메뉴에서 설정을 열 수 있도록 하세요.
열기 및 저장 패널, 최초 응답자 제어 또는 사용자 지정 NSView가 필요한 경우에는 윈도우 전체를 AppKit으로 다시 작성하지 마세요. 상태 모델은 SwiftUI에서 계속 관리하고 해당 동작에 필요한 부분만 AppKit으로 연결하세요.
Need
Default options
Why it's needed
Need
분할 뷰 기반 앱 구조
Default options
NavigationSplitView, .sidebar 목록, inspector(isPresented:)
Why it's needed
사이드바를 항상 표시하고 상세 패널과 인스펙터를 함께 배치하면 터치 중심으로 화면을 차례로 열어 가는 방식보다 일반적인 Mac 앱 레이아웃에 더 잘 맞습니다.
Need
데스크톱 작업과 설정
Default options
commands, CommandMenu, 키보드 단축키, Settings 씬
Why it's needed
iOS 화면을 데스크톱 크기로 늘리는 데 그치지 않고 메뉴 막대 명령어, 단축키, 전용 설정 윈도우를 제공하면 사용자가 Mac에 익숙한 방식으로 기능을 이용할 수 있습니다.
Need
상태 소유권
Default options
@State, @SceneStorage, @AppStorage, 명시적 선택 바인딩
Why it's needed
Codex는 뷰 모델을 매번 추가하지 않아도 사이드바 선택 상태, 인스펙터 표시 여부, 사용자 환경설정을 일관되게 관리할 수 있습니다.
Need
네이티브 API 연동
Default options
필요한 기능에 한정해 NSViewRepresentable 또는 NSWindow 브리지로 AppKit 연동
Why it's needed
SwiftUI로 자연스럽게 구현하기 어려운 플랫폼 동작에만 AppKit을 사용하세요. 씬 상태와 선택 상태는 SwiftUI에서 관리하고, AppKit에서도 이 값을 참조하세요.
| Need | Default options | Why it's needed |
|---|---|---|
| 분할 뷰 기반 앱 구조 | NavigationSplitView , .sidebar 목록, inspector(isPresented:) | 사이드바를 항상 표시하고 상세 패널과 인스펙터를 함께 배치하면 터치 중심으로 화면을 차례로 열어 가는 방식보다 일반적인 Mac 앱 레이아웃에 더 잘 맞습니다. |
| 데스크톱 작업과 설정 | commands , CommandMenu , 키보드 단축키, Settings 씬 | iOS 화면을 데스크톱 크기로 늘리는 데 그치지 않고 메뉴 막대 명령어, 단축키, 전용 설정 윈도우를 제공하면 사용자가 Mac에 익숙한 방식으로 기능을 이용할 수 있습니다. |
| 상태 소유권 | @State , @SceneStorage , @AppStorage , 명시적 선택 바인딩 | Codex는 뷰 모델을 매번 추가하지 않아도 사이드바 선택 상태, 인스펙터 표시 여부, 사용자 환경설정을 일관되게 관리할 수 있습니다. |
| 네이티브 API 연동 | 필요한 기능에 한정해 NSViewRepresentable 또는 NSWindow 브리지로 AppKit 연동 | SwiftUI로 자연스럽게 구현하기 어려운 플랫폼 동작에만 AppKit을 사용하세요. 씬 상태와 선택 상태는 SwiftUI에서 관리하고, AppKit에서도 이 값을 참조하세요. |
Codex로 SwiftUI 기반 macOS 앱을 만들고 셸에서 빌드와 실행을 반복할 수 있도록 구성하세요
Codex와 Build macOS Apps 플러그인을 사용해 윈도우, 사이드바, 명령어 또는 동기화 플로우의 주요 지점에 `Logger` 이벤트를 몇 개 추가하세요
Codex로 웹 앱에 WebMCP 기반 투어를 추가하세요. 다음에 조작할 UI 요소를 강조하고 사용자가 무엇을 해야 하는지 설명하세요. 사용자가 각 단계를 직접...