Lays the groundwork for the macOS (AppKit) and iOS (SwiftUI) clients with a shared Swift core wrapping the C ABI, mirroring the proven Windows VoiceCat.Interop layer. Architecture decision: macOS UI = AppKit (not SwiftUI) for the most mature VoiceOver accessibility story — same rationale as the Windows client's WinForms-over-WinUI-3 decision. iOS stays SwiftUI. Recorded in docs/roadmap.md §2. Build infrastructure (Phase 0): - clients/apple/scripts/build-xcframework.sh: runs cmake --preset apple-dev, merges libvoicecat.a + 107 vcpkg static deps into a single ~30 MB fat static library (libvoicecat-fat.a) via libtool -static (SPM binary targets link one .a per slice), stages voicecat.h + a generated module.modulemap (module VoiceCatC) into the headers, runs xcodebuild -create-xcframework -> clients/apple/VoiceCatCore.xcframework. VoiceCatCore Swift Package (Phase 1): - Package.swift: binary target (VoiceCatCoreXCF) + library (VoiceCatCore) + test target. - Sources/VoiceCatCore/: 7 files mirroring the C# VoiceCat.Interop patterns adapted to Swift native C interop — Enums (9 Swift mirrors of C enums, UInt32-backed), Config, Event (copies ev.text to String inside the callback — the #1 lifetime rule), Models (10 Swift value types), Marshaling (C arrays -> Swift + immediate vc_free_*), Callbacks (@convention(c) + Unmanaged.passUnretained, the Swift analog of C#'s [UnmanagedCallersOnly] + GCHandle), VoiceCatClient (owns vc_client* as OpaquePointer, all 38 C ABI functions, deinit -> vc_client_destroy then frees config CStrings, event delivery on main queue via coalesced DispatchQueue.main drain). Tests — 6/6 green (swift test against a real voicecat-server): - testConnectTofuAuthListChannelsRoundTrips, testAdminChannelCrudAccountCrudRoundTrips, testScreenAudioStreamStartsAndStops, testPerStreamRecvControlsRoundTrip, plus two static smoke tests. Catches Swift-specific interop bugs (@convention(c) callback lifetime, Unmanaged pointer resolution, CString memory management, enum raw-value bridging, struct layout) that C++ ctest cannot. C++ suite still 21/21 green. Docs updated (house rule): tech-stack.md §2, architecture.md §4, roadmap.md M4 + §2, clients/apple/README.md (full rewrite), PROGRESS.md, .gitignore.
49 lines
784 B
Plaintext
49 lines
784 B
Plaintext
# Build output
|
|
/build/
|
|
/out/
|
|
*.o
|
|
*.obj
|
|
*.a
|
|
*.lib
|
|
*.so
|
|
*.dylib
|
|
*.dll
|
|
*.exe
|
|
*.pdb
|
|
|
|
# vcpkg
|
|
/vcpkg_installed/
|
|
/vcpkg/
|
|
|
|
# Generated protobuf
|
|
*.pb.cc
|
|
*.pb.h
|
|
*_pb2.py
|
|
|
|
# Server runtime data (self-host data dir, keys, db)
|
|
/voicecat-data/
|
|
*.sqlite
|
|
*.sqlite-*
|
|
|
|
# IDE / OS
|
|
.vs/
|
|
.vscode/
|
|
.idea/
|
|
*.user
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# Apple / Windows client build artifacts (added in M4)
|
|
clients/apple/**/build/
|
|
clients/apple/**/*.xcodeproj/xcuserdata/
|
|
clients/apple/**/*.xcframework/
|
|
clients/windows/**/bin/
|
|
clients/windows/**/obj/
|
|
# SwiftPM build artifacts
|
|
clients/apple/.build/
|
|
clients/apple/Package.resolved
|
|
|
|
# Test artifacts: TOFU pin store written by vc_client during headless tests
|
|
# (core/src/core/client.cpp falls back to this relative path when tofu_store_path is unset).
|
|
voicecat_tofu_pins.txt
|