diff --git a/scarf/scarf-ios/App/ScarfIOSApp.swift b/scarf/Scarf iOS/App/ScarfIOSApp.swift similarity index 100% rename from scarf/scarf-ios/App/ScarfIOSApp.swift rename to scarf/Scarf iOS/App/ScarfIOSApp.swift diff --git a/scarf/scarf-ios/Assets.xcassets/AccentColor.colorset/Contents.json b/scarf/Scarf iOS/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from scarf/scarf-ios/Assets.xcassets/AccentColor.colorset/Contents.json rename to scarf/Scarf iOS/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/scarf/scarf-ios/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/scarf/Scarf iOS/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png similarity index 100% rename from scarf/scarf-ios/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png rename to scarf/Scarf iOS/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png diff --git a/scarf/scarf-ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/scarf/Scarf iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from scarf/scarf-ios/Assets.xcassets/AppIcon.appiconset/Contents.json rename to scarf/Scarf iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/scarf/scarf-ios/Assets.xcassets/Contents.json b/scarf/Scarf iOS/Assets.xcassets/Contents.json similarity index 100% rename from scarf/scarf-ios/Assets.xcassets/Contents.json rename to scarf/Scarf iOS/Assets.xcassets/Contents.json diff --git a/scarf/scarf-ios/Dashboard/DashboardView.swift b/scarf/Scarf iOS/Dashboard/DashboardView.swift similarity index 100% rename from scarf/scarf-ios/Dashboard/DashboardView.swift rename to scarf/Scarf iOS/Dashboard/DashboardView.swift diff --git a/scarf/Scarf iOS/Info.plist b/scarf/Scarf iOS/Info.plist new file mode 100644 index 0000000..ca9a074 --- /dev/null +++ b/scarf/Scarf iOS/Info.plist @@ -0,0 +1,10 @@ + + + + + UIBackgroundModes + + remote-notification + + + diff --git a/scarf/scarf-ios/Onboarding/OnboardingRootView.swift b/scarf/Scarf iOS/Onboarding/OnboardingRootView.swift similarity index 100% rename from scarf/scarf-ios/Onboarding/OnboardingRootView.swift rename to scarf/Scarf iOS/Onboarding/OnboardingRootView.swift diff --git a/scarf/Scarf iOS/Scarf_iOS.entitlements b/scarf/Scarf iOS/Scarf_iOS.entitlements new file mode 100644 index 0000000..9e0940e --- /dev/null +++ b/scarf/Scarf iOS/Scarf_iOS.entitlements @@ -0,0 +1,14 @@ + + + + + aps-environment + development + com.apple.developer.icloud-container-identifiers + + com.apple.developer.icloud-services + + CloudKit + + + diff --git a/scarf/Scarf iOSTests/Scarf_iOSTests.swift b/scarf/Scarf iOSTests/Scarf_iOSTests.swift new file mode 100644 index 0000000..167b35e --- /dev/null +++ b/scarf/Scarf iOSTests/Scarf_iOSTests.swift @@ -0,0 +1,17 @@ +// +// Scarf_iOSTests.swift +// Scarf iOSTests +// +// Created by Alan Wizemann on 4/23/26. +// + +import Testing +@testable import Scarf_iOS + +struct Scarf_iOSTests { + + @Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. + } + +} diff --git a/scarf/Scarf iOSUITests/Scarf_iOSUITests.swift b/scarf/Scarf iOSUITests/Scarf_iOSUITests.swift new file mode 100644 index 0000000..e80e38a --- /dev/null +++ b/scarf/Scarf iOSUITests/Scarf_iOSUITests.swift @@ -0,0 +1,41 @@ +// +// Scarf_iOSUITests.swift +// Scarf iOSUITests +// +// Created by Alan Wizemann on 4/23/26. +// + +import XCTest + +final class Scarf_iOSUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + @MainActor + func testLaunchPerformance() throws { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } +} diff --git a/scarf/Scarf iOSUITests/Scarf_iOSUITestsLaunchTests.swift b/scarf/Scarf iOSUITests/Scarf_iOSUITestsLaunchTests.swift new file mode 100644 index 0000000..0b1db7d --- /dev/null +++ b/scarf/Scarf iOSUITests/Scarf_iOSUITestsLaunchTests.swift @@ -0,0 +1,33 @@ +// +// Scarf_iOSUITestsLaunchTests.swift +// Scarf iOSUITests +// +// Created by Alan Wizemann on 4/23/26. +// + +import XCTest + +final class Scarf_iOSUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + @MainActor + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/scarf/docs/iOS-SETUP.md b/scarf/docs/iOS-SETUP.md new file mode 100644 index 0000000..4280269 --- /dev/null +++ b/scarf/docs/iOS-SETUP.md @@ -0,0 +1,180 @@ +# Scarf Mobile — iOS build & setup + +The iOS app target (`scarf mobile`) is already set up inside the +shared `scarf.xcodeproj`. This document records what was done so +future contributors understand the project layout; the step-by-step +target-creation instructions that used to live here are moot now +that the target exists. + +## Layout + +``` +scarf/ + scarf.xcodeproj/ Single project, multiple targets: + - scarf (macOS app) + - scarf mobile (iOS app, Bundle com.scarf-mobile.app) + - Mac + iOS test bundles + Packages/ + ScarfCore/ Local SPM — shared platform-neutral code + (Models, Transport, Services, ViewModels, + ACP state machine). Consumed by BOTH + Mac and iOS targets. + ScarfIOS/ Local SPM — iOS-specific + (CitadelSSHService, CitadelServerTransport, + Keychain, UserDefaults-backed stores). + Consumed by iOS target only. + scarf/ PBXFileSystemSynchronizedRootGroup for Mac + target. Every .swift under this tree is + auto-compiled into the Mac app. + Scarf iOS/ PBXFileSystemSynchronizedRootGroup for + iOS target. Same auto-compile pattern. + App/ + ScarfIOSApp.swift @main entry point + Onboarding/ + OnboardingRootView.swift + Dashboard/ + DashboardView.swift + Assets.xcassets/ App icon + Scarf-teal accent color + Info.plist + Scarf_iOS.entitlements + Scarf iOSTests/ iOS unit tests (XCTest) + Scarf iOSUITests/ iOS UI tests (XCTest) +``` + +## Target settings + +As configured in `scarf.xcodeproj/project.pbxproj`: + +- **Product name**: `scarf mobile` +- **Folder name** (on disk): `Scarf iOS` +- **Bundle ID**: `com.scarf-mobile.app` +- **Deployment target**: iOS 18.0, iPhone-only +- **Team**: `3Q6X2L86C4` (shared with the Mac target) +- **Swift language version**: Swift 5 (matches Mac + both SPM packages) + +The product / folder naming mismatch is cosmetic — Xcode's +`PBXFileSystemSynchronizedRootGroup` decouples the two cleanly. + +## SPM dependencies + +Both local packages are wired into the iOS target in the pbxproj: + +- `ScarfCore` (local package at `Packages/ScarfCore`) → shared with Mac. +- `ScarfIOS` (local package at `Packages/ScarfIOS`) → iOS-only; pulls + `Citadel 0.12.x` transitively. + +On first open Xcode will resolve Citadel from GitHub (~30s-1min). +Delete DerivedData + **File → Packages → Reset Package Caches** if +it stalls. + +## Build + run + +1. Open `scarf/scarf.xcodeproj`. +2. Scheme picker top-left → select **scarf mobile**. +3. Destination → any iPhone simulator on iOS 18+. +4. ⌘R. Expect onboarding → dashboard flow. + +Switch back to the Mac target with the scheme picker. + +## Smoke test — end-to-end against a real Hermes host + +1. Pick a host you own with a Hermes install at `~/.hermes/`. +2. Run the iOS app on a simulator or physical device. +3. Onboarding: enter the host, generate a new Ed25519 key, tap + **Copy** on the public-key screen, paste that line into + `~/.ssh/authorized_keys` on the remote, tap **I've added this key**. +4. If auth succeeds → **Connected** → Dashboard. +5. Dashboard should populate session stats + recent sessions within + a second or two (first load does a Citadel SSH handshake + SFTP + snapshot of `state.db`; subsequent refreshes reuse the same SSH + session). + +## Info.plist / entitlements + +Current iOS target is configured with: + +- `UIBackgroundModes: remote-notification` (in Info.plist) +- `aps-environment: development` (in Scarf_iOS.entitlements) +- `com.apple.developer.icloud-services: [CloudKit]` (in entitlements) + +These are Xcode's defaults from "Storage: CloudKit" + APNs-capable. +M2–M4 don't use any of them — no APNs in v1 per the plan, no +CloudKit at all. Leaving them in place for now since they're a +no-op; strip during M6 polish if App Store Review flags anything. + +## Test targets + +`Scarf iOSTests/Scarf_iOSTests.swift` and +`Scarf iOSUITests/Scarf_iOSUITests*.swift` are Xcode-scaffolded +placeholders. Real iOS behavioural coverage lives in: + +- `Packages/ScarfCore/Tests/ScarfCoreTests/` — 96+ tests, all + runnable on Linux CI via `docker run --rm -v + $PWD/Packages/ScarfCore:/work -w /work swift:6.0 swift test`. +- `Packages/ScarfIOS/Tests/ScarfIOSTests/` — Apple-only smoke tests + (Ed25519 keygen + OpenSSH wire format). + +## TestFlight upload + +1. Scheme: **scarf mobile**. Destination: **Any iOS Device (arm64)** + or a physical iPhone. +2. **Product → Archive**. +3. **Window → Organizer → Distribute App → App Store Connect → + Upload**. +4. First upload creates the App Store Connect app record with + Bundle ID `com.scarf-mobile.app` under team `3Q6X2L86C4`. +5. Invite testers. + +No network-usage `Info.plist` key needed — Citadel uses SwiftNIO +sockets, not Apple's local-network discovery. + +## Milestone coverage + +- **M0–M1**: ScarfCore extraction + `ACPChannel` protocol + decoupled + `ACPClient`. All Mac-only code; iOS target didn't exist yet. +- **M2**: Onboarding + SSH key generate/import + Keychain storage + + Citadel-backed "Test Connection" + Dashboard placeholder. +- **M3**: Real iOS `CitadelServerTransport` + live Dashboard data. +- **M4** *(in progress)*: iOS Chat via an `SSHExecACPChannel` built + on Citadel's raw exec channel. Plugs into `ACPClient.ChannelFactory` + (defined in M1), same JSON-RPC state machine as Mac. +- **M5**: Memory editor, Cron, Skills, Settings on iOS. +- **M6**: Polish, App Store submission. + +## Troubleshooting + +**Citadel fails to resolve.** Delete DerivedData +(`~/Library/Developer/Xcode/DerivedData/scarf-*`) then **File → +Packages → Reset Package Caches**; rebuild. + +**`Cannot find 'Process' in scope` when building scarf mobile.** +`ServerTransport.makeProcess` is guarded with `#if !os(iOS)` as of +M3. If this appears, grep the iOS target's membership for a stray +file referencing `Process()` directly. + +**`SSHAuthenticationMethod` has no member `ed25519`.** Shouldn't +happen against Citadel 0.12.x (verified against 0.12.1 source). +If you bump the pin to 0.13+, check the current +`Sources/Citadel/SSHAuthenticationMethod.swift` — one line to update +in `ScarfIOS/CitadelSSHService.buildClientSettings(...)`. + +**Dashboard says "Couldn't read the Hermes database".** Expected on +fresh Hermes installs where `~/.hermes/state.db` doesn't exist. +Start a Hermes session on the host first, then pull-to-refresh. + +**Slow first-connect (10+ seconds).** Citadel's SSH handshake + +SFTP open is the critical path. If it's consistently that slow, +check that plain `ssh` works to the same host from a terminal with +the same key; sometimes the issue is a restricted login shell that +won't let `sqlite3` run. + +**Keychain blank after relaunch.** Verify `kSecAttrAccessible` is +`AfterFirstUnlockThisDeviceOnly` (the default). Biometric-required +accessibility values would block startup reads from background tasks. + +**Exported public key doesn't match what `ssh-keygen -y` produces +from the stored private.** Correct — the **public** half is standard +OpenSSH wire format (interop-safe with `authorized_keys`); the +**private** half uses a Scarf-internal compact PEM (see +`Packages/ScarfIOS/Sources/ScarfIOS/Ed25519KeyGenerator.swift`). +Export to `~/.ssh/id_ed25519` format is planned for a future phase. diff --git a/scarf/scarf-ios/SETUP.md b/scarf/scarf-ios/SETUP.md deleted file mode 100644 index 69319f9..0000000 --- a/scarf/scarf-ios/SETUP.md +++ /dev/null @@ -1,195 +0,0 @@ -# scarf-ios — Xcode target setup - -This folder contains the source tree for the iOS app (`scarf-ios`). -The Xcode target itself is added to the **existing `scarf.xcodeproj`** -as a second target alongside the Mac `scarf` target — **not** a -separate `.xcodeproj`. One project, two targets. - -Everything the app needs — SSH key generation, Keychain storage, -onboarding state machine, Citadel-backed SSH client, SQLite-backed -Dashboard — already lives in the shared SPM packages -(`Packages/ScarfCore`, `Packages/ScarfIOS`) and is exercised by -96 passing unit tests on Linux CI. The iOS target is mostly just a -wrapper that assembles those packages behind a `@main` SwiftUI app. - -Creating the target is a one-time ~5-minute step in Xcode's UI. - -## One-time: add the iOS target to the existing project - -1. Open `scarf/scarf.xcodeproj` in **Xcode**. -2. Select the project in the Project Navigator. -3. **File → New → Target…** (or use the `+` button at the bottom of - the targets list). -4. Choose **iOS → App**. Click Next. -5. Fill in: - - **Product Name**: `scarf-ios` - - **Team**: `3Q6X2L86C4` (the same team the Mac target uses) - - **Organization Identifier**: `com.scarf` - - **Bundle Identifier** will be `com.scarf.scarf-ios` - - **Interface**: **SwiftUI** - - **Language**: **Swift** - - **Storage**: **None** - - **Include Tests**: unchecked (SPM covers them) -6. Click **Finish**. Xcode creates the target plus a default source - tree under `scarf/scarf-ios/` (a folder you'll immediately throw - away, since our real source lives there already). -7. If Xcode asks about "Activate scheme": **yes**. - -## One-time: target settings - -With the `scarf-ios` target selected in the project editor: - -1. **General → Minimum Deployments → iPhone**: `iOS 18.0`. -2. **General → Supported Destinations**: keep **iPhone** only. Remove - iPad + Mac Catalyst + Vision. -3. **Signing & Capabilities → Team**: `3Q6X2L86C4` (should have - auto-filled from step 5 above). -4. **Build Settings → Swift Language Version**: `Swift 5` (matches - the Mac target + both SPM packages). - -## One-time: link the SPM packages to the iOS target - -`ScarfCore` and `ScarfIOS` are already in the project's package -references (the Mac target already uses ScarfCore). You only need to -add them to the NEW iOS target. - -1. Select the project in the navigator → select the `scarf-ios` - target → **General → Frameworks, Libraries, and Embedded - Content**. -2. Click the `+` button. -3. Select **ScarfCore** (library from ScarfCore local package). Add. -4. Click `+` again. Select **ScarfIOS**. Add. -5. Citadel is pulled in transitively by ScarfIOS — no need to add it - explicitly. On first build Xcode resolves it from GitHub - (~30s-1min). - -## One-time: replace the default source tree - -1. In Xcode's Project Navigator, find the `scarf-ios` group Xcode - created. Delete: - - `scarf_iosApp.swift` (or `scarf-iosApp.swift`) - - `ContentView.swift` - - **`Assets.xcassets`** — we ship our own pre-built one. -2. In Finder, open `/scarf/scarf-ios/`. Drag these four folders - onto the `scarf-ios` group in Xcode: - - `App/` - - `Onboarding/` - - `Dashboard/` - - `Assets.xcassets/` -3. In the import sheet: - - **Destination**: Copy items if needed — **unchecked** (they're - already in place). - - **Added folders**: **Create groups**. - - **Add to targets**: **scarf-ios** only. -4. Build (`⌘B`). Should compile cleanly against Citadel 0.12.1 — - every API call in `CitadelSSHService` + `CitadelServerTransport` - was cross-checked against the 0.12.1 tag. If you've bumped the - pin to 0.13+ and something fails, check - `Sources/Citadel/SSHAuthenticationMethod.swift` for the current - `.ed25519(username:privateKey:)` spelling. - -## App icon + accent color - -Already in `Assets.xcassets/` so you don't configure anything: - -- **`AppIcon.appiconset/AppIcon-1024.png`** — the 1024×1024 Scarf - icon copied from the Mac app's icon set. iOS 14+ renders all - smaller sizes automatically from the single 1024 image. -- **`AccentColor.colorset`** — custom Scarf teal (sRGB `0.227 / - 0.525 / 0.722` light mode; `0.400 / 0.690 / 0.902` dark). Edit - `Contents.json` or Xcode's color picker to change. - -## Info.plist for TestFlight - -Under the scarf-ios target → **Info → Custom iOS Target Properties**: - -- `LSRequiresIPhoneOS = YES` (usually defaulted) -- `UIApplicationSceneManifest → UIApplicationSupportsMultipleScenes = NO` - (iPhone single-window) -- `UILaunchScreen` — empty dictionary is fine - -Citadel uses SwiftNIO, not Apple's local-network discovery, so no -network-usage-description key is needed. - -## Smoke test - -1. Switch the run destination to an iPhone simulator (any iPhone - running iOS 18+). Xcode's target switcher lets you toggle between - scarf (macOS) and scarf-ios. -2. ⌘R. Expect the onboarding flow: - **Remote host** → **SSH key choice** → **Generate** → **Show - public key** → **I've added this** → **Test connection** → ... -3. On **Show public key**, the OpenSSH line is selectable + copyable - (`ssh-ed25519 AAAA… scarf-iphone-XXXX`). -4. Without a real SSH server, **Test connection** will fail with - `.hostUnreachable` — that's expected. Land on the **Connection - failed** screen with a **Retry** button. -5. Real end-to-end: use a host you own. Copy the shown public key - into `~/.ssh/authorized_keys` on that host. Tap **Retry**. You - should reach **Connected** → **Dashboard**, which then does a - Citadel SFTP snapshot of `~/.hermes/state.db` and renders - session + token stats. - -## TestFlight upload - -1. Scheme selector top-left → **scarf-ios**. Destination: **Any iOS - Device (arm64)** or a physical iPhone. -2. **Product → Archive**. -3. **Window → Organizer → Archives → Distribute App → App Store - Connect → Upload**. -4. First upload creates the App Store Connect app record with - `com.scarf.scarf-ios`. Same team as the Mac app. -5. Invite testers from App Store Connect. - -## What's in each milestone - -- **M2** — Onboarding (SSH key + Keychain), Citadel-based - "Test Connection", Dashboard placeholder. -- **M3** — Real Dashboard via `CitadelServerTransport` + - `HermesDataService` (you're running the M3 PR now). -- **M4** — Chat over an iOS `SSHExecACPChannel`. -- **M5** — Memory editing, Cron, Skills, Settings. -- **M6** — Polish + App Store submission. - -## Troubleshooting - -**Citadel fails to resolve.** Delete DerivedData -(`~/Library/Developer/Xcode/DerivedData/scarf-*`) and **File → -Packages → Reset Package Caches**, then rebuild. - -**`Cannot find 'Process' in scope` when building scarf-ios.** Should -not happen post-M3 — the `makeProcess` protocol method is now -`#if !os(iOS)`-guarded. If you see this: grep the scarf-ios target's -source files for `Process()`, `process.isRunning`, or `terminationHandler` -— something Mac-only leaked into the iOS target's membership. - -**`SSHAuthenticationMethod` has no member `ed25519`.** Shouldn't happen -against Citadel 0.12.1 (verified), but historically the private-key -variant names have changed between minor versions (0.7 → 0.9 → 0.12). -See `CitadelSSHService.buildClientSettings(...)` in ScarfIOS — one -line to update. Keep the protocol conformance intact. - -**Dashboard shows "Couldn't read the Hermes database".** Expected if -the host's `~/.hermes/state.db` doesn't exist yet (fresh Hermes -install). Start a Hermes session on the host first, then pull-to- -refresh. - -**Dashboard spins forever on first connect.** Citadel connection -hand-shake + SFTP open can take 5-10s on a cold network. If it's -longer, check that the same SSH key works from a regular `ssh` client -against the same host — sometimes the issue is an authorized_keys -line with a trailing whitespace, or the host uses a restricted shell -that blocks `sqlite3`. - -**Keychain reads empty after relaunch.** Check you haven't set -`kSecAttrAccessible` to a biometric-required value. We use -`AfterFirstUnlockThisDeviceOnly`, which is readable any time after -the first post-boot unlock. - -**The public-key line doesn't match what `ssh-keygen` would produce -from the same private key.** The **public** key is standard OpenSSH -wire format (interop-safe with `authorized_keys`). The **private** -key uses a compact Scarf-internal PEM (see -`ScarfIOS/Ed25519KeyGenerator.swift`) — it's not directly exportable -to `~/.ssh/id_ed25519`. A future phase adds an export flow that -re-serializes to standard OpenSSH PEM. diff --git a/scarf/scarf.xcodeproj/project.pbxproj b/scarf/scarf.xcodeproj/project.pbxproj index eb33ee2..6a15517 100644 --- a/scarf/scarf.xcodeproj/project.pbxproj +++ b/scarf/scarf.xcodeproj/project.pbxproj @@ -9,10 +9,26 @@ /* Begin PBXBuildFile section */ 53495AB62F7B992C00BD31AD /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 53SWIFTTERM0001 /* SwiftTerm */; }; 53SCARFCORE0010 /* ScarfCore in Frameworks */ = {isa = PBXBuildFile; productRef = 53SCARFCORE0001 /* ScarfCore */; }; + 53SCARFCORE0011 /* ScarfCore in Frameworks (iOS) */ = {isa = PBXBuildFile; productRef = 53SCARFCORE0002 /* ScarfCore */; }; + 53SCARFIOS0010 /* ScarfIOS in Frameworks */ = {isa = PBXBuildFile; productRef = 53SCARFIOS0001 /* ScarfIOS */; }; 53SPARKLE00010 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 53SPARKLE00011 /* Sparkle */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 4EAC233A2F99930100654F42 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 534959382F7B83B600BD31AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4EAC23282F99930000654F42; + remoteInfo = "Scarf iOS"; + }; + 4EAC23442F99930100654F42 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 534959382F7B83B600BD31AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4EAC23282F99930000654F42; + remoteInfo = "Scarf iOS"; + }; 534959502F7B83B700BD31AD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 534959382F7B83B600BD31AD /* Project object */; @@ -30,12 +46,22 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 4EAC23292F99930000654F42 /* scarf mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "scarf mobile.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Scarf iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Scarf iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 534959402F7B83B600BD31AD /* scarf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = scarf.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5349594F2F7B83B700BD31AD /* scarfTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 534959592F7B83B700BD31AD /* scarfUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4EAC234B2F99930100654F42 /* Exceptions for "Scarf iOS" folder in "scarf mobile" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4EAC23282F99930000654F42 /* scarf mobile */; + }; 534959AA2F7B83B600BD31AD /* Exceptions for "scarf" folder in "scarf" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( @@ -46,6 +72,24 @@ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ + 4EAC232A2F99930000654F42 /* Scarf iOS */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4EAC234B2F99930100654F42 /* Exceptions for "Scarf iOS" folder in "scarf mobile" target */, + ); + path = "Scarf iOS"; + sourceTree = ""; + }; + 4EAC233C2F99930100654F42 /* Scarf iOSTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "Scarf iOSTests"; + sourceTree = ""; + }; + 4EAC23462F99930100654F42 /* Scarf iOSUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "Scarf iOSUITests"; + sourceTree = ""; + }; 534959422F7B83B600BD31AD /* scarf */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( @@ -67,6 +111,29 @@ /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ + 4EAC23262F99930000654F42 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53SCARFCORE0011 /* ScarfCore in Frameworks (iOS) */, + 53SCARFIOS0010 /* ScarfIOS in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC23362F99930100654F42 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC23402F99930100654F42 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5349593D2F7B83B600BD31AD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -100,6 +167,9 @@ 534959422F7B83B600BD31AD /* scarf */, 534959522F7B83B700BD31AD /* scarfTests */, 5349595C2F7B83B700BD31AD /* scarfUITests */, + 4EAC232A2F99930000654F42 /* Scarf iOS */, + 4EAC233C2F99930100654F42 /* Scarf iOSTests */, + 4EAC23462F99930100654F42 /* Scarf iOSUITests */, 534959412F7B83B600BD31AD /* Products */, ); sourceTree = ""; @@ -110,6 +180,9 @@ 534959402F7B83B600BD31AD /* scarf.app */, 5349594F2F7B83B700BD31AD /* scarfTests.xctest */, 534959592F7B83B700BD31AD /* scarfUITests.xctest */, + 4EAC23292F99930000654F42 /* scarf mobile.app */, + 4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */, + 4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */, ); name = Products; sourceTree = ""; @@ -117,6 +190,76 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 4EAC23282F99930000654F42 /* scarf mobile */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EAC234C2F99930100654F42 /* Build configuration list for PBXNativeTarget "scarf mobile" */; + buildPhases = ( + 4EAC23252F99930000654F42 /* Sources */, + 4EAC23262F99930000654F42 /* Frameworks */, + 4EAC23272F99930000654F42 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4EAC232A2F99930000654F42 /* Scarf iOS */, + ); + name = "scarf mobile"; + packageProductDependencies = ( + 53SCARFCORE0002 /* ScarfCore */, + 53SCARFIOS0001 /* ScarfIOS */, + ); + productName = "Scarf iOS"; + productReference = 4EAC23292F99930000654F42 /* scarf mobile.app */; + productType = "com.apple.product-type.application"; + }; + 4EAC23382F99930100654F42 /* Scarf iOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EAC234F2F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSTests" */; + buildPhases = ( + 4EAC23352F99930100654F42 /* Sources */, + 4EAC23362F99930100654F42 /* Frameworks */, + 4EAC23372F99930100654F42 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4EAC233B2F99930100654F42 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4EAC233C2F99930100654F42 /* Scarf iOSTests */, + ); + name = "Scarf iOSTests"; + packageProductDependencies = ( + ); + productName = "Scarf iOSTests"; + productReference = 4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4EAC23422F99930100654F42 /* Scarf iOSUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EAC23522F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSUITests" */; + buildPhases = ( + 4EAC233F2F99930100654F42 /* Sources */, + 4EAC23402F99930100654F42 /* Frameworks */, + 4EAC23412F99930100654F42 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4EAC23452F99930100654F42 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4EAC23462F99930100654F42 /* Scarf iOSUITests */, + ); + name = "Scarf iOSUITests"; + packageProductDependencies = ( + ); + productName = "Scarf iOSUITests"; + productReference = 4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 5349593F2F7B83B600BD31AD /* scarf */ = { isa = PBXNativeTarget; buildConfigurationList = 534959632F7B83B700BD31AD /* Build configuration list for PBXNativeTarget "scarf" */; @@ -195,9 +338,20 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 2630; + LastSwiftUpdateCheck = 2620; LastUpgradeCheck = 2630; TargetAttributes = { + 4EAC23282F99930000654F42 = { + CreatedOnToolsVersion = 26.2; + }; + 4EAC23382F99930100654F42 = { + CreatedOnToolsVersion = 26.2; + TestTargetID = 4EAC23282F99930000654F42; + }; + 4EAC23422F99930100654F42 = { + CreatedOnToolsVersion = 26.2; + TestTargetID = 4EAC23282F99930000654F42; + }; 5349593F2F7B83B600BD31AD = { CreatedOnToolsVersion = 26.3; }; @@ -229,6 +383,7 @@ packageReferences = ( 53SWIFTTERM0002 /* XCRemoteSwiftPackageReference "SwiftTerm" */, 53SCARFCORE0020 /* XCLocalSwiftPackageReference "Packages/ScarfCore" */, + 53SCARFIOS0020 /* XCLocalSwiftPackageReference "Packages/ScarfIOS" */, 53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */, ); preferredProjectObjectVersion = 77; @@ -239,11 +394,35 @@ 5349593F2F7B83B600BD31AD /* scarf */, 5349594E2F7B83B700BD31AD /* scarfTests */, 534959582F7B83B700BD31AD /* scarfUITests */, + 4EAC23282F99930000654F42 /* scarf mobile */, + 4EAC23382F99930100654F42 /* Scarf iOSTests */, + 4EAC23422F99930100654F42 /* Scarf iOSUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 4EAC23272F99930000654F42 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC23372F99930100654F42 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC23412F99930100654F42 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5349593E2F7B83B600BD31AD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -268,6 +447,27 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4EAC23252F99930000654F42 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC23352F99930100654F42 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EAC233F2F99930100654F42 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5349593C2F7B83B600BD31AD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -292,6 +492,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 4EAC233B2F99930100654F42 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4EAC23282F99930000654F42 /* scarf mobile */; + targetProxy = 4EAC233A2F99930100654F42 /* PBXContainerItemProxy */; + }; + 4EAC23452F99930100654F42 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4EAC23282F99930000654F42 /* scarf mobile */; + targetProxy = 4EAC23442F99930100654F42 /* PBXContainerItemProxy */; + }; 534959512F7B83B700BD31AD /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 5349593F2F7B83B600BD31AD /* scarf */; @@ -305,6 +515,175 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 4EAC234D2F99930100654F42 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Scarf iOS/Scarf_iOS.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Scarf iOS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Scarf Mobile"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarf-mobile.app"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4EAC234E2F99930100654F42 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Scarf iOS/Scarf_iOS.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Scarf iOS/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Scarf Mobile"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.scarf-mobile.app"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4EAC23502F99930100654F42 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Scarf iOS.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Scarf iOS"; + }; + name = Debug; + }; + 4EAC23512F99930100654F42 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Scarf iOS.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Scarf iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4EAC23532F99930100654F42 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Scarf iOS"; + }; + name = Debug; + }; + 4EAC23542F99930100654F42 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 3Q6X2L86C4; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 26.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Scarf iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 534959612F7B83B700BD31AD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -448,6 +827,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = scarf/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Scarf; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -483,6 +863,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = scarf/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Scarf; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", @@ -588,6 +969,33 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 4EAC234C2F99930100654F42 /* Build configuration list for PBXNativeTarget "scarf mobile" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4EAC234D2F99930100654F42 /* Debug */, + 4EAC234E2F99930100654F42 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4EAC234F2F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4EAC23502F99930100654F42 /* Debug */, + 4EAC23512F99930100654F42 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4EAC23522F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4EAC23532F99930100654F42 /* Debug */, + 4EAC23542F99930100654F42 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5349593B2F7B83B600BD31AD /* Build configuration list for PBXProject "scarf" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -631,6 +1039,10 @@ isa = XCLocalSwiftPackageReference; relativePath = Packages/ScarfCore; }; + 53SCARFIOS0020 /* XCLocalSwiftPackageReference "Packages/ScarfIOS" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Packages/ScarfIOS; + }; /* End XCLocalSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */ @@ -657,6 +1069,14 @@ isa = XCSwiftPackageProductDependency; productName = ScarfCore; }; + 53SCARFCORE0002 /* ScarfCore */ = { + isa = XCSwiftPackageProductDependency; + productName = ScarfCore; + }; + 53SCARFIOS0001 /* ScarfIOS */ = { + isa = XCSwiftPackageProductDependency; + productName = ScarfIOS; + }; 53SPARKLE00011 /* Sparkle */ = { isa = XCSwiftPackageProductDependency; package = 53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */;