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? {
switch colorSchemePreferenceRaw {
case "light": return .light
case "dark": return .dark
default: return nil
case "light": .light
case "dark": .dark
default: nil // System default
}
}

View file

@ -106,9 +106,9 @@ struct GeneralSettingsView: View {
var displayName: String {
switch self {
case .system: return "System"
case .light: return "Light"
case .dark: return "Dark"
case .system: "System"
case .light: "Light"
case .dark: "Dark"
}
}
}
@ -124,14 +124,14 @@ struct GeneralSettingsView: View {
Text("Appearance")
.font(.headline)
.foregroundColor(Theme.Colors.terminalForeground)
VStack(spacing: Theme.Spacing.medium) {
// Color Scheme
VStack(alignment: .leading, spacing: Theme.Spacing.small) {
Text("Color Scheme")
.font(Theme.Typography.terminalSystem(size: 14))
.foregroundColor(Theme.Colors.terminalForeground.opacity(0.7))
Picker("Color Scheme", selection: $colorSchemePreferenceRaw) {
ForEach(ColorSchemePreference.allCases, id: \.self) { preference in
Text(preference.displayName).tag(preference.rawValue)
@ -144,7 +144,7 @@ struct GeneralSettingsView: View {
.cornerRadius(Theme.CornerRadius.card)
}
}
// Terminal Defaults Section
VStack(alignment: .leading, spacing: Theme.Spacing.medium) {
Text("Terminal Defaults")

View file

@ -164,7 +164,7 @@ struct TerminalToolbar: View {
Spacer()
}
// Fourth row - F-keys (F7-F12)
HStack(spacing: Theme.Spacing.extraSmall) {
ForEach(["F7", "F8", "F9", "F10", "F11", "F12"], id: \.self) { fkey in
@ -184,29 +184,29 @@ struct TerminalToolbar: View {
Spacer()
}
// Fifth row - Special characters
HStack(spacing: Theme.Spacing.extraSmall) {
ToolbarButton(label: "\\") {
HapticFeedback.impact(.light)
onSpecialKey(.backslash)
}
ToolbarButton(label: "|") {
HapticFeedback.impact(.light)
onSpecialKey(.pipe)
}
ToolbarButton(label: "`") {
HapticFeedback.impact(.light)
onSpecialKey(.backtick)
}
ToolbarButton(label: "~") {
HapticFeedback.impact(.light)
onSpecialKey(.tilde)
}
ToolbarButton(label: "END") {
HapticFeedback.impact(.light)
// Send Ctrl+E for end

View file

@ -888,7 +888,7 @@ class TerminalViewModel {
}
}
}
func sendSpecialKey(_ key: TerminalInput.SpecialKey) {
sendInput(key.rawValue)
}

View file

@ -46,7 +46,9 @@ struct WelcomeView: View {
HStack(spacing: 8) {
ForEach(0..<5) { index in
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)
.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
print_info "Running SwiftFormat..."
if command -v swiftformat &> /dev/null; then
if swiftformat . --verbose; then
if swiftformat . --config ../apple/.swiftformat --verbose; then
print_success "SwiftFormat completed successfully"
else
print_error "SwiftFormat encountered errors"
@ -62,11 +62,11 @@ print_info "Running SwiftLint..."
if command -v swiftlint &> /dev/null; then
# First run auto-corrections
print_info "Applying auto-corrections..."
swiftlint --fix
swiftlint --fix --config ../apple/.swiftlint.yml
# Then run full lint check
print_info "Checking for remaining issues..."
if swiftlint; then
if swiftlint --config ../apple/.swiftlint.yml; then
print_success "SwiftLint completed successfully"
else
print_warning "SwiftLint found issues that require manual attention"
@ -78,4 +78,4 @@ else
exit 1
fi
print_success "Linting complete!"
print_success "Linting complete!"

View file

@ -122,6 +122,10 @@
"bash -c 'tsc --noEmit --project tsconfig.server.json'",
"bash -c 'tsc --noEmit --project tsconfig.client.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'"
]
}
}