diff --git a/.gitignore b/.gitignore index 54a5f5de..39b284ee 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ # Ignore Gradle build output directory build -.idea \ No newline at end of file +.idea +# Ignore backup files created during exploration +*.orig diff --git a/.jules/bolt.md b/.jules/bolt.md index ee124e69..2bb95e82 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -62,3 +62,27 @@ ## 2026-08-11 - Array의 toMutableList 할당 오버헤드 최적화 **학습:** 배열을 정렬하기 위해 `.toMutableList()`를 호출하면 새로운 `ArrayList` 객체와 내부 배열 객체가 할당되어 대규모 디렉토리를 순회할 때 가비지 컬렉션(GC) 부하를 유발합니다. 배열 복제가 필요한 경우 `.clone()`을 사용하면 하나의 배열 객체만 새로 할당되므로 더 효율적입니다. **조치:** 디렉토리 파일 배열을 정렬하기 전에 복사할 때 `.toMutableList()` 대신 `.clone()`을 사용하여 불필요한 중간 컬렉션 할당을 제거하고 성능을 향상시켰습니다. +## 2026-09-25 - 문자열 변환 지연 할당을 통한 GC 오버헤드 감소 +**Learning:** 디렉토리 순회 중 파일 필터링 시 모든 파일 이름에 대해 무조건 `toLowerCase()`를 호출하면 불필요한 중간 문자열이 생성되어 가비지 컬렉션(GC) 부하가 발생합니다. `isHiddenFile()`이나 `endsWith("~")`와 같은 저렴한 검사를 먼저 수행하면 많은 파일에서 문자열 할당을 생략할 수 있습니다. +**Action:** 핫 패스(hot path)에서 문자열 할당(예: `toLowerCase()`)을 수행하기 전에, 변환이 필요 없는 저렴한 메모리 내 검사(예: 접두사/접미사 확인)를 먼저 배치하여 단축(short-circuit) 평가를 활용합니다. +## 2026-09-26 - 인프라 문제 시 우회 전략 학습 +**Learning:** CI가 인프라 이슈(예: Noema HTTP 429)로 실패했을 경우, 코드베이스의 문제를 찾으려 하지 말고 재시도를 위한 명확한 조치를 고려하거나, 필요한 경우 submit 도구를 단순 재호출하여 일시적인 장애를 돌파해야 합니다. +**Action:** API provider의 일시적 장애가 원인임을 로그에서 확인하면, 코드를 변경하지 않고 우회하거나 submit을 재시도합니다. +## 2026-09-26 - 인프라 문제 시 우회 전략 학습 +**Learning:** CI가 인프라 이슈(예: opencode-review의 No APPROVED or CHANGES_REQUESTED 등)로 실패했을 경우, 코드베이스의 문제를 찾으려 하지 말고 재시도를 위한 명확한 조치를 고려하거나, 필요한 경우 submit 도구를 단순 재호출하여 일시적인 장애를 돌파해야 합니다. +**Action:** API provider의 일시적 장애가 원인임을 로그에서 확인하면, 코드를 변경하지 않고 우회하거나 submit을 재시도합니다. +## 2026-09-26 - 임시 파일 처리 및 버전 관리 위생 +**Learning:** PR 탐색 과정에서 생성된 백업 파일이나 임시 파일(, 등)은 코드베이스를 오염시키므로 PR 제출 전 반드시 삭제해야 하며, 동일한 실수를 방지하기 위해 에 해당 확장자를 추가하는 것이 중요합니다. +**Action:** 탐색 과정에서 파생된 백업 파일()을 찾아서 삭제하고, 에 해당 패턴을 추가하는 작업을 수행합니다. +## 2026-09-26 - 임시 파일 처리 및 버전 관리 위생 +**Learning:** PR 탐색 과정에서 생성된 백업 파일이나 임시 파일(.orig, .rej 등)은 코드베이스를 오염시키므로 PR 제출 전 반드시 삭제해야 하며, 동일한 실수를 방지하기 위해 .gitignore에 해당 확장자를 추가하는 것이 중요합니다. +**Action:** 탐색 과정에서 파생된 백업 파일(.orig)을 찾아서 삭제하고, .gitignore에 해당 패턴을 추가하는 작업을 수행합니다. +## 2026-09-26 - 백업 파일 제외 정책 누락 방지 +**Learning:** PR 검토 시 `.gitignore`에 의도적으로 추가했던 규칙(`*.orig` 등)이 리베이스나 다른 커밋 과정에서 누락되어 CI 정책 검사에서 실패할 수 있습니다. +**Action:** PR 리뷰 피드백을 통해 `.gitignore` 누락을 발견하면 즉시 해당 규칙을 다시 추가하고 전체 테스트 스위트를 재실행하여 커버리지와 안정성을 검증합니다. +## 2026-09-26 - .gitignore 중복 관리 +**Learning:** 여러 번의 커밋 시도를 통해 `.gitignore` 등에 항목(`*.orig`)이 중복해서 들어갈 수 있으며, 이는 리뷰 과정에서 문제를 일으킵니다. +**Action:** 설정 파일을 수정할 때는 중복을 방지하기 위해 내용 확인을 먼저 수행하거나 고유성을 보장하도록 정제(deduplication)하고 코멘트를 남깁니다. +## 2026-09-26 - PR 상태 검토 및 대기 전략 +**Learning:** 코드 수정 후 리뷰 피드백에서 상태가 보존되었음을 명시하고 큐(queue) 대기 상황을 알려줄 경우, 추가적인 코드 수정 없이 진행 상황을 모니터링하며 응답하는 것이 중요합니다. +**Action:** 추가 수정이 필요 없는 상태 업데이트 코멘트에 대해서는 코드가 보존되었음을 확인하고 완료 대기 중임을 답변합니다. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index 0972fa2c..57f55b15 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -351,16 +351,17 @@ fun process_ignore_file(curr_dir: File, dirFilesNames: Array? = null): S // 보안 향상: dot-like prefixes and case variants of known sensitive names are excluded. (dirFilesNames ?: curr_dir.list())?.forEach { - val normalizedName = it.toLowerCase(java.util.Locale.ROOT) - if ( - it.isHiddenFile() || - normalizedName in Constants.defaultSensitiveFileNamesLowercase || - normalizedName.endsWith("~") || - Constants.defaultSensitiveExtensions.any { extension -> - normalizedName.endsWith(extension) - } - ) { + if (it.isHiddenFile() || it.endsWith("~")) { files_to_exclude.add(it) + } else { + // ⚡ Bolt Performance Optimization: 저렴한 검사 통과 후 문자열을 변환하여 불필요한 GC 오버헤드 감소 + val normalizedName = it.toLowerCase(java.util.Locale.ROOT) + if ( + normalizedName in Constants.defaultSensitiveFileNamesLowercase || + Constants.defaultSensitiveExtensions.any { extension -> normalizedName.endsWith(extension) } + ) { + files_to_exclude.add(it) + } } }