mirror of
https://github.com/awizemann/scarf.git
synced 2026-05-10 10:36:35 +00:00
f6f31cabe4
The initial M0a commit was incomplete: .gitignore's `Packages/` rule
(meant for the legacy pre-Xcode-14 SwiftPM checkout dir) silently
swallowed three new files that SHOULD have been committed:
- scarf/Packages/ScarfCore/Package.swift
- scarf/Packages/ScarfCore/Sources/ScarfCore/Models/HermesConstants.swift
- scarf/Packages/ScarfCore/Tests/ScarfCoreTests/ScarfCoreSmokeTests.swift
The 12 moved models slipped through because `git mv` preserves tracking
across gitignored destinations, but new files in that tree did not.
Fix: add `!scarf/Packages/` override so our local SPM package is always
tracked; keep the top-level `Packages/` ignore for the historical case.
Also verified M0a builds + tests green on Linux via
`docker run --rm -v $PWD/scarf/Packages/ScarfCore:/work -w /work swift:6.0 swift test`.
To make that work, two small, Apple-platform-preserving guards:
- `sqliteTransient` in HermesConstants.swift wrapped in
`#if canImport(SQLite3)` — SQLite3 is not a system module on Linux
swift-corelibs-foundation. Apple builds compile unchanged.
- `ToolKind.displayName` and `MCPTransport.displayName` wrapped in
`#if canImport(Darwin)` — `LocalizedStringResource` is Apple-only.
Apple builds compile unchanged.
Additionally:
- Package.swift pinned to Swift 5 language mode, matching the Mac app's
`SWIFT_VERSION = 5.0`. Two types (`ACPEvent.availableCommands` and
`ACPToolCallEvent.rawInput`) claim `Sendable` while carrying
`[String: Any]` — strict Swift 6 rejects that. Comment in Package.swift
flags this for a future typed-payloads cleanup + bump to `.v6`.
- ScarfCoreSmokeTests now contains 16 tests exercising every M0a
`public init` so parameter drift fails CI instead of a reviewer.
- IOS_PORT_PLAN.md updated with what actually shipped, the Linux-CI
guards + patterns future phases should reuse, and the Sendable
follow-up flagged under "Rules next phases can rely on".
Test results (Linux, Swift 6.0.3):
Suite M0aPublicInitTests: 15 tests passed
Suite ScarfCoreSmokeTests: 1 test passed
Total: 16 / 16 passed
https://claude.ai/code/session_019yMRP6mwZWfzVrPTqevx2y
52 lines
1.8 KiB
Swift
52 lines
1.8 KiB
Swift
// swift-tools-version: 6.0
|
|
// Platform-neutral core for the Scarf app family (macOS and iOS).
|
|
//
|
|
// `ScarfCore` holds types that do not depend on AppKit, UIKit, or any
|
|
// platform-specific system service. The macOS and iOS app targets each link
|
|
// this package and provide their own platform shells (Sparkle + SwiftTerm on
|
|
// macOS; Citadel-based SSH transport on iOS).
|
|
//
|
|
// Minimums are chosen to match the Mac app (macOS 14.6) and the locked
|
|
// v1 iOS decision (iOS 18). Raising iOS later is free; lowering is not —
|
|
// the ViewModels on `@Observable` / `NavigationStack` are iOS 17+ features
|
|
// and we standardize on iOS 18 for feature parity with the Mac codebase.
|
|
|
|
import PackageDescription
|
|
|
|
let package = Package(
|
|
name: "ScarfCore",
|
|
defaultLocalization: "en",
|
|
platforms: [
|
|
.macOS(.v14),
|
|
.iOS(.v18),
|
|
],
|
|
products: [
|
|
.library(
|
|
name: "ScarfCore",
|
|
targets: ["ScarfCore"]
|
|
),
|
|
],
|
|
targets: [
|
|
.target(
|
|
name: "ScarfCore",
|
|
path: "Sources/ScarfCore",
|
|
swiftSettings: [
|
|
// Swift 5 language mode mirrors the Mac app target's
|
|
// `SWIFT_VERSION = 5.0` build setting. Moving to strict
|
|
// Swift 6 concurrency is a real refactor — several types
|
|
// (`ACPEvent.availableCommands` carrying `[[String: Any]]`,
|
|
// `ACPToolCallEvent.rawInput: [String: Any]?`) claim
|
|
// `Sendable` without being strictly-Sendable. A follow-up
|
|
// phase will replace those with typed payloads, then this
|
|
// setting can bump to `.v6`.
|
|
.swiftLanguageMode(.v5),
|
|
]
|
|
),
|
|
.testTarget(
|
|
name: "ScarfCoreTests",
|
|
dependencies: ["ScarfCore"],
|
|
path: "Tests/ScarfCoreTests"
|
|
),
|
|
]
|
|
)
|