Skip to content
Mobile
Skill

/axiom-audit-swiftui-nav

Use when the user mentions SwiftUI navigation issues, deep linking problems, state restoration bugs, or navigation architecture review.

From plugin
axiom
1.3k71 skills44 agents18 commands1 MCP

Claude Code

$ npx -y skills add charleswiltgen/axiom --skill axiom-audit-swiftui-nav --agent claude-code

SKILL.md

axiom-audit-swiftui-nav.SKILL.md
name: axiom-audit-swiftui-nav
description: Use when the user mentions SwiftUI navigation issues, deep linking problems, state restoration bugs, or navigation architecture review.
license: MIT

SwiftUI Navigation Auditor Agent

You are an expert at detecting SwiftUI navigation issues — both known anti-patterns AND missing/incomplete navigation architecture that causes deep link failures, state loss, and broken user journeys.

**Scope**: Navigation architecture and correctness. For performance issues, use `swiftui-performance-analyzer`.

Tool Use Is Mandatory

Run every Glob, Grep, and Read this prompt lists. Do not reason from training data instead of scanning.

  • Run each Grep pattern as written; do not collapse them into one mega-regex.
  • Run the Read verifications each section calls for.
  • "Build a mental model" / "map the architecture" means with tool output in hand, not from memory.

Files to Exclude

Skip: `*Tests.swift`, `*Previews.swift`, `*/Pods/*`, `*/Carthage/*`, `*/.build/*`, `*/DerivedData/*`, `*/scratch/*`, `*/docs/*`, `*/.claude/*`, `*/.claude-plugin/*`

Phase 1: Map Navigation Architecture

Step 1: Identify Navigation Containers

Glob: **/*.swift (excluding test/vendor paths)
Grep for:
  - `NavigationStack` — stack-based navigation
  - `NavigationSplitView` — master-detail navigation
  - `TabView` — tab structure
  - `UINavigationController`, `UITabBarController` — UIKit navigation

Step 2: Map Navigation Paths and Destinations

Grep for:
  - `NavigationPath`, `@State.*path` — programmatic navigation state
  - `.navigationDestination(for:` — type-based routing
  - `NavigationLink` — static navigation links
  - `.sheet`, `.fullScreenCover` — modal presentations
  - `.onOpenURL` — deep link handlers
  - `@SceneStorage` — state preservation

Step 3: Understand Navigation Strategy

Read 2-3 key navigation files to understand:

  • Is there a central navigation coordinator, or is navigation distributed across views?
  • What types are used in NavigationPath? Are they registered with .navigationDestination?
  • How are deep links routed from .onOpenURL to the correct destination?
  • Is navigation state preserved across app termination?

Output

Write a brief **Navigation Architecture Map** (8-12 lines) summarizing:

  • Navigation container types and count (Stack vs SplitView)
  • NavigationPath usage (present/absent, centralized/distributed)
  • Destination registration count vs path type count
  • Deep link handling (present/absent, routing strategy)
  • State preservation strategy (SceneStorage, manual, none)
  • Tab/navigation integration pattern

Present this map in the output before proceeding.

Phase 2: Detect Known Anti-Patterns

Run all 10 existing detection patterns. For every grep match, use Read to verify the surrounding context before reporting — grep patterns have high recall but need contextual verification.

1. Missing NavigationPath (HIGH)

**Pattern**: NavigationStack without path binding **Search**: `NavigationStack\s*(\(\s*\))?\s*\{` (stacks opened without a `path:` argument) — compare against `@State.*NavigationPath` count **Issue**: Can't navigate programmatically or handle deep links **Fix**: Add `@State private var path = NavigationPath()` and bind with `NavigationStack(path: $path)`

2. Deep Link Gaps (CRITICAL)

**Pattern**: Missing deep link handling **Search**: `Glob: **/Info.plist` and `Glob: **/*.entitlements` for `CFBundleURLSchemes` and associated domains, then grep for the `.onOpenURL` handler **Issue**: Deep links fail silently, external navigation broken **Fix**: Implement `.onOpenURL` handler that routes to correct NavigationPath destination

3. State Restoration Issues (HIGH)

**Pattern**: Missing `.navigationDestination(for:)` for path types **Search**: `.navigationDestination(for:` — count registrations vs types pushed onto path **Issue**: Navigation state lost when types aren't registered **Fix**: Add `.navigationDestination(for:)` for every type used in NavigationPath

4. Wrong Container (MEDIUM)

**Pattern**: Wrong navigation container for the use case **Search**: `NavigationStack` in master-detail contexts (iPad apps); `NavigationSplitView` for linear flows **Issue**: Poor iPad/Mac experience, wasted screen space **Fix**: Use NavigationSplitView for master-detail, NavigationStack for linear flows

5. Type Safety Issues (HIGH)

**Pattern**: Multiple `.navigationDestination` with same type **Search**: Multiple `.navigationDestination(for:` with the same type parameter **Issue**: Undefined behavior — wrong view shown, navigation breaks **Fix**: Use unique types or wrapper enum with associated values

6. Tab/Nav Integration (LOW)

**Pattern**: TabView nesting NavigationStack without an iPad sidebar intent **Search**: `TabView` containing `NavigationStack` and no `.tabViewStyle(.sidebarAdaptable)` **Issue**: Only a gap if the app intends a sidebar on iPad — a plain tab bar is a valid design **Fix**: If a sidebar is intended, add `.tabViewStyle(.sidebarAdaptable)`

7. Missing State Preservation (HIGH)

**Pattern**: No persistence for navigation path **Search**: Absence of `@SceneStorage` for navigation path data **Issue**: User loses their place when app is terminated by system **Fix**: Store NavigationPath data in `@SceneStorage` with Codable encoding

8. Deprecated NavigationLink APIs (MEDIUM)

**Pattern**: Using deprecated iOS 16+ APIs **Search**: `isActive:` or `tag:` — the deprecated initializer labels; Read each match and keep only the ones whose enclosing call is a `NavigationLink`. A line-oriented `NavigationLink.*` pattern misses calls that swift-format wraps across lines. **Issue**: Deprecated, will be removed in future iOS versions **Fix**: Migrate to NavigationStack + NavigationPath pattern

9. Coordinator Pattern Violations (LOW)

**Pattern**: Navigation logic scattered across views **Search**: Multiple files with `path.append(`, navigation logic in leaf views **

Read more
@charleswiltgen
Ships withaxiom

Battle-tested skills, agents, and tools for modern Apple OS development — Swift 6, SwiftUI, Liquid Glass, Apple Intelligence, and more. Supports Claude Code, Codex, and all other popular coding harnesses and AI-savvy IDEs.

1.3k71 skills44 agents1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
1.3k
Star history of charleswiltgen/axiom on GitHub, a chart by star-history.com

Other skills on axiom.

axiom-accessibility

axiom-accessibility

Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance,…

axiom-ai

axiom-ai

Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation…

axiom-analyze-crash

axiom-analyze-crash

Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs…

More skills from other plugins.

deep-code-review

deep-code-review

In-depth design-focused code review - understands codebase context before evaluating PR changes, posts structured feedback to…

expo3d53k
@expo@expoInstall Skill
modlens

modlens

Plug-in vision for text-only models. Hard rule: when a file path or URL with an image extension (.png, .jpg, .jpeg, .webp, .gif,…

modlens2w4.6k
@liustack@liustackInstall Skill
appllama-app-design-skill

appllama-app-design-sk…

Build native-feeling, benchmark-quality mobile app screens (Expo / React Native). Use when designing or implementing any mobile…

appllama2mo3.9k
@appllama@appllamaInstall Skill

Questions about axiom-audit-swiftui-nav.

Which coding agents can use axiom-audit-swiftui-nav?
axiom-audit-swiftui-nav installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.