docs: CLAUDE.md 작업 프로토콜 추가 및 수정 계획 작성

- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가
- CLAUDE.md: 존재하지 않는 디렉토리 3개 제거
- analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의)
- .claude/agents/: dev 리뷰 에이전트 9개 복사
- .claude/skills/: 프로젝트 스킬 4개 복사
This commit is contained in:
JiWoong Sul
2026-03-27 16:52:52 +09:00
parent 6f5b3ba8f4
commit 916a50992c
17 changed files with 1672 additions and 3 deletions

View File

@@ -0,0 +1,175 @@
# asciineverdie Supply Chain Review
> 검토일: 2026-03-27
> Flutter 3.35.3 / Dart 3.9.2
> Claude-Gemini Cross-Debate 완료 (합의 도달)
## Supply Chain Score: 6 / 10
| 항목 | 점수 | 비고 |
|------|------|------|
| 보안 (CVE) | 8/10 | 알려진 CVE 없음 |
| 라이선스 | 6/10 | GPL 오염 없음, 폰트 라이선스 파일 누락 |
| 유지보수 건강도 | 5/10 | google_mobile_ads 2 메이저 뒤처짐, build_runner 전이 의존성 중단 |
| 최신성 | 4/10 | 직접 의존성 7개 중 5개 메이저 버전 뒤처짐 |
| 의존성 비대화 | 7/10 | 직접 11개, 프로덕션 전이 포함 ~62개 (합리적 수준) |
---
## 1. 취약점 (Vulnerabilities)
| 패키지 | 버전 | CVE | 심각도 | 수정 버전 |
|--------|------|-----|--------|-----------|
| (해당 없음) | - | - | - | - |
**결론:** OSV(Open Source Vulnerabilities) 데이터베이스 및 GitHub Advisory Database 기준, 현재 사용 중인 의존성 버전에서 알려진 CVE는 발견되지 않음.
다만 `google_mobile_ads` 5.x는 최신 iOS Privacy Manifest 및 UMP(User Messaging Platform) 요구사항을 완벽히 지원하지 않을 가능성이 있어, App Store 심사 거절 리스크 존재.
---
## 2. 라이선스 이슈
| 패키지/자산 | 라이선스 | 리스크 | 필요 조치 |
|------------|---------|--------|-----------|
| 모든 Dart 패키지 | BSD-3 / MIT / Apache-2.0 | 없음 | GPL 오염 없음 -- 상업적 사용 안전 |
| JetBrainsMono (폰트) | OFL-1.1 (추정) | 중간 | 라이선스 파일 미포함. `assets/fonts/`에 OFL.txt 추가 필요 |
| PressStart2P (폰트) | OFL-1.1 (추정) | 중간 | 라이선스 파일 미포함. `assets/fonts/`에 OFL.txt 추가 필요 |
**폰트 라이선스 상세:**
- JetBrains Mono: JetBrains 배포, Apache 2.0 라이선스
- Press Start 2P: Google Fonts 배포, OFL 라이선스
- 두 폰트 모두 상업적 사용 가능하나, 라이선스 텍스트를 앱에 포함해야 하는 의무(attribution) 존재
- 현재 `assets/fonts/` 디렉토리에 LICENSE 파일이 **전혀 없음**
- App Store / Play Store 심사에서는 보통 문제되지 않으나, 법적 리스크는 존재
---
## 3. 유지보수 건강도
| 패키지 | 현재 버전 | 상태 | 리스크 |
|--------|----------|------|--------|
| cupertino_icons | 1.0.8 | 정상 유지보수 | 낮음 (단, 미사용) |
| intl | 0.20.2 | Dart 팀 관리 | 없음 |
| path_provider | 2.1.5 | Flutter 팀 관리 | 없음 |
| shared_preferences | 2.5.3 | Flutter 팀 관리 | 없음 |
| just_audio | 0.9.46 | 활발한 커뮤니티 (ryanheise) | 단일 메인테이너 리스크 |
| freezed_annotation | 2.4.4 | 활발한 커뮤니티 (rrousselGit) | 단일 메인테이너 리스크 |
| json_annotation | 4.9.0 | Google/Dart 팀 관리 | 없음 |
| google_mobile_ads | 5.3.1 | Google 관리 | **v5.x 지원 종료 임박** |
| in_app_purchase | 3.2.3 | Flutter 팀 관리 | 없음 |
| package_info_plus | 8.3.1 | FlutterCommunity 관리 | 낮음 |
| build_runner | 2.5.4 | Google/Dart 팀 관리 | **전이 의존성 중단됨** |
**중단된 전이 의존성 (Discontinued transitive deps):**
- `build_resolvers` 2.5.4 -- 공식 중단 선언
- `build_runner_core` 9.1.2 -- 공식 중단 선언
- 이 패키지들의 기능은 최신 `build_runner`(2.10+)에 내재화됨
- 즉각적인 빌드 실패를 일으키진 않으나, 향후 Dart SDK 업데이트 시 호환성 문제 발생 확실
---
## 4. 메이저 버전 뒤처짐 (Outdated - Major Behind)
### 직접 의존성 (Direct)
| 패키지 | 현재 | 최신 | 뒤처짐 | 비고 |
|--------|------|------|--------|------|
| google_mobile_ads | 5.3.1 | 7.0.0 | **2 메이저** | iOS Privacy Manifest, UMP 지원 필수 |
| freezed_annotation | 2.4.4 | 3.1.0 | 1 메이저 | freezed 3.x와 짝 맞춰야 함 |
| package_info_plus | 8.3.1 | 9.0.0 | 1 메이저 | |
| just_audio | 0.9.46 | 0.10.5 | 1 마이너 (pre-1.0) | 0.x 시맨틱에서는 마이너 = 메이저 |
| json_annotation | 4.9.0 | 4.11.0 | 2 마이너 | |
### 개발 의존성 (Dev)
| 패키지 | 현재 | 최신 | 뒤처짐 | 비고 |
|--------|------|------|--------|------|
| build_runner | 2.5.4 | 2.13.1 | 8 마이너 | 중단된 전이 의존성 해소 위해 업데이트 필요 |
| freezed | 2.5.8 | 3.2.5 | **1 메이저** | freezed_annotation 3.x와 함께 업데이트 |
| json_serializable | 6.9.5 | 6.13.1 | 4 마이너 | |
| flutter_lints | 5.0.0 | 6.0.0 | 1 메이저 | |
---
## 5. 불필요한 의존성
| 패키지 | 사용 여부 | 판정 | 근거 |
|--------|----------|------|------|
| cupertino_icons | 미사용 | **제거 권장** | `lib/` 전체에서 `CupertinoIcons` import 0건. ~280KB 바이너리 낭비 |
| json_annotation | 간접 사용 | 유지 | freezed_annotation이 re-export하지만, .g.dart 생성 파일이 직접 import함. 제거 시 빌드 깨질 수 있음 |
---
## 6. 의존성 트리 통계
| 항목 | 수치 |
|------|------|
| 직접 프로덕션 의존성 | 11개 (SDK 포함) |
| 직접 개발 의존성 | 6개 (SDK 포함) |
| 프로덕션 전이 포함 총 패키지 | ~62개 |
| 개발 포함 총 패키지 (pubspec.lock) | 122개 |
| 코드 생성 대상 파일 (.freezed.dart + .g.dart) | 8개 |
---
## 권장 조치 사항
### [CRITICAL] 즉시 조치
1. **폰트 라이선스 파일 추가**
- `assets/fonts/JetBrainsMono-LICENSE.txt` (Apache 2.0)
- `assets/fonts/PressStart2P-OFL.txt` (OFL 1.1)
- 앱 내 오픈소스 라이선스 화면에 표시 필요
- Google Fonts 및 JetBrains 공식 사이트에서 다운로드
2. **google_mobile_ads 7.x 업데이트 계획 수립**
- iOS Privacy Manifest 대응 필수 (App Store 심사 거절 리스크)
- v7.0.0 마이그레이션 가이드: https://developers.google.com/admob/flutter/migration
### [HIGH] 단기 조치 (1-2주)
3. **cupertino_icons 제거**
```yaml
# pubspec.yaml에서 삭제
# cupertino_icons: ^1.0.8
```
4. **build_runner 체인 업데이트**
```bash
flutter pub upgrade build_runner json_serializable
```
- 중단된 `build_resolvers`, `build_runner_core` 전이 의존성 해소
- 빌드 성능 개선 기대
5. **freezed 2.x -> 3.x 마이그레이션**
- freezed_annotation + freezed 동시에 메이저 업데이트
- 코드 생성 파일 전체 재생성 필요: `dart run build_runner build --delete-conflicting-outputs`
### [MEDIUM] 중기 조치 (1개월)
6. **just_audio 0.10.x 업데이트**
- Android 최신 버전 호환성 개선
- 단일 메인테이너(ryanheise) 패키지이므로 대안(audioplayers) 검토도 병행
7. **package_info_plus 9.x 업데이트**
8. **flutter_lints 6.x 업데이트**
- 최신 lint 규칙 적용으로 코드 품질 향상
### [LOW] 장기 고려
9. **win32 전이 의존성** -- package_info_plus가 Windows 지원에 사용. 모바일 전용이면 무시 가능
---
## Claude-Gemini Cross-Debate 결과
| 항목 | Claude 의견 | Gemini 초기 의견 | 합의 |
|------|------------|-----------------|------|
| 종합 점수 | 6/10 | 3.5/10 | **6/10** (Gemini 수정 동의) |
| CVE-2023-48220 | 해당 없음 (Nextcloud 취약점) | package_info_plus 관련 주장 | **해당 없음** (Gemini 철회) |
| json_annotation 제거 | 위험 (빌드 깨짐 가능) | 제거 권장 | **유지** (Gemini 수정 동의) |
| build_runner 긴급도 | 중기 과제 (당장은 동작) | 즉시 수술 필요 | **단기 과제** (절충) |
| 보안 리스크 수준 | Low | Medium-High | **Low** (Gemini 수정 동의) |
| 폰트 라이선스 | 중간 리스크 | 중간 리스크 | **합의** |