v0.9.2 — Second refactor patch (SaaSConfig extract + protocol alignment)
Second refactor patch
No new user-facing features. Clears the remaining HIGH + MED + LOW backlog items from the v0.9.0 deliver-phase review that v0.9.1 deferred. Risk-free upgrade — 319/69 tests stay GREEN with the same test bodies; UserDefaults + Keychain layout is byte-identical to v0.9.1 so every setting, hotkey, binding, and SaaS session round-trips clean.
Changed (internal)
SettingsStoregod-object trimmed (W1, HIGH) — extracted the Supabase project URL + anon key + the 4 SaaS factory helpers (authConfig/makeSessionStore/translateEndpoint/deviceIdentity) into a newAuth/SaaSConfig.swiftfile.SettingsStoredrops from 593 → 538 LOC and from owning 6 Supabase concepts down to 1 (just asaaSConfigreference). Future SaaS-only changes now live in one file.ScreenCaptureServiceprotocol shape aligned toOCREngine(MED-4) — dropped the unnecessary@MainActor+AnyObjectrequirements from the protocol. Production impl is still@MainActorwhere it needs to be; stubs in tests can now be plain structs. Cleans up the asymmetry the v0.9.0 review flagged.
Fixed
- Picker + capture hotkey recorder sheets share one helper now (LOW-2) — centralised the synthetic
Binding<HotkeyConfig>pattern intooptionalHotkeyBinding(_:fallback:)onSettingsView. Pre-allocatedHotkeyConfig.defaultPicker/.defaultCaptureconstants replace the per-render allocations.
Deferred to v0.9.3+
TranslationWorkflowClipboardRestoreTest— needsHUDPresenting+Pasteboardingprotocol extractions (own refactor commit).- Hardcoded Supabase anon-key + URL move to build-time
.xcconfig(now thatSaaSConfigis its own file, this becomes a one-line init-default change + a CI secret wiring step).
Install
- Sparkle OTA: v0.6.1+ users auto-update from inside the app — no action needed.
- Fresh install: download the DMG below → drag to /Applications.
Verify
- App: 319 Swift / 69 suites GREEN (unchanged from v0.9.1).
- Build: signed (Developer ID), notarized + stapled (DMG + Sparkle zip), EdDSA-signed appcast.