Skip to content

Conversation

@Monfi98
Copy link
Contributor

@Monfi98 Monfi98 commented Jul 16, 2025

💡 PR 유형

  • ✨ Feature (기능 추가)
  • 🐞 Bugfix (버그 수정)
  • 🔧 Refactor (코드 리팩토링)
  • ⚙️ Chore (환경 설정)
  • 📝 Docs (문서 작성 및 수정)
  • ✅ Test (기능 테스트)

✏️ 변경 사항

🚨 관련 이슈

🧪 테스트

  • 목표한 구현 정상 동작 확인
  • 엣지 케이스 테스트 완료
  • 기존 기능 영향 없음

✅ 체크리스트

  • 코드/커밋이 정해진 컨벤션을 잘 따르고 있나요?
  • PR의 Assignees와 Reviewers를 설정했나요?
  • 불필요한 코드가 없고, 정상적으로 동작하는지 확인했나요?
  • 관련 이슈 번호를 작성했나요?

🔥 추가 설명 or 리뷰 포인트

Tuist v4 부터는 mise로의 설치를 권장하네요!

// 1. mise 설치
brew install mise

// 2. tuist 설치
mise install tuist@4.55.6

// 3. 프로젝트 루트 폴더로 이동
cd ~/RunLog/RunLog

// 4. install & generate
tuist install
tuist generate

이후 프로젝트가 열리는데, 빌드가 잘되는지 확인해주시면 될 것 같습니다.
이 PR이 합쳐지면 카톡에 말씀드린대로 Layer 별 모듈화를 시작하겠습니다.

Summary by CodeRabbit

  • Chores
    • 프로젝트에 Tuist 기반 설정 파일과 의존성 관리 파일이 추가되었습니다.
    • 기존 Xcode 프로젝트 및 스킴 파일이 삭제되었습니다.
    • 새로운 Info.plist 파일이 앱과 테스트 타겟에 추가되었습니다.
    • .gitignore가 Tuist 관련 파일을 무시하도록 확장되었습니다.

@Monfi98 Monfi98 added this to the MVP 1차 스프린트🔥 milestone Jul 16, 2025
@Monfi98 Monfi98 self-assigned this Jul 16, 2025
@Monfi98 Monfi98 added this to RunLog Jul 16, 2025
@github-project-automation github-project-automation bot moved this to In review in RunLog Jul 16, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jul 16, 2025

Warning

Rate limit exceeded

@Monfi98 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 14 minutes and 11 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between e7f1667 and 6f17cd4.

📒 Files selected for processing (1)
  • .gitignore (1 hunks)

Walkthrough

Tuist 기반의 프로젝트 관리로 전환하는 초기 설정 작업이 이루어졌습니다. 기존 Xcode 프로젝트 파일과 스킴이 삭제되고, Tuist 관련 설정 파일, 패키지 관리 파일, 프로젝트 및 타겟 정의 파일, Info.plist 등이 새롭게 추가되었습니다.

Changes

파일/경로 그룹 변경 요약
RunLog/RunLog.xcodeproj/project.pbxproj,
RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RunLog.xcscheme
기존 Xcode 프로젝트 파일 및 스킴 삭제
RunLog/Project.swift,
RunLog/Tuist.swift
Tuist용 프로젝트 및 엔트리포인트 Swift 파일 추가
RunLog/Tuist/Package.swift,
RunLog/Tuist/Package.resolved,
RunLog/Tuist/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
Tuist 패키지 관리 및 워크스페이스 파일 추가
RunLog/.package.resolved Swift 패키지 의존성 버전 고정 파일 추가
RunLog/RunLog/InfoPlists/RunLog-Info.plist,
RunLog/RpTest/InfoPlists/RpTest-Info.plist
앱 및 테스트 타겟 Info.plist 파일 추가
RunLog/mise.toml mise를 통한 tuist 버전 관리 파일 추가
.gitignore Tuist 및 Xcode 관련 파일/폴더 ignore 규칙 추가

Sequence Diagram(s)

sequenceDiagram
    participant Developer
    participant Tuist
    participant SwiftPM

    Developer->>Tuist: tuist generate
    Tuist->>SwiftPM: Resolve dependencies (Package.swift, Package.resolved)
    Tuist->>Tuist: Read Project.swift, Tuist.swift
    Tuist->>Tuist: Generate Xcode project/Workspace
    Tuist-->>Developer: Xcode 프로젝트 생성 완료
Loading

Assessment against linked issues

Objective (이슈 번호) Addressed Explanation
Tuist v4 적용 (#133)

Assessment against linked issues: Out-of-scope changes

(해당 변경사항 내에서 범위 외 변경사항 없음)

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#133

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai auto-generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or 코드토깽이의 요약 to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @코드토깽이 anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (1)
RunLog/Tuist/Package.resolved (1)

1-69: 이 코멘트는 상위 .package.resolved에 대한 지적과 동일합니다.

🧹 Nitpick comments (6)
RunLog/Tuist.swift (1)

1-3: 기본 Tuist 구성 검토

현재 기본 Tuist 구성(.tuist())을 사용하고 있습니다. 프로젝트 초기 설정으로는 적절하지만, 향후 프로젝트 성장에 따라 더 명시적인 구성이 필요할 수 있습니다.

향후 프로젝트 요구사항이 명확해지면 더 구체적인 Tuist 구성을 고려해보세요:

let tuist = Tuist(
    project: .tuist(),
    generationOptions: .options(
        xcodeProjectName: "RunLog",
        organizationName: "Your Organization"
    )
)
RunLog/RpTest/InfoPlists/RpTest-Info.plist (1)

5-20: 테스트 번들의 CFBundleIdentifier가 비어 있을 수 있음

$(PRODUCT_BUNDLE_IDENTIFIER)가 Xcode 설정에 정의되지 않은 경우, 테스트 실행 시 번들 로딩 오류가 발생합니다.
RpTest 타겟의 Target -> Build Settings -> PRODUCT_BUNDLE_IDENTIFIER를 확인해 값이 채워져 있는지 검증해 주세요.

RunLog/Tuist/Package.swift (1)

15-23: 제품/타깃 정의가 없어서 빈 패키지로 인식됩니다

현재 dependencies만 선언되어 있고 targets가 없습니다.
오로지 의존성 래핑용 패키지라면 문제없지만, 향후 재사용성을 위해 최소한 빈 타깃을 추가하거나 해당 패키지를 제거하고 Project.swift에서 직접 의존성을 선언하는 방안도 고려해 보세요.

RunLog/Derived/Sources/TuistBundle+RunLog.swift (1)

14-16: 영문 주석 오타 및 문구 보강 제안

RunLog is a applicationRunLog is an application
사용자·리뷰어 모두에게 가독성을 높이는 사소한 부분이니 한 번에 수정해두면 좋겠습니다.

RunLog/RunLog/InfoPlists/RunLog-Info.plist (1)

74-77: armv7 단독 명시는 최신 단말(arm64) 제외 가능성

UIRequiredDeviceCapabilitiesarmv7만 있는 경우 arm64 전용 기기(예: 최신 iPhone)에서 설치가 제한될 수 있습니다. 필요하다면 항목 제거 또는 arm64 추가를 검토하세요.

RunLog/Derived/Sources/TuistFonts+RunLog.swift (1)

84-89: 폰트 등록 실패 무시

CTFontManagerRegisterFontsForURL 호출 결과를 확인하지 않아, 동일 폰트 중복 등록이나 실패가 발생해도 알 수 없습니다. 반환값을 체크하여 로그를 남기거나 assertionFailure 로 알림 처리하는 것을 권장합니다.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 304c45c and a959806.

📒 Files selected for processing (16)
  • RunLog/.package.resolved (1 hunks)
  • RunLog/Derived/Sources/TuistAssets+RunLog.swift (1 hunks)
  • RunLog/Derived/Sources/TuistBundle+RunLog.swift (1 hunks)
  • RunLog/Derived/Sources/TuistFonts+RunLog.swift (1 hunks)
  • RunLog/Project.swift (1 hunks)
  • RunLog/RpTest/InfoPlists/RpTest-Info.plist (1 hunks)
  • RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RpTest.xcscheme (1 hunks)
  • RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RunLog.xcscheme (5 hunks)
  • RunLog/RunLog.xcworkspace/contents.xcworkspacedata (1 hunks)
  • RunLog/RunLog.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (1 hunks)
  • RunLog/RunLog/InfoPlists/RunLog-Info.plist (1 hunks)
  • RunLog/Tuist.swift (1 hunks)
  • RunLog/Tuist/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata (1 hunks)
  • RunLog/Tuist/Package.resolved (1 hunks)
  • RunLog/Tuist/Package.swift (1 hunks)
  • RunLog/mise.toml (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
RunLog/Derived/Sources/TuistAssets+RunLog.swift (1)
RunLog/Derived/Sources/TuistFonts+RunLog.swift (1)
  • iOS (71-81)
🔇 Additional comments (17)
RunLog/mise.toml (1)

1-2: 구성 파일 승인: Tuist 버전 4.55.6 유효성 및 안정성 확인 완료

  • RunLog/mise.toml의 구조와 문법은 올바릅니다.
  • Tuist 4.55.6이 공식적으로 출시된 안정 버전임이 확인되었으므로, 해당 설정을 그대로 승인합니다.

더 이상의 조치가 필요 없습니다.

RunLog/Tuist/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata (1)

1-7: Swift Package Manager 워크스페이스 파일 승인

이 파일은 Swift Package Manager에 의해 자동 생성되는 표준 워크스페이스 파일입니다. XML 구조와 설정이 올바르며, 표준 SwiftPM 패턴을 따릅니다.

RunLog/RunLog.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (1)

5-6: 자동 컨텍스트 생성 비활성화 설정 확인

IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded를 false로 설정한 것은 빌드 컨텍스트에 대한 더 나은 제어를 위한 합리적인 선택입니다. 복잡한 프로젝트에서 예상치 못한 컨텍스트 생성을 방지할 수 있습니다.

RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RunLog.xcscheme (2)

3-4: 스킴 버전 다운그레이드 확인 필요

스킴 버전이 1.7에서 1.3으로 다운그레이드되었습니다. 이는 일반적이지 않은 변경사항이며 Tuist 적용 과정에서 의도된 변경인지 확인이 필요합니다.


17-17: Blueprint 식별자 변경 확인

Blueprint 식별자가 변경되었습니다. 이는 Tuist 프로젝트 생성 과정에서 발생한 변경으로 보이지만, 프로젝트가 정상적으로 빌드되고 실행되는지 확인이 필요합니다.

Also applies to: 48-48, 65-65

RunLog/RunLog.xcworkspace/contents.xcworkspacedata (1)

7-25: 의존성 경로가 Tuist/.build/tuist-derived로 하드코딩되어 있습니다

tuist generate가 실행될 때마다 .build/tuist-derived 위치와 하위 경로가 바뀔 가능성이 있어 워크스페이스가 깨질 수 있습니다.
보통 Tuist 산출물은 소스컨트롤에 포함하지 않고 .gitignore로 제외하며, 워크스페이스 역시 Tuist가 재생성하게 두는 편이 재현성과 청결도를 높입니다.
해당 워크스페이스 파일을 커밋해야 하는 특별한 이유가 없다면:

  1. RunLog.xcworkspace를 버전 관리에서 제외
  2. .gitignore/*.xcworkspace 혹은 Tuist/.build 추가

방안을 검토해 주세요.

RunLog/.package.resolved (1)

1-69: .package.resolved 파일이 두 군데 존재해 관리 오차 가능성

프로젝트 루트와 Tuist/ 하위에 각각 Package.resolved가 커밋되어 있습니다.
버전이 불일치하면 의존성 충돌이 일어나 빌드가 달라질 수 있으므로 한 곳만 유지하거나, 자동 생성 파일은 커밋하지 않는 방향을 권장합니다.

RunLog/Project.swift (1)

24-26: Core Data 모델 경로 확인 필요

.coreDataModel("RunLog/Sources/Data/DTO/DTOs.xcdatamodeld") 가 실제로 존재하는지 확인 바랍니다. 경로가 잘못되면 tuist generate 단계에서 즉시 오류가 납니다.

RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RpTest.xcscheme (1)

1-87: 스킴 설정 전반 정상으로 보임

테스트·프로파일·아카이브 플로우 모두 구성되어 있으며 특이점은 없습니다.
추가 피드백이 없는 한 그대로 두셔도 무방합니다.

RunLog/Derived/Sources/TuistAssets+RunLog.swift (8)

1-5: 생성된 파일에 대한 린트 비활성화가 적절함

Tuist에서 생성된 파일이므로 SwiftLint와 SwiftFormat 비활성화가 적절합니다.


7-16: 플랫폼별 임포트 구조가 올바름

모든 Apple 플랫폼에 대한 조건부 임포트가 올바르게 구성되어 있습니다.


20-39: 에셋 정의가 포괄적이고 일관성 있음

RunLogAsset 열거형이 모든 색상과 이미지 에셋에 대한 타입 안전한 접근을 제공합니다. 명명 규칙이 일관되며 각 에셋이 적절한 타입으로 정의되어 있습니다.


43-70: RunLogColors 클래스 구현이 안전하고 포괄적임

색상 관리 클래스가 플랫폼별 타입 별칭과 함께 올바르게 구현되어 있습니다. fatalError 사용은 생성된 코드에서 적절한 선택입니다.


72-94: 플랫폼별 색상 초기화 로직이 올바름

각 플랫폼에 맞는 색상 초기화 로직이 정확하게 구현되어 있으며, SwiftUI 지원도 적절히 추가되었습니다.


96-126: RunLogImages 구조체가 효율적으로 구현됨

이미지 관리 구조체가 색상과 일관된 패턴으로 구현되어 있으며, 모든 플랫폼에 대한 적절한 처리가 포함되어 있습니다.


128-146: SwiftUI 이미지 확장이 다양한 사용 사례를 지원함

SwiftUI.Image에 대한 확장이 기본 이미지, 레이블이 있는 이미지, 장식용 이미지 등 다양한 사용 사례를 지원하여 접근성을 고려한 구현입니다.


75-75: Bundle.module 정의 확인 완료

RunLog/Derived/Sources/TuistBundle+RunLog.swift에 다음과 같이 extension Foundation.Bundle으로 static let module이 정의되어 있어, Bundle.module 호출이 정상 동작합니다.

  • 파일: RunLog/Derived/Sources/TuistBundle+RunLog.swift
    라인 15: static let module = Bundle(for: BundleFinder.self)

추가 조치가 필요 없습니다.

selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
disableMainThreadChecker = "YES">
Copy link

@coderabbitai coderabbitai bot Jul 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

메인 스레드 체커 비활성화 재검토

메인 스레드 체커를 비활성화하는 것은 중요한 런타임 디버깅 기능을 제거합니다. 이 설정이 Tuist 적용을 위해 반드시 필요한지 재검토해보세요.

메인 스레드 체커를 다시 활성화하는 것을 고려해보세요:

-      disableMainThreadChecker = "YES">
+      disableMainThreadChecker = "NO">
📝 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.

Suggested change
disableMainThreadChecker = "YES">
disableMainThreadChecker = "NO">
🤖 Prompt for AI Agents
In RunLog/RunLog.xcodeproj/xcshareddata/xcschemes/RunLog.xcscheme at line 30,
the main thread checker is disabled with disableMainThreadChecker set to "YES".
Review whether disabling this debugging feature is necessary for Tuist
integration. If not essential, change disableMainThreadChecker to "NO" to
re-enable the main thread checker for better runtime debugging.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

skip

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Monfi98 알겠습니다. 메인 스레드 체커 비활성화 관련 제안을 건너뛰겠습니다.

@@ -0,0 +1,23 @@
// swift-tools-version: 6.0
Copy link

@coderabbitai coderabbitai bot Jul 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

swift-tools-version: 6.0 지정은 현재 안정 버전에 부적합

Swift 6.0은 아직 정식 릴리스되지 않았습니다. Xcode 15.x 기준 최대 지원 버전(예: 5.9)으로 수정하지 않으면 swift package와 Tuist 생성 단계에서 오류가 발생합니다.

-// swift-tools-version: 6.0
+// swift-tools-version: 5.9
📝 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.

Suggested change
// swift-tools-version: 6.0
// swift-tools-version: 5.9
🤖 Prompt for AI Agents
In RunLog/Tuist/Package.swift at line 1, the swift-tools-version is set to 6.0,
which is not yet officially released and causes errors during swift package and
Tuist generation. Change the swift-tools-version to the latest stable version
supported by Xcode 15.x, such as 5.9, to fix the compatibility issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

skip

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Monfi98 Understood! I'll skip this suggestion. You can proceed with Swift 6.0 as the tools version.

Comment on lines +11 to +16
bundleId: "com.ESTSOFTiOSTEAM1.IEEE.RunLog",
deploymentTargets: .iOS("17.0"),
infoPlist: .file(path: "RunLog/InfoPlists/RunLog-info.plist"),
sources: ["RunLog/Sources/**"],
resources: ["RunLog/Resources/**"],
dependencies: [
Copy link

@coderabbitai coderabbitai bot Jul 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Info.plist 경로 불일치로 빌드 실패 위험

infoPlist: .file(path: "RunLog/InfoPlists/RunLog-info.plist") 경로가 실제로 커밋된 RunLog/RunLog/InfoPlists/RunLog-Info.plist 와(과) 폴더/대소문자 모두 달라 Xcode & Tuist가 파일을 찾지 못합니다.

-      infoPlist: .file(path: "RunLog/InfoPlists/RunLog-info.plist"),
+      infoPlist: .file(path: "RunLog/RunLog/InfoPlists/RunLog-Info.plist"),

동일 이슈가 테스트 타깃에도 있습니다(아래 diff 참고).

-      infoPlist: .file(path: "RpTest/InfoPlists/RpTest-info.plist"),
+      infoPlist: .file(path: "RunLog/RpTest/InfoPlists/RpTest-Info.plist"),

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In RunLog/Project.swift around lines 11 to 16, the infoPlist file path is
incorrect and causes build failures because it does not match the actual
committed path and casing. Update the infoPlist path from
"RunLog/InfoPlists/RunLog-info.plist" to the correct
"RunLog/RunLog/InfoPlists/RunLog-Info.plist" to match the real file location and
casing. Also, apply the same fix to the test target's infoPlist path if it has
the same issue.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

루트는 여기가 맞아.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧩 Analysis chain

@Monfi98 파일 구조를 확인해보겠습니다.


🏁 Script executed:

#!/bin/bash
# Project.swift 파일 위치 확인
echo "=== Project.swift 파일 위치 ==="
find . -name "Project.swift" -type f

echo -e "\n=== 실제 Info.plist 파일들 위치 ==="
find . -name "*Info.plist" -type f -o -name "*info.plist" -type f

echo -e "\n=== RunLog 프로젝트 구조 ==="
ls -la RunLog/

echo -e "\n=== InfoPlists 디렉토리 구조 ==="
find . -type d -name "*InfoPlists*"
find . -type d -name "*Infoplists*"

echo -e "\n=== RunLog/InfoPlists 경로 확인 ==="
if [ -d "RunLog/InfoPlists" ]; then
    echo "RunLog/InfoPlists 디렉토리 존재"
    ls -la RunLog/InfoPlists/
else
    echo "RunLog/InfoPlists 디렉토리 없음"
fi

echo -e "\n=== RpTest/InfoPlists 경로 확인 ==="
if [ -d "RpTest/InfoPlists" ]; then
    echo "RpTest/InfoPlists 디렉토리 존재"
    ls -la RpTest/InfoPlists/
else
    echo "RpTest/InfoPlists 디렉토리 없음"
fi

Length of output: 1463


@Monfi98 맞습니다! 루트 경로 구조는 정확합니다.

파일 구조 확인 결과:

  • Project.swiftRunLog/ 디렉토리에 위치
  • 상대 경로 "RunLog/InfoPlists/RunLog-info.plist"는 올바르게 RunLog/RunLog/InfoPlists/를 참조

다만 대소문자 차이만 있습니다:

  • 참조: RunLog-info.plist (소문자 i)
  • 실제 파일: RunLog-Info.plist (대문자 I)

동일한 이슈가 테스트 타깃에도 있습니다:

  • 참조: RpTest-info.plist
  • 실제 파일: RpTest-Info.plist

경로 구조에 대한 지적은 잘못되었습니다. 대소문자만 수정하면 됩니다.


✏️ Learnings added
Learnt from: Monfi98
PR: ESTSOFT-iOS-01/RunLog#134
File: RunLog/Project.swift:11-16
Timestamp: 2025-07-16T08:01:39.547Z
Learning: RunLog 프로젝트에서 Project.swift 파일은 RunLog/ 디렉토리 안에 위치하며, 상대 경로 참조 시 "RunLog/InfoPlists/..."는 "RunLog/RunLog/InfoPlists/..."를 의미하는 올바른 구조입니다.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Comment on lines +25 to +29
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

NSAllowsArbitraryLoads 전역 허용은 보안·앱스토어 심사 리스크

모든 도메인에 대해 ATS 예외를 주면 HTTPS 강제 정책이 무력화됩니다.
가능한 도메인 화이트리스트 방식(NSExceptionDomains)으로 축소하거나 개발 / 배포 빌드에 따라 조건부 플래그를 권장드립니다.

🤖 Prompt for AI Agents
In RunLog/RunLog/InfoPlists/RunLog-Info.plist around lines 25 to 29, the current
use of NSAllowsArbitraryLoads set to true globally disables ATS security for all
domains, which poses security and App Store review risks. Replace this global
allowance with a domain-specific whitelist using NSExceptionDomains to specify
only trusted domains. Additionally, implement conditional flags to enable this
exception only for development builds while enforcing stricter ATS policies for
production builds.

Comment on lines +63 to +66
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Background Location 사용 시 위치 권한 설명 키 누락

UIBackgroundModeslocation을 선언했지만 NSLocationWhenInUseUsageDescription / NSLocationAlwaysAndWhenInUseUsageDescription 등이 없습니다. 앱 실행 직후 크래시나 App Store 거절 사유가 되니 반드시 추가해주세요.

🤖 Prompt for AI Agents
In RunLog/RunLog/InfoPlists/RunLog-Info.plist around lines 63 to 66, the plist
declares UIBackgroundModes with location but is missing the required location
permission description keys such as NSLocationWhenInUseUsageDescription and
NSLocationAlwaysAndWhenInUseUsageDescription. Add these keys with appropriate
user-facing description strings explaining why the app needs location access to
prevent crashes on launch and App Store rejection.

Comment on lines 63 to 69
public func font(size: CGFloat) -> Font {
guard let font = Font(font: self, size: size) else {
fatalError("Unable to initialize font '\(name)' (\(family))")
}
return font
}

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

fatalError 남용으로 런타임 크래시 가능성

폰트 로딩 실패 시 곧바로 fatalError 로 앱이 종료됩니다.
프로덕션 빌드에서는 기본 시스템 폰트 fallback 후 오류 로깅 정도로 처리하는 편이 안전합니다.

-    guard let font = Font(font: self, size: size) else {
-      fatalError("Unable to initialize font '\(name)' (\(family))")
-    }
+    guard let font = Font(font: self, size: size) else {
+      assertionFailure("Font '\(name)' (\(family)) not found – falling back to system font")
+      return Font.systemFont(ofSize: size)
+    }
📝 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.

Suggested change
public func font(size: CGFloat) -> Font {
guard let font = Font(font: self, size: size) else {
fatalError("Unable to initialize font '\(name)' (\(family))")
}
return font
}
public func font(size: CGFloat) -> Font {
guard let font = Font(font: self, size: size) else {
assertionFailure("Font '\(name)' (\(family)) not found – falling back to system font")
return Font.systemFont(ofSize: size)
}
return font
}
🤖 Prompt for AI Agents
In RunLog/Derived/Sources/TuistFonts+RunLog.swift around lines 63 to 69, the
font(size:) function uses fatalError when font initialization fails, causing a
runtime crash. Replace fatalError with a safer fallback by returning a default
system font and log the error instead, ensuring the app continues running
without crashing in production.

Copy link
Contributor

@GeunwoongSim GeunwoongSim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구웃 빌드 확인했습니다!

Copy link
Member

@doyeonk429 doyeonk429 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다!!

@Monfi98 Monfi98 merged commit 6e9f78a into develop Jul 16, 2025
1 check passed
@Monfi98 Monfi98 deleted the feature/#133 branch July 16, 2025 13:51
@github-project-automation github-project-automation bot moved this from In review to Done in RunLog Jul 16, 2025
@coderabbitai coderabbitai bot mentioned this pull request Jul 23, 2025
13 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[feature] Tuist 적용

4 participants