From 9dd43ca405e2a688498bb1cf0a6605886d233bd4 Mon Sep 17 00:00:00 2001 From: Sn-Kinos Date: Thu, 1 Oct 2026 01:05:35 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=8C=EB=93=9C=20=EC=95=88=EB=82=B4=20?= =?UTF-8?q?=C2=B7=20=EC=A3=BC=EC=84=9D=EC=9D=84=20=EC=9D=B4=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EC=86=8C=20=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 빌드 안내(BUILD.md)의 JDK 경로를 설치 위치와 무관한 지정 방식으로 변경 - 5탭 계약 파일 탐색 순서를 이 저장소 구조(app/design → 루트 design)로 정리 - README · 보안 규칙 · 소스 주석에서 이 저장소에 없는 문서 경로를 문서 이름으로 바꾸거나 삭제 - Flutter 버전 고정 파일(app/.fvmrc, 3.47.2) 추가, README 필수 환경을 같은 버전으로 갱신 - 동작 변경 없음 --- app/.fvmrc | 3 ++ app/BUILD.md | 33 ++++++----------- app/README.md | 24 ++++--------- app/analysis_options.yaml | 3 ++ app/design/craft-allowlist.yaml | 8 ++--- app/firebase/firestore.rules | 36 +++++++++---------- app/firebase/functions/src/account/account.ts | 4 +-- app/lib/core/router/app_router.dart | 3 +- app/lib/features/auth/auth.dart | 2 +- app/lib/features/auth/social_providers.dart | 2 +- app/test/app_smoke_test.dart | 7 ++-- app/tool/gen_tokens.py | 2 +- design/craft-allowlist.yaml | 1 - design/design-tokens.md | 4 +-- 14 files changed, 54 insertions(+), 78 deletions(-) create mode 100644 app/.fvmrc diff --git a/app/.fvmrc b/app/.fvmrc new file mode 100644 index 0000000..16a96ef --- /dev/null +++ b/app/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.47.2" +} diff --git a/app/BUILD.md b/app/BUILD.md index a24db2f..f9c530a 100644 --- a/app/BUILD.md +++ b/app/BUILD.md @@ -6,7 +6,7 @@ Gradle 이 조용히 실패하지 않고 명확히 죽으므로 아래를 그대 | 구성 | 값 | 비고 | |---|---|---| | Flutter | **3.47.2** | `fvm` 으로 고정 — `app/.fvmrc` | -| JDK | **Temurin 17** | `~/.jdks/jdk-17.0.20.1+1/Contents/Home` | +| JDK | **Temurin 17** | `fvm flutter config --jdk-dir` 로 지정 | | Gradle | 8.14 | `android/gradle/wrapper/gradle-wrapper.properties` | | AGP | 8.11.1 | `android/settings.gradle.kts` | | Android SDK | `/opt/homebrew/share/android-commandlinetools` | `brew install --cask android-commandlinetools` | @@ -21,40 +21,29 @@ Android Studio 번들 JBR 은 **JDK 25** 이고 **Gradle 8.14 와 비호환**이 JDK 17 을 쓰는 쪽을 택했다. ```bash -fvm flutter config --jdk-dir ~/.jdks/jdk-17.0.20.1+1/Contents/Home +fvm flutter config --jdk-dir ``` `brew install --cask temurin@17` 은 sudo 를 요구한다. sudo 없이 쓰려면 Adoptium -tar.gz 를 `~/.jdks/` 에 풀면 된다. +tar.gz 를 사용자 폴더에 풀고 그 경로를 지정하면 된다. ## 테스트 ```bash export ANDROID_HOME=/opt/homebrew/share/android-commandlinetools fvm flutter analyze -FANUZU_DESIGN_DIR=/path/to/p-fancake/design fvm flutter test +fvm flutter test ``` -`FANUZU_DESIGN_DIR` 은 5탭 계약 대조용이다. 스모크 테스트가 -`craft-allowlist.yaml` 의 `APP_TABS` 를 직접 읽어 앱의 `appTabs` 와 정확 일치를 검증한다. -**정본은 상위 저장소 `p-fancake/design/craft-allowlist.yaml`** 이고 이 저장소는 분리돼 -있으므로, 같은 파일의 사본을 `design/craft-allowlist.yaml` 로 두었다. 탐색 순서는 아래와 같다. +스모크 테스트가 `craft-allowlist.yaml` 의 `APP_TABS` 를 직접 읽어 앱의 `appTabs` 와 정확 일치를 +검증한다(5탭 계약 대조). 파일은 아래 순서로 찾는다. -1. `$FANUZU_DESIGN_DIR/craft-allowlist.yaml` — 정본을 직접 가리킬 때 쓴다. -2. `design/craft-allowlist.yaml` — 이 저장소의 사본. -3. `../design/craft-allowlist.yaml` · `../p-fancake/design/craft-allowlist.yaml` — p-fancake 와 - 형제로 둔 체크아웃. +1. `$FANUZU_DESIGN_DIR/craft-allowlist.yaml` — 다른 위치의 파일을 가리킬 때 쓴다. +2. `app/design/craft-allowlist.yaml` — 앱 폴더 안의 사본. +3. 저장소 루트 `design/craft-allowlist.yaml`. -사본이 있으므로 **git worktree 에서도 변수 없이 통과한다.** 그래도 못 찾으면 통과가 아니라 -실패한다 — 계약 대조가 조용히 사라지면 안 된다. - -사본은 정본과 갈리면 저장소마다 다른 답을 내므로, **정본을 고칠 때 사본에도 함께 복사한다.** -파일 머리에 같은 문장을 적어 두었다. - -```bash -cp /path/to/p-fancake/design/craft-allowlist.yaml design/craft-allowlist.yaml -# 머리 주석 5줄은 사본에만 있으니 지우지 말고 APP_TABS·CAPS_OK 만 맞춘다. -``` +하나도 못 찾으면 통과가 아니라 실패한다 — 계약 대조가 조용히 사라지면 안 된다. +루트 파일을 고칠 때는 `app/design/` 사본도 함께 맞춘다. ## 빌드 diff --git a/app/README.md b/app/README.md index f648654..7e736a8 100644 --- a/app/README.md +++ b/app/README.md @@ -16,7 +16,7 @@ ## 2. 빌드·실행 -전제: Flutter stable 3.41.7 / Dart 3.11.5 (검증에 쓴 버전), Android SDK 36, Xcode 26.6 +전제: Flutter stable 3.47.2 / Dart 3.13.2 (`app/.fvmrc` 로 고정), Android SDK 36, Xcode 26.6 ```bash cd app @@ -30,7 +30,7 @@ flutter build apk --debug # Android 디버그 APK 빌드 산출물은 `build/app/outputs/flutter-apk/app-debug.apk` 에 떨어진다. > ⚠️ **`pubspec.yaml` 의 의존성을 추가·변경·업그레이드하면 최소 지원 OS 하한을 재계산할 것.** -> 절차: `주간보고/2주차/src/2주차_플러그인_선검증리포트.md` §3.5 +> 절차: 2주차 플러그인 선검증 리포트 §3.5 > > 최소 지원 OS 는 **별첨1 v1.0 에 계약값으로 박힌다**(견적서 1228행). 지킬 수 없는 하한을 > 계약에 적으면 그 아래 단말의 장애가 개발사 책임이 된다. 선검증 리포트의 값은 @@ -42,7 +42,7 @@ flutter build apk --debug # Android 디버그 APK ## 3. 디자인 토큰 — 손으로 옮기지 않는다 -`lib/core/theme/tokens.dart` 는 **생성물**이다. 직접 고치면 시안(`시안/assets/ds.css`)과 어긋난다. +`lib/core/theme/tokens.dart` 는 **생성물**이다. 직접 고치면 토큰 문서(`design/design-tokens.md`)와 어긋난다. ```bash cd app @@ -79,7 +79,7 @@ Firebase 설정이 없으면 실 소셜 로그인이 물리적으로 불가능 * `FirebaseBoot.reason` 은 사용자에게 보이는 문자열이라 **내부 파일 경로를 넣지 않는다.** 경로와 원시 예외는 `FirebaseBoot.detail` 로 분리해 로그에만 남긴다. -**가드가 두 겹인 이유 (교차검증 A-01 반영)** +**가드가 두 겹인 이유** ```dart bool get isMockSessionAvailable => !FirebaseBoot.isLive && !_releaseMode; @@ -191,7 +191,7 @@ Firebase가 live가 되면 보존된 `currentUser`를 앱 시작 시 복원하 **이메일 가입은 구현하지 않았다.** CD-18 미확정(Q2)이라 `SocialAuthProvider` 인터페이스에 구현체 하나가 더 붙을 자리만 비워 뒀다. **기능 플래그 상수는 두지 않았다** — 읽는 분기가 없는 플래그는 "false 라서 닫혀 있다" 는 착각만 만들고, 누가 true 로 바꿔도 아무 일이 일어나지 않는다 -(교차검증 A-02). 지금 이메일을 닫고 있는 것은 `AuthRepository._defaultProviders()` 에 +. 지금 이메일을 닫고 있는 것은 `AuthRepository._defaultProviders()` 에 구현체가 없다는 사실 하나다. ## 7. 계약 고정 표기 — 5탭 @@ -204,9 +204,8 @@ HOME · INSIDE · GALAXY · STATION · MY | 근거 | 위치 | |---|---| -| 견적서 v2.1 「5탭 네비게이션」 | `Docs/Fancake_팬덤플랫폼_견적서.html` | +| 견적서 v2.1 「5탭 네비게이션」 | 견적서 v2.1 | | 크래프트 게이트 C15 | `design/craft-allowlist.yaml` → `APP_TABS` | -| 시안 하단 탭바 | `시안/screens/S-{H-HOME,I-LOUNGE,G-PLANET,S-HUB,M-HOME}.html` 의 `