This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
WePLi is a social music iOS app where users recommend songs for themed playlists, vote on tracks, share music via community posts, and create music photo cards. Built with SwiftUI and TCA (The Composable Architecture).
# Initial setup (install dependencies and generate project)
tuist install
tuist generate
# Open project
open WePLi.xcworkspace
# Run tests
xcodebuild -workspace WePLi.xcworkspace -scheme WePLi -destination 'platform=iOS Simulator,name=iPhone 15' test
# Lint code
swiftlint --config .swiftlint.yml
swiftformat --lint . --config .swiftformat
# Run SwiftGen for asset code generation
swiftgen config run --config swiftgen.ymlbundle exec fastlane ios bootstrap # Initial dev environment setup
bundle exec fastlane ios build_debug # Debug build
bundle exec fastlane ios test # Run unit tests
bundle exec fastlane ios ci # Full CI pipeline (bootstrap + test + archive)Projects/App/- Main app target with SwiftUI views and TCA reducersProjects/Core/- Core modules (DesignSystem, Network, Utils - currently scaffolded)Tuist/- Tuist configuration and SPM dependenciesConfigs/- xcconfig files for Debug/Release builds
Use State, Action, and Reducer for all feature logic. Inject dependencies via @Dependency.
- TCA (ComposableArchitecture) - State management
- Moya - Networking
- Kingfisher - Image loading
- Supabase - Backend
- GoogleSignIn - Authentication
- KeychainAccess - Secure storage
- Line length: warning at 120, error at 140
- Use
Logger/OSLoginstead ofprint()(custom rule enforced) - Force unwrapping, force cast, force try are warnings
- Excluded:
Projects/**/Generated/**, test files
- 2-space indentation, max width 120
--self insertenabled- Wrap arguments/collections/parameters before-first
Copy Configs/Sample.xcconfig to Configs/Debug.xcconfig and Configs/Release.xcconfig, then fill in actual API keys (Supabase, Google Sign-In, etc.).
Refer to docs/git/ for detailed guidelines:
| Document | Description |
|---|---|
| micro-strategy.md | Micro branch & micro commit strategy |
| branch.md | Branch naming conventions (type/description) |
| commit.md | Commit message format ([Type]: message) |
| pull-request-template.md | PR template and guidelines |
| issue-labels.md | GitHub issue label system (TCA, modules, areas) |
| issue-template.md | Issue template format |
| release-workflow.md | Release process (develop → main → App Store) |
Commit Prefixes: [Feat], [Fix], [Design], [Refactor], [Docs], [Test], [Chore], [Add], [Del]
Branch Format: {type}/{description} (e.g., feat/playlist-voting-ui, fix/login-crash)
Branch Strategy: Git-flow with main (production), develop (integration). All feature branches start from develop.
- PR 및 커밋 메시지에
🤖 Generated with Claude Code문구를 포함하지 않음 - 커밋 메시지에
Co-Authored-By: Claude문구를 포함하지 않음
Refer to docs/dev/ for development guidelines:
| Document | Description |
|---|---|
| claude-commands-guide.md | TCA Feature development workflow |
| kentback-tdd-guide.md | TDD principles with Swift & TCA |
| versioning-guide.md | iOS app versioning (SemVer, build numbers) |
| development-checklist.md | Feature development checklist |
- Issue templates:
.github/ISSUE_TEMPLATE/(bug_report, feature_request, todo) - PR template:
.github/pull_request_template.md - Labels config:
.github/labels.yml
- Tuist 4.71.0
- Ruby 3.2.4
- Xcode 16.2+ (CI uses 16.2)
- iOS deployment target: 16.0