ワンクリックで
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