Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
YAML
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197# XcodeGen spec for the Mac App Store build of Menu Band.## This generates the Xcode app target needed for App Store archiving WITHOUT# committing a hand-authored .xcodeproj. SwiftPM (Package.swift) remains the# source of truth for the direct-download build; this is a parallel wrapper# that compiles the SAME Sources/MenuBand/*.swift into a signable .app with# the App Sandbox.## Usage:# brew install xcodegen # one-time# cd slab/menuband# xcodegen generate # writes MenuBand.xcodeproj (git-ignore it)# open MenuBand.xcodeproj# # then: sign in to your Apple ID, pick the FB5948YR3S team with automatic# # signing, Product > Archive, Distribute App > App Store Connect.## See STORE-APP-STORE.md for the full submission checklist + runtime tests.
name: MenuBand
options: bundleIdPrefix: computer.aestheticcomputer deploymentTarget: macOS: "11.0" createIntermediateGroups: true
settings: base: SWIFT_VERSION: "5.9" # The fork flag (gates global keystroke capture / hotkeys / stickies / # update-checker / crash-upload) AND the bundle-shim flag (supplies # Bundle.module for this non-SwiftPM target). See MASBundleShim.swift. SWIFT_ACTIVE_COMPILATION_CONDITIONS: MAC_APP_STORE XCODE_APP_TARGET # The one place the MAS version lives. Every Info plist in this project # (app + both .appex) reads it back as $(MARKETING_VERSION) / # $(CURRENT_PROJECT_VERSION), so the extensions can't drift behind the app # — a mismatch here is an App Store validation error, and the extensions # sat a build behind through the whole 1.5.3 release. # The direct-download build keeps its own literals in Info.plist (SwiftPM # never sees these settings); bump both when releasing. MARKETING_VERSION: "1.5.5" CURRENT_PROJECT_VERSION: "156"
targets: MenuBand: type: application platform: macOS deploymentTarget: "11.0"
sources: # All Swift under Sources/MenuBand (incl. KidLisp/ + PianoWaveformWindow/ # subdirs). Resources + the .metal are handled separately below so they # land FLATTENED in the app's Resources root — matching SwiftPM's # `.process("Resources")` behavior, which is what the existing # `Bundle.module.url(forResource:withExtension:)` (no subdirectory:) # lookups rely on. - path: Sources/MenuBand excludes: - "KidLisp/README.md" - "Resources/**" - "WaveformShaders.metalsource"
# Resource files → Copy Bundle Resources (flattened). verovio/sheet.html # + verovio-toolkit-wasm.js flatten into the same Resources root, so the # relative <script> ref inside sheet.html still resolves. - path: Sources/MenuBand/Resources buildPhase: resources
# The Metal shader ships as RAW SOURCE under a neutral extension: # WaveformView compiles it at runtime via makeLibrary(source:). A # `.metal` extension would trip Xcode's resources-phase auto-compile, # which needs the multi-GB Metal Toolchain component (its MobileAsset # install wedged repeatedly on 2026-07-05 and blocked the MAS archive); # `.metalsource` is copied verbatim, so no build-time Metal at all. - path: Sources/MenuBand/WaveformShaders.metalsource buildPhase: resources
# App icon. Info.plist already declares CFBundleIconFile = AppIcon, so # copying AppIcon.icns into Resources/ is all that's needed (no asset # catalog in this project). - path: AppIcon.icns buildPhase: resources
# Apple Help book. Both Info plists already declare # CFBundleHelpBookFolder=MenuBand.help / CFBundleHelpBookName, so once # the .help wrapper lands in Resources/ the OS registers it and Tips can # open the real Help Viewer. This copy is the whole fix for the store # build opening menuband.app instead: without it the book folder is # absent, registration fails, and TipsWindow's local-book lookup misses. # (`.help` is a bundle extension, so Xcode copies the wrapper whole.) # The direct-download build gets the same book via install.sh; the search # index is (re)built by the postBuildScript below. - path: Help/MenuBand.help buildPhase: resources
# The Aesthetic Computer GM synth C core (gm_synth.c, symlinked from # fedac/native/src). MenuBandGMSynth.swift does `import CGMSynth`. # Package.swift models this as a separate CGMSynth target; here we # compile the single .c straight into the app and expose its module map # via SWIFT_INCLUDE_PATHS / HEADER_SEARCH_PATHS below (see settings). - path: Sources/CGMSynth/gm_synth.c
dependencies: # Package.swift links IOKit explicitly (used without a Swift import); # everything else (AppKit, AVFoundation, CoreMIDI, CoreAudio, Metal, # MetalKit, WebKit, Carbon) auto-links from its `import`. - sdk: IOKit.framework # Sandboxed QuickLook extensions → ⌘-Space renders the animated graphic # score, and Finder shows an appearance-aware thumbnail. Embedded in # Contents/PlugIns; register when installed from the App Store (a signed # source — local builds won't). - target: ScorePreview embed: true - target: ScoreThumbnail embed: true
settings: base: PRODUCT_NAME: MenuBand # MAS build ships under a DISTINCT bundle id from the direct-download # DMG (computer.aestheticcomputer.menuband) so both can coexist on one # Mac. Matches the existing App Store Connect record. INFOPLIST_FILE is # the MAS-only fork (Info-AppStore.plist) for the same reason. PRODUCT_BUNDLE_IDENTIFIER: computer.aesthetic.menuband INFOPLIST_FILE: Info-AppStore.plist CODE_SIGN_ENTITLEMENTS: MenuBand-AppStore.entitlements CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: FB5948YR3S ENABLE_HARDENED_RUNTIME: YES # LSUIElement (agent app, no Dock icon) already lives in Info.plist. # Don't let Xcode generate a competing Info.plist. GENERATE_INFOPLIST_FILE: NO COMBINE_HIDPI_IMAGES: YES # Resolve `import CGMSynth`: the module map (module.modulemap) and its # header live in Sources/CGMSynth/include. SWIFT_INCLUDE_PATHS lets the # Swift side find the module; HEADER_SEARCH_PATHS lets gm_synth.c find # its own "gm_synth.h". SWIFT_INCLUDE_PATHS: $(SRCROOT)/Sources/CGMSynth/include HEADER_SEARCH_PATHS: $(SRCROOT)/Sources/CGMSynth/include
postBuildScripts: # Index the copied Help book so Help Viewer search works. We index the # book INSIDE the built product (not the source tree) — this runs after # Copy Bundle Resources and before Xcode's implicit CodeSign, so the # generated search.helpindex is signed along with the rest of the book. # Mirrors install.sh's approach for the direct-download build. If hiutil # is missing or fails, the book still opens; only search is lost. - name: Index Help Book basedOnDependencyAnalysis: false script: | BOOK="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Resources/MenuBand.help" if [ -d "$BOOK" ] && command -v hiutil >/dev/null 2>&1; then hiutil -Caf "$BOOK/Contents/Resources/search.helpindex" \ "$BOOK/Contents/Resources/en.lproj" \ || echo "warning: hiutil index failed — Help search disabled (book still opens)" fi
# Sandboxed QuickLook preview extension (animated graphic score). Shares the # same PreviewViewController.swift as the standalone quicklook/ container, but # signed under the MAS bundle-id tree so App Store archiving embeds + provisions # it. Registers only from a signed (App Store) install — never local builds. ScorePreview: type: app-extension platform: macOS deploymentTarget: "11.0" sources: - path: quicklook/Preview/PreviewViewController.swift settings: base: PRODUCT_NAME: ScorePreview PRODUCT_BUNDLE_IDENTIFIER: computer.aesthetic.menuband.ScorePreview INFOPLIST_FILE: quicklook/Preview/Info-MAS.plist GENERATE_INFOPLIST_FILE: NO CODE_SIGN_ENTITLEMENTS: quicklook/Preview/ScorePreview.entitlements CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: FB5948YR3S ENABLE_HARDENED_RUNTIME: YES
# Sandboxed QuickLook thumbnail extension (appearance-aware graphic score card # in Finder). Sibling to ScorePreview; registers only from a signed install. ScoreThumbnail: type: app-extension platform: macOS deploymentTarget: "11.0" sources: - path: quicklook/Thumbnail/ThumbnailProvider.swift settings: base: PRODUCT_NAME: ScoreThumbnail PRODUCT_BUNDLE_IDENTIFIER: computer.aesthetic.menuband.ScoreThumbnail INFOPLIST_FILE: quicklook/Thumbnail/Info-MAS.plist GENERATE_INFOPLIST_FILE: NO CODE_SIGN_ENTITLEMENTS: quicklook/Thumbnail/ScoreThumbnail.entitlements CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: FB5948YR3S ENABLE_HARDENED_RUNTIME: YES