-
Notifications
You must be signed in to change notification settings - Fork 0
[Chore] update ci #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
WalkthroughMermaid 그래프 표기를 명명된 레이블 기반 노드와 직접 관계로 재작성했고, Gradle 의존성 그래프 스크립트에 부모 모듈 제외 집합 및 경로 단순화/필터링 로직을 추가했으며, 빌드 로직을 Android/Kotlin 확장별 오버로드로 분리하고 여러 버전·프로퍼티·설정을 갱신했습니다. Changes
Sequence Diagram(s)(생략) Estimated code review effort🎯 4 (Complex) | ⏱️ ~40 분 Possibly related PRs
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@gradle/libs.versions.toml`:
- Line 5: The dependency entry kotlinxSerializationJson = "1.10.0" is built for
Kotlin 2.3.0 and may be incompatible with our Kotlin 2.2.20; either upgrade the
project's Kotlin version to 2.3.0 (update Kotlin settings where Kotlin version
is declared) or change the kotlinxSerializationJson version to a 1.9.x release
that supports Kotlin 2.2.x, and ensure all serialization-related imports and
usages still compile; additionally verify ktlint-compose-rules (0.5.5 vs 0.5.3)
compatibility with ktlint 14.0.1 and adjust that dependency if it requires a
different ktlint/Kotlin combination.
| coreSplashscreen = "1.2.0" | ||
| kotlin = "2.2.20" | ||
| kotlinxSerializationJson = "1.9.0" | ||
| kotlinxSerializationJson = "1.10.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
kotlinx-serialization-json 1.10.0 release notes compatibility Kotlin
💡 Result:
kotlinx-serialization-json 1.10.0 release notes (highlights)
kotlinx-serialization 1.10.0 is based on Kotlin 2.3.0 and includes all changes from 1.10.0-RC, plus one extra fix: ProtoBuf packing of Kotlin unsigned types. [1]
Key notable changes called out in the release notes:
- Several widely-used JSON options are now stable (no longer experimental):
decodeEnumsCaseInsensitive,allowTrailingComma,allowComments,prettyPrintIndent. [1] @EncodeDefaultis now stable. [1]JsonUnquotedLiteral(...)is now stable. [1]- JSON APIs stabilized around unsigned primitives and some JSON DSL overloads. [1]
- Marked for Kotlin 2.3.0’s “Return Value Checker” feature (warnings for ignored return values when enabled). [1]
Kotlin compatibility / which Kotlin version to use
- The 1.10.0 release is explicitly based on Kotlin 2.3.0. [1]
- The serialization compiler plugin is released in tandem with the Kotlin compiler, so you should use the matching plugin version (i.e.,
kotlin("plugin.serialization") version "2.3.0"when on Kotlin 2.3.0). [2] - In general, the project’s stated policy is that newer compiler plugins aim to stay backward-compatible with older runtimes, but some new compiler/plugin features may require a newer runtime (and the compiler will report incompatibilities). [3]
Sources: [1] [2] [3]
🌐 Web query:
ktlint-compose-rules 0.5.5 release notes ktlint version requirement
💡 Result:
I couldn’t find any ktlint-compose-rules (io.nlopez.compose.rules:ktlint) release/tag 0.5.5 in the public artifacts/docs I checked; the “0.5.5” you’re seeing may refer to an unrelated Gradle plugin version (uk.co.iotatech.gradle.ktlint 0.5.5). [3]
For the actual compose rules artifact, 0.5.3 is published on Maven Central and its POM shows it depends on ktlint 1.8.0 (ktlint-rule-engine and ktlint-cli-ruleset-core both at 1.8.0). [1] The project’s supported-versions matrix also indicates ktlint 1.8.0 support starting from compose-rules 0.4.28+. [2]
Answer: ktlint requirement is 1.8.0 (for current releases like 0.5.3); no public 0.5.5 release notes were found for this artifact. [1] [2]
References:
[1] Maven Central POM for io.nlopez.compose.rules:ktlint:0.5.3 (dependencies show ktlint 1.8.0) (central.sonatype.com)
[2] compose-rules “Using with ktlint” supported versions matrix (mrmans0n.github.io)
[3] Gradle plugin portal entry for uk.co.iotatech.gradle.ktlint version 0.5.5 (plugins.gradle.org)
Citations:
- 1: https://central.sonatype.com/artifact/io.nlopez.compose.rules/ktlint/0.5.3
- 2: https://mrmans0n.github.io/compose-rules/ktlint/?utm_source=openai
- 3: https://plugins.gradle.org/plugin/uk.co.iotatech.gradle.ktlint/0.5.5?utm_source=openai
🏁 Script executed:
# Check the gradle/libs.versions.toml file for context on versions
cat gradle/libs.versions.toml | head -60Repository: kkh725/Multi_Module_Template
Length of output: 1058
kotlinx-serialization-json 1.10.0을 Kotlin 2.2.20과 함께 사용 불가능
릴리즈 노트에 따르면 kotlinx-serialization-json 1.10.0은 Kotlin 2.3.0 기준으로 빌드되었습니다. 현재 프로젝트는 Kotlin 2.2.20을 사용하고 있어 호환성 문제가 발생할 수 있습니다. 공식 정책에서 "일부 새로운 컴파일러/플러그인 기능은 더 높은 런타임 버전을 요구할 수 있다"고 명시되어 있으므로, 다음 중 하나를 선택하세요:
- Kotlin을 2.3.0으로 업그레이드, 또는
- kotlinx-serialization-json을 더 낮은 버전(1.9.x)으로 유지
ktlint-compose-rules 0.5.5의 ktlint 14.0.1 호환성도 공식 문서에서 확인 필요합니다 (최신 공개 버전 0.5.3은 ktlint 1.8.0 기준).
🤖 Prompt for AI Agents
In `@gradle/libs.versions.toml` at line 5, The dependency entry
kotlinxSerializationJson = "1.10.0" is built for Kotlin 2.3.0 and may be
incompatible with our Kotlin 2.2.20; either upgrade the project's Kotlin version
to 2.3.0 (update Kotlin settings where Kotlin version is declared) or change the
kotlinxSerializationJson version to a 1.9.x release that supports Kotlin 2.2.x,
and ensure all serialization-related imports and usages still compile;
additionally verify ktlint-compose-rules (0.5.5 vs 0.5.3) compatibility with
ktlint 14.0.1 and adjust that dependency if it requires a different
ktlint/Kotlin combination.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🤖 Fix all issues with AI agents
In @.claude/settings.local.json:
- Around line 15-17: settings.local.json is being tracked despite its "local"
name and it contains the WebSearch permission which is undocumented; either
remove settings.local.json from source control by adding it to .gitignore and
revert the tracked file (so local-only settings like WebSearch aren’t
committed), or move the shared configuration (including "WebSearch") into a new
vetted file (e.g., settings.json) and remove that key from settings.local.json,
then add documentation (README or a settings.md) explaining why "WebSearch" is
required and what external access it enables; update any CI/automation configs
to reference the new shared file if you choose the latter.
In @.editorconfig:
- Around line 80-82: Remove the unnecessary trailing blank lines at the end of
.editorconfig so the file ends immediately after the last non-empty line; this
must align with the existing settings insert_final_newline = false and
trim_trailing_whitespace = true. Locate the insert_final_newline and
trim_trailing_whitespace entries and delete the extra empty lines (there are
three) so no final newline or trailing whitespace remains.
In `@gradle.properties`:
- Around line 45-53: These three gradle properties (android.uniquePackageNames,
android.r8.strictFullModeForKeepRules, android.disallowKotlinSourceSets) are
temporary workarounds for AGP 9.0; remove them once you migrate: update/replace
dependencies that cause duplicate package names so you can drop
android.uniquePackageNames=false, revise R8 keep rules/explicit constructors so
android.r8.strictFullModeForKeepRules=false is no longer needed, and convert
legacy Kotlin source set layout to the new built-in Kotlin layout so
android.disallowKotlinSourceSets=false can be removed; after each change, remove
the corresponding property and run a clean build to verify compatibility with
AGP 9.0 defaults.
♻️ Duplicate comments (1)
gradle/libs.versions.toml (1)
4-5: kotlinx-serialization-json 1.10.0은 Kotlin 2.3.0 이상을 요구합니다.이전 리뷰에서 이미 언급된 문제입니다. Kotlin 2.2.20과 함께 사용하려면 kotlinx-serialization-json을 1.9.x 버전으로 다운그레이드하거나 Kotlin을 2.3.0으로 업그레이드해야 합니다.
🧹 Nitpick comments (2)
build-logic/convention/src/main/java/com/kkh/convention/extensions/AndroidCompose.kt (1)
15-76: Application과 Library 구성 로직의 코드 중복
ApplicationExtension과LibraryExtension오버로드의 구성 로직이 거의 동일합니다.configureComposeCompiler()를 추출한 것은 좋은 접근이지만,buildFeatures,dependencies,testOptions설정도 공통 헬퍼로 추출할 수 있습니다.♻️ 중복을 줄이기 위한 리팩토링 제안
private fun Project.configureComposeDependencies() { dependencies { add("ktlintRuleset", libs.findLibrary("ktlint-compose-rules").get()) val bom = libs.findLibrary("androidx-compose-bom").get() "implementation"(platform(bom)) "androidTestImplementation"(platform(bom)) "implementation"(libs.findLibrary("androidx-material3").get()) "implementation"(libs.findLibrary("androidx-ui-tooling-preview").get()) "debugImplementation"(libs.findLibrary("androidx-ui-tooling").get()) } } internal fun Project.configureAndroidCompose( applicationExtension: ApplicationExtension, ) { applicationExtension.apply { buildFeatures { compose = true } testOptions { unitTests { isIncludeAndroidResources = true } } } configureComposeDependencies() configureComposeCompiler() } internal fun Project.configureAndroidCompose( libraryExtension: LibraryExtension, ) { libraryExtension.apply { buildFeatures { compose = true } testOptions { unitTests { isIncludeAndroidResources = true } } } configureComposeDependencies() configureComposeCompiler() }build-logic/convention/src/main/java/com/kkh/convention/extensions/Kotlin.kt (1)
12-92: 세 개의 오버로드에서 상당한 코드 중복
ApplicationExtension,LibraryExtension,TestExtension오버로드가 거의 동일한 로직을 포함합니다. 주석에서CommonExtension의 공통 기능을 언급하고 있지만, 실제 구현에서는 활용하지 않고 있습니다.공통 설정 로직을 헬퍼 함수로 추출하여 중복을 줄이는 것이 좋습니다.
♻️ 공통 설정을 추출하는 리팩토링 제안
import com.android.build.api.dsl.CommonExtension private fun Project.configureCommonAndroid( commonExtension: CommonExtension<*, *, *, *, *, *> ) { commonExtension.apply { compileSdk = libs.findVersion("projectCompileSdkVersion").get().toString().toInt() defaultConfig { minSdk = libs.findVersion("projectMinSdkVersion").get().toString().toInt() } compileOptions { isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } } configureKotlin() dependencies { "implementation"(libs.findLibrary("kotlinx-collections-immutable").get()) "coreLibraryDesugaring"(libs.findLibrary("desugar.jdk.libs").get()) } } internal fun Project.configureKotlinAndroid( applicationExtension: ApplicationExtension ) = configureCommonAndroid(applicationExtension) internal fun Project.configureKotlinAndroid( libraryExtension: LibraryExtension ) = configureCommonAndroid(libraryExtension) internal fun Project.configureKotlinAndroid( testExtension: TestExtension ) = configureCommonAndroid(testExtension)
| "mcp__github__get_pull_request", | ||
| "mcp__github__get_pull_request_files" | ||
| "mcp__github__get_pull_request_files", | ||
| "WebSearch" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify settings.local.json management and WebSearch usage
echo "=== Checking .gitignore for settings.local.json ==="
if [ -f .gitignore ]; then
grep -n 'settings\.local\.json' .gitignore || echo "Not found in .gitignore"
else
echo ".gitignore not found"
fi
echo ""
echo "=== Checking WebSearch references in .claude/*.json ==="
find .claude -name '*.json' -type f 2>/dev/null | while read file; do
if grep -q 'WebSearch' "$file"; then
echo "Found in: $file"
grep -n 'WebSearch' "$file"
fi
done || echo "No .claude directory or JSON files"
echo ""
echo "=== Checking WebSearch documentation in markdown files ==="
rg -n 'WebSearch' --type md . 2>/dev/null || echo "No WebSearch references in markdown files"
echo ""
echo "=== Listing .claude directory structure ==="
if [ -d .claude ]; then
find .claude -type f | head -20
else
echo ".claude directory not found"
fi
echo ""
echo "=== Checking if settings.local.json is tracked in git ==="
git ls-files | grep settings.local.json || echo "Not in git tracking"Repository: kkh725/Multi_Module_Template
Length of output: 525
로컬 파일로 명명된 설정이 저장소에 추적되고 있으며 WebSearch 권한이 문서화되지 않음
settings.local.json이 저장소에 추적되는 공유 파일이면서도 "로컬" 파일로 명명되어 있습니다. WebSearch 권한 추가는 마크다운 문서에 설명이 없으므로, 자동화/CI에서 의도하지 않은 외부 통신을 유발할 수 있습니다. 다음 중 하나를 수행하세요:
settings.local.json을.gitignore에 추가하여 진정한 로컬 전용 파일로 관리하거나- 공유 설정은 별도 파일(예:
settings.json)로 분리하고 WebSearch 필요성을 문서화하기
🛠️ WebSearch 제거 제안
- "mcp__github__get_pull_request_files",
- "WebSearch"
+ "mcp__github__get_pull_request_files"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "mcp__github__get_pull_request", | |
| "mcp__github__get_pull_request_files" | |
| "mcp__github__get_pull_request_files", | |
| "WebSearch" | |
| "mcp__github__get_pull_request", | |
| "mcp__github__get_pull_request_files" |
🤖 Prompt for AI Agents
In @.claude/settings.local.json around lines 15 - 17, settings.local.json is
being tracked despite its "local" name and it contains the WebSearch permission
which is undocumented; either remove settings.local.json from source control by
adding it to .gitignore and revert the tracked file (so local-only settings like
WebSearch aren’t committed), or move the shared configuration (including
"WebSearch") into a new vetted file (e.g., settings.json) and remove that key
from settings.local.json, then add documentation (README or a settings.md)
explaining why "WebSearch" is required and what external access it enables;
update any CI/automation configs to reference the new shared file if you choose
the latter.
|
|
||
|
|
||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
파일 끝의 불필요한 빈 줄을 제거하세요.
파일 끝에 여러 개의 빈 줄(3개)이 있습니다. 이는 14번 줄의 insert_final_newline = false 설정 및 9번 줄의 trim_trailing_whitespace = true 설정과 일관성이 없습니다. 파일 끝의 빈 줄을 제거하여 설정과 일치시키는 것이 좋습니다.
🧹 제안하는 수정
ktlint_standard_trailing-comma-on-declaration-site = disabled
-
-
-📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ktlint_standard_trailing-comma-on-declaration-site = disabled |
🤖 Prompt for AI Agents
In @.editorconfig around lines 80 - 82, Remove the unnecessary trailing blank
lines at the end of .editorconfig so the file ends immediately after the last
non-empty line; this must align with the existing settings insert_final_newline
= false and trim_trailing_whitespace = true. Locate the insert_final_newline and
trim_trailing_whitespace entries and delete the extra empty lines (there are
three) so no final newline or trailing whitespace remains.
| android.experimental.lint.runBenchmarksInSeparateProcess=true | ||
| android.uniquePackageNames=false | ||
| android.r8.strictFullModeForKeepRules=false | ||
|
|
||
| # Suppress library constraints warning | ||
| android.generateSyncIssueWhenLibraryConstraintsAreEnabled=false | ||
|
|
||
| # Allow KSP to add Kotlin source sets (needed for Hilt/KSP with built-in Kotlin) | ||
| android.disallowKotlinSourceSets=false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
AGP 9.0 android.uniquePackageNames migration
💡 Result:
In AGP 9.0.0 the Gradle property android.uniquePackageNames now defaults from false → true, meaning every Android library on the classpath must have a distinct manifest package name (the historical “package name” used for resource namespacing). If two AARs share the same package, AGP fails the build. [1]
What to do (migration)
-
Identify the conflicting libraries
The build typically fails with an error like “more than one library with package name …”. That package is the one duplicated. -
Fix the conflict (preferred)
- Upgrade/replace the offending dependency versions so they no longer share a package (this often means moving off old Android Support libraries to AndroidX equivalents). A known historical example is support vector drawable artifacts sharing a package name. [2]
- If the duplicates come from your own modules, ensure each Android library module has a unique:
android { namespace = "..." }(module-level), and- (if still present) distinct manifest
packageusage consistent with modern AGP guidance.
-
Temporary escape hatch (while you migrate)
Add togradle.properties:android.uniquePackageNames=falseThen remove it once you’ve made package names unique. [1]
Sources: AGP 9.0.0 release notes (property default change + guidance) [1]; AndroidX repo comment showing real-world duplicate-package conflict and opting out via android.uniquePackageNames=false [2].
🌐 Web query:
android.r8.strictFullModeForKeepRules AGP 9.0
💡 Result:
android.r8.strictFullModeForKeepRules is an AGP Gradle property that makes R8 “full mode” stricter about keep rules: a rule like -keep class A no longer implicitly keeps the default (no-args) constructor (<init>()). In other words, if you need the default constructor kept, you must spell it out in the keep rule. [1][2]
In Android Gradle Plugin (AGP) 9.0.0, the default changes from false → true. To preserve the older behavior while you migrate, set this in gradle.properties: [1]
android.r8.strictFullModeForKeepRules=falseTo migrate “correctly” with the new default, update rules that relied on the implicit constructor keep, e.g.: [1][2]
-keep class com.example.A { <init>(); }Sources: AGP 9.0.0 release notes [1], Android “Use R8 in full mode” doc (constructor behavior in full mode) [2].
🌐 Web query:
android.disallowKotlinSourceSets KSP Hilt configuration
💡 Result:
android.disallowKotlinSourceSets is an Android Gradle Plugin (AGP) migration flag: when it’s true, AGP rejects the “Kotlin source sets” wiring (the Kotlin-Android source set factory / legacy Kotlin source-set layout) and forces you onto Android’s source sets only. Google’s own AndroidX build currently pins it to false with a note that defaults will change in AGP 9.0.0. [1]
What to do for KSP + Hilt
-
Prefer Android source sets (
src/main/kotlin,src/androidTest/kotlin, etc.) and don’t rely on custom Kotlin source-set layout. If you’re coming from a legacy Kotlin MPP/Android layout, migrate to the “new Android source set layout” described by JetBrains. [2] -
Use KSP for Hilt by putting the compiler on
ksp(...)(notkapt(...)), per Dagger’s KSP setup docs: [3]
plugins {
id("com.android.application")
id("com.google.dagger.hilt.android")
id("com.google.devtools.ksp")
// AGP < 9: also apply id("org.jetbrains.kotlin.android")
}
dependencies {
implementation("com.google.dagger:hilt-android:<version>")
ksp("com.google.dagger:hilt-compiler:<version>")
// If you use AndroidX Hilt extensions (work, navigation, etc.):
// ksp("androidx.hilt:hilt-compiler:<version>")
}- Make sure your Kotlin + KSP versions match. With AGP 9.0, AGP has “built-in Kotlin” enabled by default and will align/upgrade KGP/KSP to compatible minimums unless you override. [4]
When to touch android.disallowKotlinSourceSets
- If your build breaks after enabling it: set
android.disallowKotlinSourceSets=false(or remove it if your AGP default is alreadyfalse) while you migrate off Kotlin-source-set customization. [1][2] - If you don’t use custom Kotlin source sets: you typically don’t need this property at all.
Sources:
[1] AndroidX gradle.properties (shows android.disallowKotlinSourceSets=false and “will change in AGP 9.0.0”) https://android.googlesource.com/platform/frameworks/support/+/androidx-main/gradle.properties
[2] Kotlin docs: Android source set layout / migration https://kotlinlang.org/docs/multiplatform/multiplatform-android-layout.html
[3] Dagger docs: KSP setup for Dagger/Hilt https://dagger.dev/dev-guide/ksp.html
[4] AGP 9.0 release notes (built-in Kotlin + KSP alignment) https://developer.android.com/build/releases/agp-9-0-0-release-notes
AGP 9.0.0 마이그레이션: 임시 속성 설정 확인
새로 추가된 세 가지 속성은 AGP 9.0.0 마이그레이션을 위한 임시 설정입니다:
-
android.uniquePackageNames=false— AGP 9.0에서 기본값이 false → true로 변경되어 라이브러리 패키지명의 유일성이 강제됩니다. 이 설정은 중복된 패키지명을 가진 의존성들을 업그레이드하거나 교체할 때까지의 임시 완화입니다. -
android.r8.strictFullModeForKeepRules=false— AGP 9.0에서 기본값이 false → true로 변경되어 R8의 keep 규칙이 더 엄격해집니다(예: 기본 생성자를 명시적으로 지정해야 함). 이 설정은 기존 keep 규칙들을 업데이트할 때까지의 임시 회피책입니다. -
android.disallowKotlinSourceSets=false— 레거시 Kotlin 소스셋 레이아웃을 사용 중인 경우 빌드 호환성을 위한 플래그입니다. AGP 9.0의 built-in Kotlin 기능과 함께 사용할 때 기존 설정을 유지하도록 합니다.
향후 의존성을 업그레이드하고 코드를 AGP 9.0의 새로운 기본값에 맞게 수정한 후 이 속성들을 제거하는 것이 권장됩니다.
🤖 Prompt for AI Agents
In `@gradle.properties` around lines 45 - 53, These three gradle properties
(android.uniquePackageNames, android.r8.strictFullModeForKeepRules,
android.disallowKotlinSourceSets) are temporary workarounds for AGP 9.0; remove
them once you migrate: update/replace dependencies that cause duplicate package
names so you can drop android.uniquePackageNames=false, revise R8 keep
rules/explicit constructors so android.r8.strictFullModeForKeepRules=false is no
longer needed, and convert legacy Kotlin source set layout to the new built-in
Kotlin layout so android.disallowKotlinSourceSets=false can be removed; after
each change, remove the corresponding property and run a clean build to verify
compatibility with AGP 9.0 defaults.
Summary by CodeRabbit
릴리스 노트
문서
개선
변경
✏️ Tip: You can customize this high-level summary in your review settings.