Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 150 additions & 0 deletions .swiftlint-rules.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
# SwiftLint merges parent includes; scan paths belong to the consuming configurations.

# Analyzer rules (require compilation)
analyzer_rules:
- unused_declaration
- unused_import

# Enable specific rules
opt_in_rules:
- array_init
- closure_spacing
- contains_over_first_not_nil
- empty_count
- empty_string
- explicit_init
- fallthrough
- fatal_error_message
- first_where
- joined_default_parameter
- last_where
- literal_expression_end_indentation
- multiline_arguments
- multiline_parameters
- operator_usage_whitespace
- overridden_super_call
- pattern_matching_keywords
- private_outlet
- prohibited_super_call
- redundant_nil_coalescing
- sorted_first_last
- switch_case_alignment
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call

# Disable rules that conflict with Swift 6 or our coding style
disabled_rules:
# Swift 6 requires explicit self - disable explicit_self rule
- explicit_self

# SwiftFormat handles these
- trailing_whitespace
- trailing_newline
- trailing_comma
- vertical_whitespace
- indentation_width

# Too restrictive or not applicable
- identifier_name # Single letter names are fine in many contexts
- file_header
- explicit_top_level_acl
- explicit_acl
- explicit_type_interface
- missing_docs
- required_deinit
- prefer_nimble
- quick_discouraged_call
- quick_discouraged_focused_test
- quick_discouraged_pending_test
- anonymous_argument_in_multiline_closure
- no_extension_access_modifier
- no_grouping_extension
- switch_case_on_newline
- strict_fileprivate
- extension_access_modifier
- convenience_type
- no_magic_numbers
- one_declaration_per_file
- vertical_whitespace_between_cases
- vertical_whitespace_closing_braces
- superfluous_else
- number_separator
- prefixed_toplevel_constant
- opening_brace
- trailing_closure
- contrasted_opening_brace
- sorted_imports
- redundant_type_annotation
- shorthand_optional_binding
- untyped_error_in_catch
- file_name
- todo

# Custom rules
custom_rules:
no_direct_ax_in_peekaboo:
included: "Core/PeekabooCore"
excluded: "Core/PeekabooCore/Tests"
name: "No Direct AX/CG Event APIs in PeekabooCore"
regex: "\\bAXUIElement\\b|\\bCGEvent\\b"
message: "Use AXorcist abstractions (Element/InputDriver/AXWindowResolver) instead of direct AXUIElement/CGEvent."
severity: error
no_ui_appservices_import:
included: "Core/PeekabooCore/Sources/PeekabooAutomation/Services/UI"
regex: "^import\\s+ApplicationServices"
message: "Import AX/CG bindings via AXorcist; avoid direct ApplicationServices in UI services."
severity: warning

# Rule configurations
force_cast: warning
force_try: warning

# identifier_name rule disabled - see disabled_rules section

type_name:
min_length:
warning: 2
error: 1
max_length:
warning: 60
error: 80

function_body_length:
warning: 150
error: 300

file_length:
warning: 1500
error: 2500
ignore_comment_only_lines: true

type_body_length:
warning: 800
error: 1200

cyclomatic_complexity:
warning: 20
error: 120

large_tuple:
warning: 4
error: 5

nesting:
type_level:
warning: 4
error: 6
function_level:
warning: 5
error: 7

line_length:
warning: 120
error: 250
ignores_comments: true
ignores_urls: true

# Custom rules can be added here if needed

# Reporter type
reporter: "xcode"
151 changes: 2 additions & 149 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
parent_config: .swiftlint-rules.yml

# SwiftLint configuration for Peekaboo - Swift 6 compatible

# Paths to include
Expand All @@ -24,152 +26,3 @@ excluded:
- "*.playground"
# Exclude specific files that should not be linted/formatted
- "Core/PeekabooCore/Sources/PeekabooCore/Extensions/NSArray+Extensions.swift"

# Analyzer rules (require compilation)
analyzer_rules:
- unused_declaration
- unused_import

# Enable specific rules
opt_in_rules:
- array_init
- closure_spacing
- contains_over_first_not_nil
- empty_count
- empty_string
- explicit_init
- fallthrough
- fatal_error_message
- first_where
- joined_default_parameter
- last_where
- literal_expression_end_indentation
- multiline_arguments
- multiline_parameters
- operator_usage_whitespace
- overridden_super_call
- pattern_matching_keywords
- private_outlet
- prohibited_super_call
- redundant_nil_coalescing
- sorted_first_last
- switch_case_alignment
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call

# Disable rules that conflict with Swift 6 or our coding style
disabled_rules:
# Swift 6 requires explicit self - disable explicit_self rule
- explicit_self

# SwiftFormat handles these
- trailing_whitespace
- trailing_newline
- trailing_comma
- vertical_whitespace
- indentation_width

# Too restrictive or not applicable
- identifier_name # Single letter names are fine in many contexts
- file_header
- explicit_top_level_acl
- explicit_acl
- explicit_type_interface
- missing_docs
- required_deinit
- prefer_nimble
- quick_discouraged_call
- quick_discouraged_focused_test
- quick_discouraged_pending_test
- anonymous_argument_in_multiline_closure
- no_extension_access_modifier
- no_grouping_extension
- switch_case_on_newline
- strict_fileprivate
- extension_access_modifier
- convenience_type
- no_magic_numbers
- one_declaration_per_file
- vertical_whitespace_between_cases
- vertical_whitespace_closing_braces
- superfluous_else
- number_separator
- prefixed_toplevel_constant
- opening_brace
- trailing_closure
- contrasted_opening_brace
- sorted_imports
- redundant_type_annotation
- shorthand_optional_binding
- untyped_error_in_catch
- file_name
- todo

# Custom rules
custom_rules:
no_direct_ax_in_peekaboo:
included: "Core/PeekabooCore"
excluded: "Core/PeekabooCore/Tests"
name: "No Direct AX/CG Event APIs in PeekabooCore"
regex: "\\bAXUIElement\\b|\\bCGEvent\\b"
message: "Use AXorcist abstractions (Element/InputDriver/AXWindowResolver) instead of direct AXUIElement/CGEvent."
severity: error
no_ui_appservices_import:
included: "Core/PeekabooCore/Sources/PeekabooAutomation/Services/UI"
regex: "^import\\s+ApplicationServices"
message: "Import AX/CG bindings via AXorcist; avoid direct ApplicationServices in UI services."
severity: warning

# Rule configurations
force_cast: warning
force_try: warning

# identifier_name rule disabled - see disabled_rules section

type_name:
min_length:
warning: 2
error: 1
max_length:
warning: 60
error: 80

function_body_length:
warning: 150
error: 300

file_length:
warning: 1500
error: 2500
ignore_comment_only_lines: true

type_body_length:
warning: 800
error: 1200

cyclomatic_complexity:
warning: 20
error: 120

large_tuple:
warning: 4
error: 5

nesting:
type_level:
warning: 4
error: 6
function_level:
warning: 5
error: 7

line_length:
warning: 120
error: 250
ignores_comments: true
ignores_urls: true

# Custom rules can be added here if needed

# Reporter type
reporter: "xcode"
48 changes: 1 addition & 47 deletions Apps/CLI/.swiftlint.yml
Original file line number Diff line number Diff line change
@@ -1,51 +1,5 @@
# SwiftLint configuration for Peekaboo CLI (Swift 6.2)
#
# The CLI target runs in Swift 6.2 strict concurrency mode, so we rely on SwiftFormat
# to insert explicit `self` where required and keep opt-in rules focused on logic bugs
# instead of style that SwiftFormat already enforces.
swiftlint_version: 0.62.2
parent_config: ../../.swiftlint-rules.yml

# Rules
disabled_rules:
- trailing_whitespace
- trailing_comma # SwiftFormat handles trailing commas for us
- todo
- superfluous_disable_command
- function_parameter_count
- function_body_length
- type_body_length
- file_length
- cyclomatic_complexity
- nesting
- large_tuple
- line_length
- identifier_name
- force_cast
- void_return
- empty_string
- unused_optional_binding
- unused_enumerated
- for_where

opt_in_rules:
- closure_spacing
- empty_count
- empty_string
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- contains_over_range_nil_comparison
- discouraged_object_literal
- first_where
- last_where
- legacy_multiple
- prefer_self_type_over_type_of_self
- sorted_first_last
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call

# Rule configurations tuned for Swift 6.2 ergonomics
# Paths
included:
- Sources
- Tests
Expand Down