Last active
October 7, 2025 08:42
-
-
Save SamWindell/ffe39f6147e284c0aa968449350e7d6b to your computer and use it in GitHub Desktop.
Floe macOS installation diagnostics
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| echo "" | |
| echo "Starting Floe plugin diagnostics..." | |
| echo "This will take about a minute. Please wait..." | |
| echo "" | |
| # Capture all output to a variable | |
| output=$(cat <<'EOF_DIAGNOSTICS' | |
| === Floe Plugin Diagnostic Script === | |
| Date: $(date) | |
| macOS Version: $(sw_vers -productVersion) | |
| Architecture: $(uname -m) | |
| === 1. Plugin File Locations === | |
| EOF_DIAGNOSTICS | |
| ) | |
| PLUGIN_NAME="Floe" | |
| # Build the output string | |
| output+=" | |
| " | |
| for format in component vst3 clap; do | |
| for location in "/Library/Audio/Plug-Ins" "$HOME/Library/Audio/Plug-Ins"; do | |
| case $format in | |
| component) folder="Components" ;; | |
| vst3) folder="VST3" ;; | |
| clap) folder="CLAP" ;; | |
| esac | |
| path="$location/$folder/$PLUGIN_NAME.$format" | |
| if [ -e "$path" ]; then | |
| output+="✓ Found: $path | |
| " | |
| output+="$(ls -lhd "$path") | |
| " | |
| output+=" Permissions: $(ls -ld "$path" | awk '{print $1}') | |
| " | |
| output+=" Owner: $(ls -ld "$path" | awk '{print $3":"$4}') | |
| " | |
| else | |
| output+="✗ Not found: $path | |
| " | |
| fi | |
| done | |
| output+=" | |
| " | |
| done | |
| output+="=== 2. Code Signature Verification === | |
| " | |
| for format in component vst3 clap; do | |
| case $format in | |
| component) folder="Components" ;; | |
| vst3) folder="VST3" ;; | |
| clap) folder="CLAP" ;; | |
| esac | |
| for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do | |
| path="$location/$PLUGIN_NAME.$format" | |
| if [ -e "$path" ]; then | |
| output+="Checking: $path | |
| " | |
| output+="$(codesign -dvvv "$path" 2>&1 | head -20) | |
| " | |
| output+="$(codesign --verify --verbose "$path" 2>&1) | |
| " | |
| output+=" | |
| " | |
| fi | |
| done | |
| done | |
| output+="=== 3. Binary Architecture === | |
| " | |
| for format in component vst3 clap; do | |
| case $format in | |
| component) | |
| folder="Components" | |
| binary_path="Contents/MacOS/$PLUGIN_NAME" | |
| ;; | |
| vst3) | |
| folder="VST3" | |
| binary_path="Contents/MacOS/$PLUGIN_NAME" | |
| ;; | |
| clap) | |
| folder="CLAP" | |
| binary_path="Contents/MacOS/$PLUGIN_NAME" | |
| ;; | |
| esac | |
| for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do | |
| plugin="$location/$PLUGIN_NAME.$format" | |
| binary="$plugin/$binary_path" | |
| if [ -e "$binary" ]; then | |
| output+="Binary: $binary | |
| " | |
| output+="$(file "$binary") | |
| " | |
| output+=" | |
| " | |
| fi | |
| done | |
| done | |
| output+="=== 4. Component Bundle Structure === | |
| " | |
| for format in component vst3 clap; do | |
| case $format in | |
| component) folder="Components" ;; | |
| vst3) folder="VST3" ;; | |
| clap) folder="CLAP" ;; | |
| esac | |
| for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do | |
| plugin="$location/$PLUGIN_NAME.$format" | |
| if [ -e "$plugin" ]; then | |
| output+="Bundle structure for: $plugin | |
| " | |
| output+="$(find "$plugin" -print 2>&1 | head -50) | |
| " | |
| output+=" | |
| " | |
| fi | |
| done | |
| done | |
| output+="=== 5. Info.plist Validation (Component) === | |
| " | |
| for location in "/Library/Audio/Plug-Ins/Components" "$HOME/Library/Audio/Plug-Ins/Components"; do | |
| plugin="$location/$PLUGIN_NAME.component" | |
| plist="$plugin/Contents/Info.plist" | |
| if [ -e "$plist" ]; then | |
| output+="Checking: $plist | |
| " | |
| output+="Plist validation: | |
| " | |
| output+="$(plutil -lint "$plist" 2>&1) | |
| " | |
| output+=" | |
| " | |
| output+="Critical AU keys from Info.plist: | |
| " | |
| output+=" CFBundleIdentifier: $(/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "$plist" 2>&1) | |
| " | |
| output+=" CFBundleVersion: $(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$plist" 2>&1) | |
| " | |
| output+=" CFBundleShortVersionString: $(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$plist" 2>&1) | |
| " | |
| output+=" AudioComponents: | |
| " | |
| output+="$(/usr/libexec/PlistBuddy -c "Print :AudioComponents" "$plist" 2>&1 | sed 's/^/ /') | |
| " | |
| output+=" | |
| " | |
| pkginfo="$plugin/Contents/PkgInfo" | |
| if [ -e "$pkginfo" ]; then | |
| output+="✓ PkgInfo exists: $(cat "$pkginfo") | |
| " | |
| else | |
| output+="⚠ PkgInfo file missing (may be required for older systems) | |
| " | |
| fi | |
| output+=" | |
| " | |
| fi | |
| done | |
| output+="=== 6. Gatekeeper/Quarantine Status === | |
| " | |
| for format in component vst3 clap; do | |
| case $format in | |
| component) folder="Components" ;; | |
| vst3) folder="VST3" ;; | |
| clap) folder="CLAP" ;; | |
| esac | |
| for location in "/Library/Audio/Plug-Ins/$folder" "$HOME/Library/Audio/Plug-Ins/$folder"; do | |
| path="$location/$PLUGIN_NAME.$format" | |
| if [ -e "$path" ]; then | |
| output+="Checking: $path | |
| " | |
| output+="$(xattr -l "$path") | |
| " | |
| quarantine=$(xattr -p com.apple.quarantine "$path" 2>/dev/null) | |
| if [ -n "$quarantine" ]; then | |
| output+="⚠ QUARANTINED: $quarantine | |
| " | |
| else | |
| output+="✓ Not quarantined | |
| " | |
| fi | |
| output+=" | |
| " | |
| fi | |
| done | |
| done | |
| output+="=== 7. Audio Unit Cache Status === | |
| " | |
| cache_dir="$HOME/Library/Caches/AudioUnitCache" | |
| if [ -d "$cache_dir" ]; then | |
| output+="Cache directory exists: $cache_dir | |
| " | |
| output+="Files: | |
| " | |
| output+="$(ls -lh "$cache_dir") | |
| " | |
| else | |
| output+="✓ Cache directory does not exist (clean state) | |
| " | |
| fi | |
| output+=" | |
| " | |
| output+="=== 8. System Audio Unit Cache === | |
| " | |
| sys_cache="/Library/Caches/com.apple.audio.units.cache" | |
| if [ -e "$sys_cache" ]; then | |
| output+="System cache exists: | |
| " | |
| output+="$(ls -lh "$sys_cache") | |
| " | |
| else | |
| output+="✓ System cache does not exist | |
| " | |
| fi | |
| output+=" | |
| " | |
| output+="=== 9. Component Manager Registration (AU only) === | |
| " | |
| if [ -e "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ] || [ -e "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then | |
| output+="Attempting to list AU components (this uses the system's AU registry): | |
| " | |
| output+="$(auval -a 2>&1 | grep -i "$PLUGIN_NAME" || echo "Plugin not found in auval listing") | |
| " | |
| fi | |
| output+=" | |
| " | |
| output+="=== 10. Security & Privacy Settings === | |
| " | |
| output+="Checking if any security assessments were made: | |
| " | |
| output+="$(spctl --assess --type execute --verbose /Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component 2>&1 || echo "Component not found or not assessed") | |
| " | |
| output+=" | |
| " | |
| output+="=== 11. Package Installation Receipts === | |
| " | |
| output+="Checking for installation receipts: | |
| " | |
| output+="$(pkgutil --pkgs | grep -i floe || echo "No Floe-related package receipts found") | |
| " | |
| output+=" | |
| " | |
| for pkg in $(pkgutil --pkgs | grep -i floe); do | |
| output+="Package: $pkg | |
| " | |
| output+="$(pkgutil --pkg-info "$pkg") | |
| " | |
| output+="Files: | |
| " | |
| output+="$(pkgutil --files "$pkg" | head -20) | |
| " | |
| output+=" | |
| " | |
| done | |
| output+="=== 12. Plugin Loading Test (VST3 and AU) === | |
| " | |
| output+="Downloading pluginval validator... | |
| " | |
| # Download and extract pluginval | |
| curl -L -s -o /tmp/pluginval.zip https://github.com/Tracktion/pluginval/releases/download/v1.0.4/pluginval_macOS.zip 2>&1 | |
| if [ $? -eq 0 ]; then | |
| unzip -q /tmp/pluginval.zip -d /tmp/ 2>&1 | |
| chmod +x /tmp/pluginval.app/Contents/MacOS/pluginval 2>&1 | |
| output+="Testing VST3 loading: | |
| " | |
| if [ -e "/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" ]; then | |
| output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" 2>&1) | |
| " | |
| elif [ -e "$HOME/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" ]; then | |
| output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "$HOME/Library/Audio/Plug-Ins/VST3/$PLUGIN_NAME.vst3" 2>&1) | |
| " | |
| else | |
| output+="VST3 plugin not found | |
| " | |
| fi | |
| output+=" | |
| " | |
| output+="Testing AU loading: | |
| " | |
| if [ -e "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then | |
| output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" 2>&1) | |
| " | |
| elif [ -e "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" ]; then | |
| output+="$(/tmp/pluginval.app/Contents/MacOS/pluginval --skip-gui-tests --strictness-level 5 "$HOME/Library/Audio/Plug-Ins/Components/$PLUGIN_NAME.component" 2>&1) | |
| " | |
| else | |
| output+="AU component not found | |
| " | |
| fi | |
| output+=" | |
| " | |
| # Cleanup | |
| rm -rf /tmp/pluginval.app /tmp/pluginval.zip 2>&1 | |
| else | |
| output+="Failed to download pluginval. Skipping loading tests. | |
| " | |
| fi | |
| output+="=== Diagnostic Complete === | |
| " | |
| # Copy to clipboard and show completion message | |
| echo "$output" | pbcopy | |
| echo "" | |
| echo "✓ Diagnostics copied to clipboard!" | |
| echo "Please paste the results into your message to the developer." | |
| echo "" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment