Add SwiftLint and SwiftFormat Husky pre-commit hooks for iOS and mac (#165)

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
devin-ai-integration[bot] 2025-07-01 06:24:59 +01:00 committed by GitHub
parent 68ce36828a
commit 1d9112b9d3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 105 additions and 21 deletions

View file

@ -36,9 +36,9 @@ struct VibeTunnelApp: App {
private var colorScheme: ColorScheme? { private var colorScheme: ColorScheme? {
switch colorSchemePreferenceRaw { switch colorSchemePreferenceRaw {
case "light": return .light case "light": .light
case "dark": return .dark case "dark": .dark
default: return nil default: nil // System default
} }
} }

View file

@ -106,9 +106,9 @@ struct GeneralSettingsView: View {
var displayName: String { var displayName: String {
switch self { switch self {
case .system: return "System" case .system: "System"
case .light: return "Light" case .light: "Light"
case .dark: return "Dark" case .dark: "Dark"
} }
} }
} }

View file

@ -46,7 +46,9 @@ struct WelcomeView: View {
HStack(spacing: 8) { HStack(spacing: 8) {
ForEach(0..<5) { index in ForEach(0..<5) { index in
Circle() Circle()
.fill(index == currentPage ? Theme.Colors.primaryAccent : Theme.Colors.secondaryText.opacity(0.3)) .fill(index == currentPage ?
Theme.Colors.primaryAccent :
Theme.Colors.secondaryText.opacity(0.3))
.frame(width: 8, height: 8) .frame(width: 8, height: 8)
.animation(.easeInOut, value: currentPage) .animation(.easeInOut, value: currentPage)
} }

78
ios/scripts/lint.sh Executable file
View file

@ -0,0 +1,78 @@
#!/bin/bash
# =============================================================================
# =============================================================================
#
# This script runs SwiftFormat and SwiftLint on the VibeTunnel iOS codebase
# to ensure consistent code style and catch potential issues.
#
# USAGE:
# ./scripts/lint.sh
#
# DEPENDENCIES:
# - swiftformat (brew install swiftformat)
# - swiftlint (brew install swiftlint)
#
# FEATURES:
# - Automatically formats Swift code with SwiftFormat
# - Fixes auto-correctable SwiftLint issues
# - Reports remaining SwiftLint warnings and errors
#
# EXIT CODES:
# 0 - Success (all checks passed)
# 1 - Missing dependencies or linting errors
#
# =============================================================================
set -euo pipefail
# Source common functions
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
[[ -f "$SCRIPT_DIR/common.sh" ]] && source "$SCRIPT_DIR/common.sh" || true
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Change to project root
cd "$PROJECT_ROOT"
# Check if project has Swift files
if ! find . -name "*.swift" -not -path "./.build/*" -not -path "./build/*" | head -1 | grep -q .; then
print_warning "No Swift files found in project"
exit 0
fi
print_info "Running SwiftFormat..."
if command -v swiftformat &> /dev/null; then
if swiftformat . --config ../apple/.swiftformat --verbose; then
print_success "SwiftFormat completed successfully"
else
print_error "SwiftFormat encountered errors"
exit 1
fi
else
print_error "SwiftFormat not installed"
echo " Install with: brew install swiftformat"
exit 1
fi
print_info "Running SwiftLint..."
if command -v swiftlint &> /dev/null; then
# First run auto-corrections
print_info "Applying auto-corrections..."
swiftlint --fix --config ../apple/.swiftlint.yml
# Then run full lint check
print_info "Checking for remaining issues..."
if swiftlint --config ../apple/.swiftlint.yml; then
print_success "SwiftLint completed successfully"
else
print_warning "SwiftLint found issues that require manual attention"
# Don't exit with error as these may be warnings
fi
else
print_error "SwiftLint not installed"
echo " Install with: brew install swiftlint"
exit 1
fi
print_success "Linting complete!"

View file

@ -45,7 +45,7 @@ fi
# Run SwiftFormat # Run SwiftFormat
print_info "Running SwiftFormat..." print_info "Running SwiftFormat..."
if command -v swiftformat &> /dev/null; then if command -v swiftformat &> /dev/null; then
if swiftformat . --verbose; then if swiftformat . --config ../apple/.swiftformat --verbose; then
print_success "SwiftFormat completed successfully" print_success "SwiftFormat completed successfully"
else else
print_error "SwiftFormat encountered errors" print_error "SwiftFormat encountered errors"
@ -62,11 +62,11 @@ print_info "Running SwiftLint..."
if command -v swiftlint &> /dev/null; then if command -v swiftlint &> /dev/null; then
# First run auto-corrections # First run auto-corrections
print_info "Applying auto-corrections..." print_info "Applying auto-corrections..."
swiftlint --fix swiftlint --fix --config ../apple/.swiftlint.yml
# Then run full lint check # Then run full lint check
print_info "Checking for remaining issues..." print_info "Checking for remaining issues..."
if swiftlint; then if swiftlint --config ../apple/.swiftlint.yml; then
print_success "SwiftLint completed successfully" print_success "SwiftLint completed successfully"
else else
print_warning "SwiftLint found issues that require manual attention" print_warning "SwiftLint found issues that require manual attention"

View file

@ -122,6 +122,10 @@
"bash -c 'tsc --noEmit --project tsconfig.server.json'", "bash -c 'tsc --noEmit --project tsconfig.server.json'",
"bash -c 'tsc --noEmit --project tsconfig.client.json'", "bash -c 'tsc --noEmit --project tsconfig.client.json'",
"bash -c 'tsc --noEmit --project tsconfig.sw.json'" "bash -c 'tsc --noEmit --project tsconfig.sw.json'"
],
"../{ios,mac}/**/*.swift": [
"bash -c 'cd ../ios && ./scripts/lint.sh'",
"bash -c 'cd ../mac && ./scripts/lint.sh'"
] ]
} }
} }