diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..bb815ee7 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,83 @@ +language: ko-KR + +early_access: true +enable_free_tier: true + +reviews: + profile: chill + request_changes_workflow: true + high_level_summary: true + high_level_summary_placeholder: '@coderabbitai 요약' + auto_title_placeholder: '@coderabbitai' + poem: true + review_status: true + collapse_walkthrough: false + + abort_on_close: true + + auto_review: + enabled: true + auto_incremental_review: true + ignore_title_keywords: [] + labels: [] + drafts: false + base_branches: [] + + tools: + shellcheck: + enabled: true + ruff: + enabled: true + markdownlint: + enabled: true + github-checks: + enabled: true + timeout_ms: 90000 + languagetool: + enabled: true + disabled_rules: + - EN_UNPAIRED_BRACKETS + - EN_UNPAIRED_QUOTES + disabled_categories: + - TYPOS + - TYPOGRAPHY + - CASING + enabled_only: false + level: default + enabled_rules: [] + enabled_categories: [] + biome: + enabled: true + hadolint: + enabled: true + swiftlint: + enabled: true + phpstan: + enabled: true + level: default + golangci-lint: + enabled: true + yamllint: + enabled: true + gitleaks: + enabled: true + checkov: + enabled: true + ast-grep: + packages: [] + rule_dirs: [] + util_dirs: [] + essential_rules: true + +chat: + auto_reply: true + +knowledge_base: + web_search: + enabled: true + learnings: + scope: auto + issues: + scope: auto + jira: + project_keys: [] diff --git a/src/.swiftlint.yml b/src/.swiftlint.yml new file mode 100644 index 00000000..de805d0e --- /dev/null +++ b/src/.swiftlint.yml @@ -0,0 +1,65 @@ +disabled_rules: + - trailing_whitespace + +opt_in_rules: + - attributes + - closure_spacing + - colon + - operator_usage_whitespace + - fatal_error_message + - trailing_closure + - empty_count + - function_default_parameter_at_end + - prefer_self_in_static_references + - identifier_name # 사용 전 Rule 확인 필요 + - sorted_imports # 알파벳 순서대로 임포트 + - duplicate_imports # 중복 임포트 제거 + - indentation_width + +analyzer_rules: + - unused_declaration + +line_length: + warning: 120 + error: 200 + +type_name: + min_length: + warning: 3 + error: 1 + max_length: + warning: 40 + error: 50 + validates_start_with_lowercase: warning + +identifier_name: + min_length: 3 + +function_body_length: + warning: 30 + error: 50 + +type_body_length: + warning: 200 + error: 400 + +colon: + flexible_right_spacing: false + apply_to_dictionaries: true + +operator_usage_whitespace: + severity: warning + +control_statement: + severity: warning + if_else: false + +void_return: + severity: warning + +custom_rules: + ios17_uikit_api_usage: + name: "iOS 17+ UIKit API 사용" + regex: '\b(UITextView\.TextLayoutManager|UIPasteControl|UIBackgroundConfiguration\.cornerRadius|SectionHeaderPinToVisibleBounds|UIView\.animationsEnabled|UIEditingOverlayViewController)\b' + message: "이 UIKit API는 iOS 17 이상에서만 사용할 수 있습니다. 최소 지원 버전을 확인하거나 @available(iOS 17, *)로 감싸세요." + severity: warning diff --git a/src/Projects/BKCore/Project.swift b/src/Projects/BKCore/Project.swift index 4d71e38a..27d9067c 100644 --- a/src/Projects/BKCore/Project.swift +++ b/src/Projects/BKCore/Project.swift @@ -9,9 +9,13 @@ let project = Project.project( product: Project.product, bundleId: "core." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ ] ), + Target.target( name: "\(BKModule.BKCore.rawValue)Test", product: .unitTests, diff --git a/src/Projects/BKData/Project.swift b/src/Projects/BKData/Project.swift index 6f987629..10058992 100644 --- a/src/Projects/BKData/Project.swift +++ b/src/Projects/BKData/Project.swift @@ -9,6 +9,9 @@ let project = Project.project( product: Project.product, bundleId: "data." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] diff --git a/src/Projects/BKDesign/Project.swift b/src/Projects/BKDesign/Project.swift index 4ec79619..051c70d3 100644 --- a/src/Projects/BKDesign/Project.swift +++ b/src/Projects/BKDesign/Project.swift @@ -10,6 +10,9 @@ let project = Project.project( bundleId: "design." + Project.bundleID, sources: .sources, resources: .default, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] diff --git a/src/Projects/BKDomain/Project.swift b/src/Projects/BKDomain/Project.swift index 3882421a..989374cb 100644 --- a/src/Projects/BKDomain/Project.swift +++ b/src/Projects/BKDomain/Project.swift @@ -9,6 +9,9 @@ let project = Project.project( product: Project.product, bundleId: "domain." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] diff --git a/src/Projects/BKNetwork/Project.swift b/src/Projects/BKNetwork/Project.swift index 3bd89cc3..13bc9512 100644 --- a/src/Projects/BKNetwork/Project.swift +++ b/src/Projects/BKNetwork/Project.swift @@ -9,8 +9,11 @@ let project = Project.project( product: Project.product, bundleId: "network." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ - .core(), + .core() ] ), Target.target( diff --git a/src/Projects/BKPresentation/Project.swift b/src/Projects/BKPresentation/Project.swift index b63d4245..01ccd0d0 100644 --- a/src/Projects/BKPresentation/Project.swift +++ b/src/Projects/BKPresentation/Project.swift @@ -9,6 +9,9 @@ let project = Project.project( product: Project.product, bundleId: "presentation." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] diff --git a/src/Projects/BKStorage/Project.swift b/src/Projects/BKStorage/Project.swift index ef507186..bec1ded9 100644 --- a/src/Projects/BKStorage/Project.swift +++ b/src/Projects/BKStorage/Project.swift @@ -9,6 +9,9 @@ let project = Project.project( product: Project.product, bundleId: "storage." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] diff --git a/src/Projects/Booket/Project.swift b/src/Projects/Booket/Project.swift index 8407f108..8298d2ba 100644 --- a/src/Projects/Booket/Project.swift +++ b/src/Projects/Booket/Project.swift @@ -13,6 +13,9 @@ let appTarget = Target.target( // .glob(pattern: .relativeToRoot("src/Resources/LaunchScreen.storyboard")) ], // entitlements: .file(path: .relativeToRoot("src/SupportingFiles/Booket.entitlements")), + scripts: [ + swiftLintScript + ], dependencies: [ // Module .data(), diff --git a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift new file mode 100644 index 00000000..a6ca180d --- /dev/null +++ b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift @@ -0,0 +1,23 @@ +import ProjectDescription +import Foundation + +let projectDir = ProcessInfo.processInfo.environment["PROJECT_DIR"] ?? "" +let swiftLintConfigPath = "\(projectDir)/../../.swiftlint.yml" + + +public let swiftLintScript: TargetScript = .pre( + script: """ + export PATH="/opt/homebrew/bin:$PATH" + + SWIFTLINT_PATH=$(which swiftlint) + SWIFTLINT_CONFIG_PATH="${SRCROOT%/*/*}/.swiftlint.yml" + + if [ -n "$SWIFTLINT_PATH" ]; then + swiftlint --config "$SWIFTLINT_CONFIG_PATH" + else + echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" + fi + """, + name: "SwiftLint", + basedOnDependencyAnalysis: false +) diff --git a/test.md b/test.md deleted file mode 100644 index 80e72b66..00000000 --- a/test.md +++ /dev/null @@ -1,9 +0,0 @@ -### husky 적용됐는지 테스트 - -1. `ls -al .husky` - -2. `cat .husky/commit-msg` - -3. 브랜치 연결 성공! - -4. gui로도 커밋 메세지 변경되는지 테스트