Voice Mode Install Script Robustness Analysis
Problem Summary
The original install.sh script had critical reliability issues when invoking voice-mode CLI commands after MCP configuration:
- Inconsistent Command Detection: Mixed logic trying both
voice-modeanduvx voice-mode - PATH Issues: UV/UVX installation didn't guarantee immediate availability
- No Verification: No check that voice-mode actually works after MCP setup
- Fragile Tests:
uvx voice-mode --helpmight work while actual commands fail - Error Handling: Poor error reporting and recovery guidance
Robust Solution Implemented
1. Consistent Command Strategy
check_voice_mode_cli() {
# Always prefer uvx approach for consistency
# This matches exactly how the MCP server is configured
if command -v uvx >/dev/null 2>&1; then
if timeout 30 uvx voice-mode --version >/dev/null 2>&1; then
echo "uvx voice-mode"
return 0
fi
fi
return 1
}
Key Improvements:
- Always use
uvx voice-mode- matches MCP configuration exactly - Test with
--version- lightweight command that doesn't require full init - Timeout protection - prevents hanging on network issues
- Clear failure cases - explicit error reporting
2. Enhanced PATH Management
install_uvx() {
# Install UV
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
# Immediate verification
if ! command -v uvx >/dev/null 2>&1; then
print_error "UV/UVX installation failed - command not found"
return 1
fi
# Functional test
if ! uvx --version >/dev/null 2>&1; then
print_error "UV/UVX installation failed - command not working"
return 1
fi
}
Key Improvements:
- Immediate verification after installation
- Functional testing to ensure uvx actually works
- PATH export for current session
- Clear error messages for debugging
3. Post-MCP Verification
verify_voice_mode_after_mcp() {
print_step "Verifying Voice Mode CLI availability after MCP configuration..."
sleep 2 # Allow caching to settle
if ! voice_mode_cmd=$(check_voice_mode_cli); then
print_warning "Voice Mode CLI not available yet. This could be due to:"
echo " • PATH not updated in current shell"
echo " • uvx cache not refreshed"
echo " • Network connectivity issues"
echo "You can install services manually later with:"
echo " uvx voice-mode whisper install"
return 1
fi
print_success "Voice Mode CLI verified: $voice_mode_cmd"
return 0
}
Key Improvements:
- Verification step after MCP configuration
- Helpful diagnostics explaining potential issues
- Manual recovery instructions for users
- Graceful degradation when automated setup fails
4. Robust Service Installation
install_service() {
local service_name="$1"
local voice_mode_cmd="$2"
local description="$3"
# Pre-flight check
if ! timeout 30 $voice_mode_cmd $service_name --help >/dev/null 2>&1; then
print_warning "$description service command not available"
return 1
fi
# Install with logging
local temp_log=$(mktemp)
if timeout 600 $voice_mode_cmd $service_name install --auto-enable 2>&1 | tee "$temp_log"; then
if ! grep -qi "error\|failed\|traceback" "$temp_log"; then
print_success "$description installed successfully"
return 0
fi
fi
print_warning "$description installation may have failed"
tail -10 "$temp_log" | sed 's/^/ /'
return 1
}
Key Improvements:
- Pre-flight checks ensure service commands exist
- Output capture for better error diagnosis
- Success verification checks for error keywords
- Detailed logging shows actual failure output
- Longer timeout (10 minutes) for large downloads
Edge Cases Handled
1. Fresh System Installation
- UV/UVX not in PATH initially → Export PATH immediately after install
- Python dependencies missing → Install system packages first
- uvx cache empty → Allow time for first-run initialization
2. Network Issues
- Slow downloads → Extended timeout (10 minutes)
- Connectivity problems → Clear error messages and manual instructions
- Package index failures → Graceful fallback with instructions
3. Permission Issues
- Sudo requirements → Early sudo caching with clear prompts
- File permissions → Use user-local installations where possible
- Service installation → Handle both systemd and launchd automatically
4. Platform Differences
- macOS vs Linux → Different package managers and paths
- WSL2 audio → Special audio configuration and troubleshooting
- Shell variations → Support bash, zsh, different profile files
Reliability Principles Applied
1. Test Early and Often
- Verify UV/UVX installation immediately
- Test voice-mode availability before attempting service installation
- Pre-flight checks for each service command
2. Fail Fast with Clear Messages
- Stop on critical failures (UV/UVX install)
- Provide specific error messages
- Include manual recovery instructions
3. Graceful Degradation
- Continue setup if non-critical components fail
- Provide manual installation commands
- Clear success/failure reporting
4. Consistent Approach
- Always use
uvx voice-mode(matches MCP config) - Standardized error handling across functions
- Unified logging and output capture
Result
The improved script now handles fresh system installations reliably by:
- Ensuring tools are available before using them
- Using consistent command patterns that match the MCP configuration
- Providing clear diagnostics when things go wrong
- Offering manual recovery paths for edge cases
- Testing functionality not just presence
This makes the installer work reliably across different environments while providing clear guidance when manual intervention is needed.