From f2a08aab97395bc97efa7db873a69fd1f684994a Mon Sep 17 00:00:00 2001 From: doyeonk429 <80318425+doyeonk429@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:25:27 +0900 Subject: [PATCH 1/5] [BOOK-41] chore: add swiftlint script --- src/.swiftlint.yml | 70 +++++++++++++++++++ src/Projects/BKCore/Project.swift | 7 +- src/Projects/BKData/Project.swift | 3 + src/Projects/BKDesign/Project.swift | 3 + src/Projects/BKDomain/Project.swift | 3 + src/Projects/BKNetwork/Project.swift | 3 + src/Projects/BKPresentation/Project.swift | 3 + src/Projects/BKStorage/Project.swift | 3 + src/Projects/Booket/Project.swift | 5 +- .../SwiftLintScript.swift | 18 +++++ src/swiftlint | 1 + test.md | 9 --- 12 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 src/.swiftlint.yml create mode 100644 src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift create mode 120000 src/swiftlint delete mode 100644 test.md diff --git a/src/.swiftlint.yml b/src/.swiftlint.yml new file mode 100644 index 00000000..1bbf545b --- /dev/null +++ b/src/.swiftlint.yml @@ -0,0 +1,70 @@ +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 # 중복 임포트 제거 + +analyzer_rules: + - unused_declaration + +line_length: + warning: 120 + error: 200 + +type_name: + min_length: + warning: 3 + error: 1 + max_length: + warning: 40 + error: 50 + +identifier_name: + min_length: 3 + +function_body_length: + warning: 30 + error: 50 + +type_body_length: + warning: 200 + error: 400 + +indentation: + indentation_width: 4 + include_comments: true + +colon: + flexible_right_spacing: false + apply_to_dictionaries: true + +operator_usage_whitespace: + severity: warning + +type_name: + validates_start_with_lowercase: 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..247401fe 100644 --- a/src/Projects/BKCore/Project.swift +++ b/src/Projects/BKCore/Project.swift @@ -9,9 +9,14 @@ 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..1d404620 100644 --- a/src/Projects/BKNetwork/Project.swift +++ b/src/Projects/BKNetwork/Project.swift @@ -9,6 +9,9 @@ let project = Project.project( product: Project.product, bundleId: "network." + Project.bundleID, sources: .sources, + scripts: [ + swiftLintScript + ], dependencies: [ .core(), ] 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..0b87a78d 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(), @@ -31,7 +34,7 @@ let appTarget = Target.target( .debug(name: "Debug", xcconfig: "SupportingFiles/Debug.xcconfig"), .release(name: "Release", xcconfig: "SupportingFiles/Release.xcconfig") ] - ) + ), ) // MARK: - Project diff --git a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift new file mode 100644 index 00000000..ec966c9e --- /dev/null +++ b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift @@ -0,0 +1,18 @@ +import ProjectDescription +import Foundation + +let projectDir = ProcessInfo.processInfo.environment["PROJECT_DIR"] ?? "" +let swiftLintConfigPath = "\(projectDir)/../../.swiftlint.yml" + + +public let swiftLintScript: TargetScript = .pre( + script: """ + if which swiftlint > /dev/null; then + swiftlint --config "\(swiftLintConfigPath)" + else + echo "warning: SwiftLint not installed" + fi + """, + name: "SwiftLint", + basedOnDependencyAnalysis: false +) diff --git a/src/swiftlint b/src/swiftlint new file mode 120000 index 00000000..0274d320 --- /dev/null +++ b/src/swiftlint @@ -0,0 +1 @@ +../Cellar/swiftlint/0.58.2/bin/swiftlint \ No newline at end of file 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로도 커밋 메세지 변경되는지 테스트 From f272559977231afa639c37297ac3f41869b3baa1 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 17 Jun 2025 16:52:23 +0900 Subject: [PATCH 2/5] [BOOK-41] fix: Resolve swiftlint error --- src/.swiftlint.yml | 9 ++------- src/Projects/BKCore/Project.swift | 3 +-- src/Projects/BKNetwork/Project.swift | 2 +- src/Projects/Booket/Project.swift | 2 +- .../SwiftLintScript.swift | 14 +++++++++++--- src/swiftlint | 1 - 6 files changed, 16 insertions(+), 15 deletions(-) delete mode 120000 src/swiftlint diff --git a/src/.swiftlint.yml b/src/.swiftlint.yml index 1bbf545b..de805d0e 100644 --- a/src/.swiftlint.yml +++ b/src/.swiftlint.yml @@ -14,6 +14,7 @@ opt_in_rules: - identifier_name # 사용 전 Rule 확인 필요 - sorted_imports # 알파벳 순서대로 임포트 - duplicate_imports # 중복 임포트 제거 + - indentation_width analyzer_rules: - unused_declaration @@ -29,6 +30,7 @@ type_name: max_length: warning: 40 error: 50 + validates_start_with_lowercase: warning identifier_name: min_length: 3 @@ -41,10 +43,6 @@ type_body_length: warning: 200 error: 400 -indentation: - indentation_width: 4 - include_comments: true - colon: flexible_right_spacing: false apply_to_dictionaries: true @@ -52,9 +50,6 @@ colon: operator_usage_whitespace: severity: warning -type_name: - validates_start_with_lowercase: warning - control_statement: severity: warning if_else: false diff --git a/src/Projects/BKCore/Project.swift b/src/Projects/BKCore/Project.swift index 247401fe..27d9067c 100644 --- a/src/Projects/BKCore/Project.swift +++ b/src/Projects/BKCore/Project.swift @@ -13,8 +13,7 @@ let project = Project.project( swiftLintScript ], dependencies: [ - ], - + ] ), Target.target( diff --git a/src/Projects/BKNetwork/Project.swift b/src/Projects/BKNetwork/Project.swift index 1d404620..13bc9512 100644 --- a/src/Projects/BKNetwork/Project.swift +++ b/src/Projects/BKNetwork/Project.swift @@ -13,7 +13,7 @@ let project = Project.project( swiftLintScript ], dependencies: [ - .core(), + .core() ] ), Target.target( diff --git a/src/Projects/Booket/Project.swift b/src/Projects/Booket/Project.swift index 0b87a78d..8298d2ba 100644 --- a/src/Projects/Booket/Project.swift +++ b/src/Projects/Booket/Project.swift @@ -34,7 +34,7 @@ let appTarget = Target.target( .debug(name: "Debug", xcconfig: "SupportingFiles/Debug.xcconfig"), .release(name: "Release", xcconfig: "SupportingFiles/Release.xcconfig") ] - ), + ) ) // MARK: - Project diff --git a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift index ec966c9e..77943e92 100644 --- a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift +++ b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift @@ -7,10 +7,18 @@ let swiftLintConfigPath = "\(projectDir)/../../.swiftlint.yml" public let swiftLintScript: TargetScript = .pre( script: """ - if which swiftlint > /dev/null; then - swiftlint --config "\(swiftLintConfigPath)" + export PATH="/opt/homebrew/bin:$PATH" + + SWIFTLINT_PATH=$(which swiftlint) + echo "❗️SwiftLint Path: $SWIFTLINT_PATH" + SWIFTLINT_CONFIG_PATH="${SRCROOT%/*/*}/.swiftlint.yml" + echo "❗️SRCROOT Path: ${SWIFTLINT_CONFIG_PATH}" + + # SwiftLint 실행 + if [ -n "$SWIFTLINT_PATH" ]; then + swiftlint --config "$SWIFTLINT_CONFIG_PATH" else - echo "warning: SwiftLint not installed" + echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi """, name: "SwiftLint", diff --git a/src/swiftlint b/src/swiftlint deleted file mode 120000 index 0274d320..00000000 --- a/src/swiftlint +++ /dev/null @@ -1 +0,0 @@ -../Cellar/swiftlint/0.58.2/bin/swiftlint \ No newline at end of file From d1025b971c58c69b9ca79efe546f939e1178a2af Mon Sep 17 00:00:00 2001 From: doyeonk429 <80318425+doyeonk429@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:55:09 +0900 Subject: [PATCH 3/5] [BOOK-41] chore: delete path debug --- src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift index 77943e92..a6ca180d 100644 --- a/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift +++ b/src/Tuist/ProjectDescriptionHelpers/SwiftLintScript.swift @@ -10,11 +10,8 @@ public let swiftLintScript: TargetScript = .pre( export PATH="/opt/homebrew/bin:$PATH" SWIFTLINT_PATH=$(which swiftlint) - echo "❗️SwiftLint Path: $SWIFTLINT_PATH" SWIFTLINT_CONFIG_PATH="${SRCROOT%/*/*}/.swiftlint.yml" - echo "❗️SRCROOT Path: ${SWIFTLINT_CONFIG_PATH}" - # SwiftLint 실행 if [ -n "$SWIFTLINT_PATH" ]; then swiftlint --config "$SWIFTLINT_CONFIG_PATH" else From 524beccb949f53357a4b1e4aaf161ed091b8a0c9 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 17 Jun 2025 16:57:09 +0900 Subject: [PATCH 4/5] [BOOK-41] feat: Add coderabbit settings --- .coderabbit.yaml | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..c2752113 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,85 @@ +language: ko-KR + +early_access: true +enable_free_tier: true +auto_resolve_threads: false + +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: + enabled: true + max_token_length: 4096 + +knowledge_base: + web_search: + enabled: true + learnings: + scope: auto + issues: + scope: auto + jira: + project_keys: [] From 2f454ff7aa960839a873ee5171dd7f172606870d Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 17 Jun 2025 17:09:37 +0900 Subject: [PATCH 5/5] [BOOK-41] chore: Fix coderabbit settings --- .coderabbit.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index c2752113..bb815ee7 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -2,7 +2,6 @@ language: ko-KR early_access: true enable_free_tier: true -auto_resolve_threads: false reviews: profile: chill @@ -71,8 +70,7 @@ reviews: essential_rules: true chat: - enabled: true - max_token_length: 4096 + auto_reply: true knowledge_base: web_search: