What's Changed
Fixes a packaging bug from v1.0 that could show "Berthly.app is damaged and can't be opened, move to Trash" for anyone who extracted the release with unzip from a shell instead of double-clicking in Finder. Every build file carries a kernel-set com.apple.provenance extended attribute; zip can't hold extended attributes natively, so ditto AppleDouble-encodes it into the archive. Finder/Archive Utility reconstitutes that correctly on extraction, but plain unzip doesn't, and materializes literal ._* files that corrupt Sparkle's nested Installer.xpc code signature.
Distribution now ships as a .dmg instead of a .zip, which sidesteps the whole failure class rather than working around it — a DMG is a real filesystem image, so extended attributes live on it natively with no encoding step to get wrong. Sparkle 2.x supports .dmg update packages directly, so this covers both the manual GitHub download and the in-app auto-update with one artifact.
Also adds scripts/smoke.sh, which checks an installed Berthly.app directly — code signing, Gatekeeper/notarization acceptance, Info.plist sanity, and the Sparkle appcast's reachability/shape. This closes a gap the existing UI/E2E test suites structurally can't reach: they exercise a re-signed, ad-hoc test build, never the real notarized artifact a user actually downloads — which is exactly how this bug shipped undetected in v1.0.
Testing
This release shipped only after its gate run passed on the release commit:
- 417 unit tests passed — 88% line coverage of the pure
logic layer (Berthly/Coremodels, mapping, and planning; 55%
including the daemon/terminal I/O plumbing, which the end-to-end suite
exercises against a real daemon instead). - 42 UI tests (deterministic mock-daemon XCUITest) and
13 real-daemon end-to-end journeys guard the UI wiring and the
daemon integration. SwiftUI view bodies are covered by these suites, not
unit tests, by design.
Full Changelog: v1.0...v1.0.1