Summary
The iOS and macOS SwiftUI clients share identical HTTP + SSE client code and the AppStateViewModel. Rather than duplicating, extract a `TraverseCore` Swift package that both app targets import as a local dependency.
Depends on
Issues #44 (ios-swift) and #45 (macos-swift) — this issue should be implemented as part of or before #44/#45, not after.
Blocked on
Same as #44/#45: Traverse #525–#527
Package contents
```
apps/traverse-starter/TraverseCore/
Package.swift
Sources/TraverseCore/
TraverseClient.swift # URLSession HTTP + SSE
AppStateViewModel.swift # ObservableObject — subscribes to SSE
TraverseOutput.swift # Output type + parsing
TraverseCommand.swift # Command dispatch
ServerDiscovery.swift # .traverse/server.json reader (macOS only via conditional compile)
Tests/TraverseCoreTests/
TraverseClientTests.swift
AppStateViewModelTests.swift
TraverseOutputTests.swift
```
Definition of Done
Summary
The iOS and macOS SwiftUI clients share identical HTTP + SSE client code and the AppStateViewModel. Rather than duplicating, extract a `TraverseCore` Swift package that both app targets import as a local dependency.
Depends on
Issues #44 (ios-swift) and #45 (macos-swift) — this issue should be implemented as part of or before #44/#45, not after.
Blocked on
Same as #44/#45: Traverse #525–#527
Package contents
```
apps/traverse-starter/TraverseCore/
Package.swift
Sources/TraverseCore/
TraverseClient.swift # URLSession HTTP + SSE
AppStateViewModel.swift # ObservableObject — subscribes to SSE
TraverseOutput.swift # Output type + parsing
TraverseCommand.swift # Command dispatch
ServerDiscovery.swift # .traverse/server.json reader (macOS only via conditional compile)
Tests/TraverseCoreTests/
TraverseClientTests.swift
AppStateViewModelTests.swift
TraverseOutputTests.swift
```
Definition of Done