Flutter 기반 중고거래 플랫폼. iOS/Android 전용 (웹 불필요).
- 텍스트 스타일:
CustomTextStyles사용 (직접 TextStyle 금지) - 색상:
AppColors사용 (직접 Color 코드 금지) - 화면 이동:
context.navigateTo()사용 (MaterialPageRoute 금지) - 모달/다이얼로그:
CommonModal사용 (AlertDialog 직접 사용 금지) → 상세:.claude/instructions/code-style.md - Enum 분리: 모든 enum은
lib/enums/폴더에 개별 파일로 관리 - CLI: 모든 명령어 앞에
source ~/.zshrc &&필수 - Git: 사용자 허락 없이 절대 커밋 금지
-
API 중복 요청 방지: 버튼/액션에서 API를 호출할 때
Set<T> _pendingRequests패턴으로 진행 중인 요청 추적. 요청 시작 시 Set에 추가,finally에서 제거. 이미 Set에 있으면 early return. -
iPad/대형기기 대응 (필수): 디자인 기준은 iPhone (393x852)이지만, iPad에서도 정상 동작해야 함.
- 태블릿 여부 판별:
lib/utils/device_type.dart의isTablet전역 변수 사용.MediaQuery.of(context).size.width > 600을 직접 쓰지 말 것.main.dart시작 시initDeviceType(context)로 초기화되므로 앱 어디서든isTablet으로 참조 가능// ✅ 올바른 사용 import 'package:romrom_fe/utils/device_type.dart'; final height = isTablet ? 88.0 : 64.0; // ❌ 금지 final isTablet = MediaQuery.of(context).size.width > 600; // 매번 계산 금지
SizedBox(height: N.h)같은 고정 높이 컨테이너 안에 여러 위젯을 넣지 말 것 → overflow 발생. 대신IntrinsicHeight또는 고정 높이 제거- 이미지/정사각형 요소는
height: N.h대신height: N.w사용 (너비 기준이 더 안전) - 위치 권한 거부 등 실패 케이스에서 반드시 폴백 처리 (서울시청 좌표 등).
_currentPosition == null인 채로 로딩 화면 유지 금지 ScreenUtil설정:minTextAdapt: true,splitScreenMode: true유지 필수- 모달/다이얼로그는 고정 픽셀값 사용 (
.w.h금지). 모달은 화면 크기에 비례하면 iPad에서 너무 커짐.width: 312,height: 44같이 고정값 사용 - 고정 높이 + 내부 Column 조합 금지:
Container(height: N)안에Column을 넣으면 내부 콘텐츠가 고정 높이를 초과할 때 overflow 발생. 대신Column(mainAxisSize: MainAxisSize.min)으로 콘텐츠 크기에 맞게 자동 조절할 것 height: N.h+padding: vertical: N.h조합 절대 금지: iPad에서 height와 padding 모두 1.6배로 커지면, padding만으로 height를 초과해 내용이 잘리거나 overflow 발생. 해결:height제거 후const EdgeInsets.symmetric(vertical: 고정px)만 사용. 컨테이너가 콘텐츠 크기에 맞게 자동 조절됨// ❌ 금지 Container(height: 82.h, padding: EdgeInsets.symmetric(vertical: 16.h), child: ...) // ✅ 올바른 Container(padding: const EdgeInsets.symmetric(vertical: 16), child: ...)
- 시스템 UI 패딩 처리: 하단 네비게이션바 등 시스템 영역과 맞닿는 위젯은
height고정 대신MediaQuery.of(context).padding.bottom을SizedBox로 별도 처리. Android는padding.bottom=0이 일반적이므로 iOS/Android 분기 처리 필요
- 태블릿 여부 판별:
// ✅ 올바른 예시
final Set<NotificationType> _pendingMuteRequests = {};
Future<void> _onToggle(NotificationType type) async {
if (_pendingMuteRequests.contains(type)) return; // 중복 클릭 무시
setState(() => _pendingMuteRequests.add(type));
try {
await api.call();
setState(() { /* 상태 업데이트 */ });
} finally {
if (mounted) setState(() => _pendingMuteRequests.remove(type));
}
}| 작업 | 참조 파일 |
|---|---|
| 코드 스타일 & 예시 | .claude/instructions/code-style.md |
| 빌드, 린트, 포매팅 | .claude/instructions/build-lint.md |
| 프로젝트 구조 | .claude/instructions/project-structure.md |
| Git & 커밋 규칙 | .claude/instructions/git-rules.md |
| 코드 수정 후 자동 프로세스 | .claude/instructions/auto-process.md |
Git Hook 관리 도구로, 커밋/푸시할 때 자동으로 포맷 체크와 린트 분석을 실행합니다.
macOS:
brew install lefthookWindows:
# Scoop (권장)
scoop install lefthook
# 또는 Chocolatey
choco install lefthook
# 또는 npm
npm install -g lefthook프로젝트에서 활성화:
cd RomRom-FE
lefthook install| 시점 | 자동 실행 | 실패 시 |
|---|---|---|
| 커밋 시 | 포맷 체크 | 커밋 차단 |
| 푸시 시 | 린트 분석 | 푸시 차단 |
# 포맷 적용
bash tool/format.sh
# 포맷 체크만
bash tool/format_check.sh
# 린트 체크만
bash tool/lint_check.sh
# 전체 체크 (포맷 + 린트)
bash tool/full_check.shprompts/코드_스타일_가이드라인.md- 필수 참고lib/models/app_theme.dart- 텍스트 스타일 정의lib/models/app_colors.dart- 색상 상수 정의lib/widgets/common/common_modal.dart- 공통 모달 위젯
- Claude는 절대로, 어떤 상황에서도, 어떤 스킬/워크플로우를 따르더라도 사용자 명시적 허락 없이
git commit을 실행하지 않는다 git add도 사용자 확인 없이 절대 실행 금지- 코드 수정 후 반드시 사용자가 diff를 확인할 수 있도록 대기한다
- 커밋은 사용자가 명시적으로 "커밋해줘"라고 요청했을 때만 수행한다
- 스킬(skill)이 커밋을 지시하더라도 이 규칙이 우선한다
- 서브에이전트(subagent)에게도 커밋하지 말라고 명시적으로 지시한다
모든 코드 수정 작업 완료 후, Claude는 반드시 다음 순서로 실행합니다:
-
코드 포매팅
source ~/.zshrc && dart format --line-length=120 .
-
린트 분석
source ~/.zshrc && flutter analyze
-
에러 발생 시: 에러 수정 후 1-2번 재실행
- 위 단계를 모두 통과해야 작업 완료로 간주
flutter analyze에서 에러 발생 시 반드시 수정- 작업 완료 전 lefthook이 통과되는지 확인 필수