원클릭으로
navigator
Creates Navigator for navigation. Use when setting up navigation, adding navigation to ViewModels, or testing navigation behavior.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Creates Navigator for navigation. Use when setting up navigation, adding navigation to ViewModels, or testing navigation behavior.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Swift 6 concurrency patterns. Use when working with async/await, actors, MainActor isolation, or Sendable conformance.
Creates Features for dependency injection. Use when creating features, exposing public entry points, or wiring up dependencies.
Creates Repositories that abstract data access. Use when creating repositories, transforming DTOs to domain models, or implementing local-first caching. Supports remote-only, local-only, and cached (remote + local) repositories with CachePolicy.
Creates a new feature module with minimal viable structure. Use when bootstrapping a new feature from scratch, scaffolding the Tuist module, Container, Feature entry point, DeepLinkHandler, and initial screen with placeholder Text view. Includes all unit tests, mocks, stubs, and app integration. For adding domain/data layers afterward, use /datasource, /repository, /usecase. For enhancing views, use /view, /viewmodel, /navigator.
Creates ViewModels with state management. Use when creating ViewModels, implementing ViewState pattern, or adding state management for features. Delegates to /usecase for domain use cases and to /feature for Container/Feature wiring.
Testing patterns and conventions. Use when writing unit tests, using Swift Testing framework, or following Given/When/Then structure.
| name | navigator |
| description | Creates Navigator for navigation. Use when setting up navigation, adding navigation to ViewModels, or testing navigation behavior. |
Guide for implementing navigation using NavigationCoordinator with SwiftUI NavigationStack, Navigator pattern for decoupling, and Outgoing/Incoming Navigation for cross-feature communication.
┌─────────────────────────────────────────────────────────────────────────┐
│ RootContainerView │
│ @State private var coordinator = NavigationCoordinator( │
│ redirector: AppNavigationRedirect() │
│ ) │
│ │
│ NavigationStack(path: $coordinator.path) { ... } │
│ .sheet(item: $coordinator.sheetNavigation) { modal in │
│ ModalContainerView(modal:appContainer:onDismiss:) │
│ } │
│ .fullScreenCover(item: $coordinator.fullScreenCoverNavigation) { ... } │
└─────────────────────────────────────────────────────────────────────────┘
Push Navigation Flow:
1. HomeNavigator.navigateToCharacters()
2. coordinator.navigate(to: HomeOutgoingNavigation.characters)
3. AppNavigationRedirect.redirect() → CharacterIncomingNavigation.list
4. NavigationStack shows CharacterListView
Modal Navigation Flow:
1. Navigator.presentFilter()
2. coordinator.present(Navigation.filter, style: .sheet(detents: [.medium, .large]))
3. sheetNavigation is set → .sheet(item:) activates
4. ModalContainerView creates its own NavigationCoordinator + NavigationStack
5. Modal can push internally or present nested modals
| Type | Description | Implementation |
|---|---|---|
| Incoming | Destinations a feature can handle | {Feature}IncomingNavigation enum |
| Outgoing | Destinations a feature wants to navigate to | {Feature}OutgoingNavigation enum |
| Redirect | Connects Outgoing → Incoming | AppNavigationRedirect in App layer |
Why? Features remain decoupled. Feature A doesn't import Feature B. The App layer connects them via redirects.
ViewModels use Navigators instead of NavigatorContract directly. This:
Key Difference:
{Feature}IncomingNavigation directly{Feature}OutgoingNavigation (redirected by App layer)| Style | Description |
|---|---|
.sheet(detents:) | Presents as a sheet with configurable detents (default: [.large]) |
.fullScreenCover | Presents as a full-screen cover |
present(_:style:) — sets sheetNavigation or fullScreenCoverNavigation on the coordinatordismiss() — priority: fullScreenCover > sheet > parent onDismissLibraries/Core/
├── Sources/Navigation/
│ ├── NavigationCoordinator.swift
│ ├── NavigatorContract.swift
│ ├── NavigationRedirectContract.swift
│ ├── Navigation.swift
│ ├── AnyNavigation.swift
│ ├── ModalPresentationStyle.swift
│ ├── ModalNavigation.swift
│ └── DeepLinkHandler.swift
└── Mocks/
└── NavigatorMock.swift
AppKit/Sources/
├── AppContainer.swift
└── Presentation/
├── Navigation/AppNavigationRedirect.swift
└── Views/
├── NavigationContainerView.swift
├── RootContainerView.swift
└── ModalContainerView.swift
Features/{Feature}/
├── Sources/Presentation/
│ ├── Navigation/
│ │ ├── {Feature}IncomingNavigation.swift
│ │ ├── {Feature}OutgoingNavigation.swift
│ │ └── {Feature}DeepLinkHandler.swift
│ └── {Screen}/
│ ├── Navigator/
│ │ ├── {Screen}NavigatorContract.swift
│ │ └── {Screen}Navigator.swift
│ └── Tracker/
│ ├── {Screen}TrackerContract.swift
│ ├── {Screen}Tracker.swift
│ └── {Screen}Event.swift
└── Tests/Unit/Presentation/
├── Navigation/{Feature}DeepLinkHandlerTests.swift
└── {Screen}/Navigator/{Screen}NavigatorTests.swift
NavigatorContract protocol (navigate, present, dismiss, goBack)NavigationCoordinator (@Observable, manages path + modals + redirects)NavigationContract, IncomingNavigationContract, OutgoingNavigationContractAnyNavigation type-erased wrapperModalPresentationStyle and ModalNavigationDeepLinkHandlerContract and FeatureContractNavigatorMock for testingAppNavigationRedirect in AppKit/Sources/Presentation/Navigation/NavigationContainerView (NavigationStack + push + modals)RootContainerView uses NavigationContainerView + .onOpenURLModalContainerView (creates own coordinator, uses NavigationContainerView)AppContainer.resolveView(for:navigator:) iterates features and falls back to NotFoundViewAppContainer.handle(url:navigator:) resolves deep links via navigation(from:)AppContainer.makeRootView(navigator:) returns deep link view as root when deepLinkURL is set{Feature}IncomingNavigation in Presentation/Navigation/{Feature}OutgoingNavigation for cross-feature navigation (if needed){Feature}DeepLinkHandler returning IncomingNavigationContract (if deep links needed)NavigatorContract and NavigatorIncomingNavigationContract for internal, OutgoingNavigationContract for externalnavigator: any NavigatorContract