diff --git a/.swiftlint-rules.yml b/.swiftlint-rules.yml new file mode 100644 index 000000000..445754fff --- /dev/null +++ b/.swiftlint-rules.yml @@ -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" diff --git a/.swiftlint.yml b/.swiftlint.yml index 1cc6caeb1..08e62fecd 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,3 +1,5 @@ +parent_config: .swiftlint-rules.yml + # SwiftLint configuration for Peekaboo - Swift 6 compatible # Paths to include @@ -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" diff --git a/Apps/CLI/.swiftlint.yml b/Apps/CLI/.swiftlint.yml index ae2d75c6d..71b535cdd 100644 --- a/Apps/CLI/.swiftlint.yml +++ b/Apps/CLI/.swiftlint.yml @@ -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