Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 25 additions & 5 deletions .codex/skills/souzip-commit/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,34 @@ Use this skill only when the user explicitly asks to commit.
- `docs/harness/workflow/operating-sequence.md`
- `docs/harness/templates/plan/plan-template.md`

## Never Commit (로컬 전용)

아래 파일은 worktree에 있어도 **stage·commit 금지**입니다. `git add -A` / `git add .` 사용하지 말고, 경로를 지정해 stage 하세요.

| 경로 | 이유 |
|------|------|
| `docs/lint-format-changelog.html` | lint/format 변경 설명용 로컬 HTML |
| `docs/goals/**` | Goal·Story·Plan 실행 문서 (로컬 보관) |
| `Config/*.xcconfig` | 시크릿 (`docs/harness/constitution.md`) |
| `tuist generate` 산출물 | `*.xcodeproj`, `*.xcworkspace`, `Derived/` |

제외 목록에 걸린 파일이 이미 staged 되어 있으면 커밋 전에 반드시 unstage 합니다.

```bash
git restore --staged <path>
```

## Workflow

1. Confirm the user explicitly said "커밋해" or an equivalent direct commit instruction.
2. Inspect changed files.
3. Separate unrelated changes from the Story/Plan scope.
4. Check the latest verification result.
5. If verification is missing, report that before committing.
6. Draft a commit message using the existing Souzip convention.
7. Stage and commit only the intended files.
3. **Apply [Never Commit](#never-commit-로컬-전용)** — 제외 대상은 stage하지 않고, staged 되어 있으면 unstage.
4. Separate unrelated changes from the Story/Plan scope.
5. Check the latest verification result.
6. If verification is missing, report that before committing.
7. Draft a commit message using the existing Souzip convention.
8. Stage intended files only (`git add <path>…`). `git add -A` / `git add .` 금지.
9. Commit.

## Commit Convention

Expand Down Expand Up @@ -53,6 +72,7 @@ Types:
## Boundaries

- Do not commit without explicit user instruction.
- Do not stage or commit [Never Commit](#never-commit-로컬-전용) paths — even if the user or a prior step created them.
- Do not include unrelated user changes.
- Do not push.
- Do not create a PR.
Expand Down
70 changes: 70 additions & 0 deletions .github/workflows/verify.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Verify

on:
pull_request:
branches:
- develop
push:
branches:
- develop

concurrency:
group: verify-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
lint:
name: Lint
runs-on: macos-15
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup mise
uses: jdx/mise-action@v2

- name: Trust and install tools
run: |
mise trust
mise install

- name: SwiftFormat lint
run: swiftformat . --config .swiftformat --lint

- name: SwiftLint (strict)
run: docs/harness/scripts/swiftlint-strict.sh

build:
name: Build
needs: lint
runs-on: macos-15
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup mise
uses: jdx/mise-action@v2

- name: Trust and install tools
run: |
mise trust
mise install

- name: Prepare CI config
env:
DEBUG_XCCONFIG: ${{ secrets.SOUZIP_DEBUG_XCCONFIG }}
RELEASE_XCCONFIG: ${{ secrets.SOUZIP_RELEASE_XCCONFIG }}
GOOGLE_SERVICE_DEBUG: ${{ secrets.SOUZIP_GOOGLE_SERVICE_DEBUG }}
GOOGLE_SERVICE_RELEASE: ${{ secrets.SOUZIP_GOOGLE_SERVICE_RELEASE }}
run: docs/harness/scripts/prepare-ci-config.sh

- name: Tuist install and generate
run: |
tuist install
tuist generate

- name: Tuist build
run: tuist build "수집-Debug"

- name: Tuist test
run: tuist test --skip-ui-tests --no-upload
6 changes: 2 additions & 4 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ disabled_rules:
- trailing_whitespace
- todo
- multiple_closures_with_trailing_closure
- trailing_comma
- file_length

# ===== Opt-in 규칙 =====
opt_in_rules:
Expand Down Expand Up @@ -38,10 +40,6 @@ type_body_length:
warning: 300
error: 450

file_length:
warning: 500
error: 700

cyclomatic_complexity:
warning: 15
error: 20
Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
**Tuist**로 관리되는 iOS 프로젝트입니다. Swift 5.9, iOS 16.0+ 배포 타겟.

```bash
mise trust # 최초 1회 (worktree/클론 경로마다 필요)
mise install # swiftformat, swiftlint, tuist 설치
tuist install # 외부 의존성 다운로드
tuist generate # xcworkspace, xcodeproj 파일 생성
swiftformat . # 코드 포맷
Expand Down
8 changes: 4 additions & 4 deletions Projects/Core/Analytics/Sources/AnalyticsEvent.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,15 @@ public enum AnalyticsEvent {

public var eventType: String {
switch self {
case let .app(e): e.eventType
case let .upload(e): e.eventType
case let .app(event): event.eventType
case let .upload(event): event.eventType
}
}

public var properties: [String: Any]? {
switch self {
case let .app(e): e.properties
case let .upload(e): e.properties
case let .app(event): event.properties
case let .upload(event): event.properties
}
}
}
6 changes: 3 additions & 3 deletions Projects/Data/Sources/Souvenir/DTO/SouvenirDTOMapper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ public enum SouvenirDTOMapper {
// MARK: - Detail Response to Domain

public static func toDomain(_ dto: SouvenirDetailResponse) -> SouvenirDetail {
var localPrice: Int? = nil
var currencySymbol: String? = nil
var krwPrice: Int? = nil
var localPrice: Int?
var currencySymbol: String?
var krwPrice: Int?

if let price = dto.price {
let original = price.original
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ final class LoginViewModel: BaseViewModel<
case let .tapLogin(provider):
Task {
emit(.loading(true))
await Login(provider)
await performLogin(provider)
emit(.loading(false))
}

case .tapGuest:
Task { await Login(nil) }
Task { await performLogin(nil) }
}
Comment thread
gnoes-ios marked this conversation as resolved.
}

Expand All @@ -52,7 +52,7 @@ final class LoginViewModel: BaseViewModel<
mutate { $0.recentAuthProvider = provider }
}

private func Login(_ provider: AuthProvider?) async {
private func performLogin(_ provider: AuthProvider?) async {
do {
let result = try await login.execute(provider: provider)
switch result {
Expand Down
Loading
Loading