Skip to content

macOS GUI dual-track bundle — SwiftUI app + sign/notarize/staple pipeline#93

Merged
kiki830621 merged 3 commits into
mainfrom
idd/87-gui-app-dual-track
Jul 10, 2026
Merged

macOS GUI dual-track bundle — SwiftUI app + sign/notarize/staple pipeline#93
kiki830621 merged 3 commits into
mainfrom
idd/87-gui-app-dual-track

Conversation

@kiki830621

Copy link
Copy Markdown
Member

Implements the #87 roadmap item as Spectra change gui-app-dual-track (4 artifacts in-repo).

What

  • bestasr-gui SwiftUI app (new SwiftPM target pair: BestASRGUICore testable logic + thin executable): file picker/drag-and-drop, language/effort/format pickers (persisted via AppStorage, vocabularies derived from core types), stage+elapsed progress (honest — engines expose no percentage), result preview + reveal-in-Finder, verbatim typed-error failure state. Written under apple-xcode-skills:swiftui-specialist (per-section View structs, @mainactor @observable, Equatable payloads, narrow inputs).
  • scripts/release-app.sh: universal build → bestASR.app assembly → Developer ID sign (nested-first) → notarize → staple + validate (the bundle-only offline-Gatekeeper win) → zip; --assemble-only unsigned mode keeps structure testable without credentials.
  • Tests: 6 session state-machine tests (gate-driven, no sleeps) + a bundle-structure smoke test with stub binaries. README gains the .app track.

Field notes

  • The issue's original bundle layout is impossible on default APFS (case-insensitive): bestasr IS bestASR, so copying the CLI overwrote the GUI. Caught by the smoke test's first run; the CLI ships as bestasr-cli, spec/design updated first per Spectra discipline.
  • swift build accepts one --product per invocation (a triple-flag call silently builds only the last) — the script loops.
  • Verify (3 opus lenses) found a real HIGH: /bin/bash 3.2 aborts on empty-array expansion under set -u, which would kill the release build exactly on the recommended Xcode-toolchain path — guarded in release-app.sh and the same latent defect in release-mcp.sh + install.sh (sister sweep). Plus a MEDIUM (version parse now enum-scoped + semver-asserted).

Verification

Additive: CLI / MCP server / plugin ~/bin distribution untouched (only Package.swift + README touched among existing files).

Refs #87

…e pipeline (#87)

New bestasr-gui SwiftUI app (BestASRGUICore session state machine over an
injected CommandCore runner; file picker + drag-and-drop, language/effort/
format pickers persisted via AppStorage, stage+elapsed progress, result
preview + reveal-in-Finder, verbatim typed-error failure state) and
scripts/release-app.sh (universal build → bundle assembly → Developer ID
sign nested-first → notarize → staple + validate → zip; --assemble-only
unsigned mode for tests/CI).

The CLI ships inside the bundle as bestasr-cli: default APFS is
case-insensitive, so a 'bestasr' entry is the same file as the 'bestASR'
GUI executable — the issue's original layout silently overwrites the GUI
(caught by BundleAssemblyTests; spec/design updated first per Spectra
discipline). swift build takes one --product per invocation — the script
loops (a triple-flag call silently builds only the last product).

335 tests green; real universal (arm64+x86_64) assemble verified; GUI
launch smoke OK.

Refs #87
…ed version parse (verify #87)

HIGH: /bin/bash 3.2 (the shebang/stock-macOS shell) aborts on expanding an
empty array under set -u — "${BUILD_ENV[@]}" killed the build exactly on
the recommended Xcode-toolchain path. Guarded as ${BUILD_ENV[@]+...} in
release-app.sh, and the same latent defect in release-mcp.sh and install.sh
(sister-occurrence sweep). Verified empirically under /bin/bash 3.2.

MEDIUM: the Info.plist version parse is now scoped to the BestASRVersion
enum block and semver-shape-asserted — a second numeric 'static let current'
elsewhere in DataModels.swift can no longer be silently baked into a release.

Also: design D4 no longer implies a GUI diarize control (defaults false, no
v1 control); install.sh notes the bare build now rides along the GUI target.

Refs #87
@kiki830621
kiki830621 marked this pull request as ready for review July 10, 2026 00:15
@kiki830621
kiki830621 merged commit 328846d into main Jul 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant