Flutter Init Skill
도메인 기반 Flutter 프로젝트를 생성하고 Feature-First 아키텍처로 자동 설정합니다.
Todo, Habit, Note, Expense 또는 Custom 도메인을 선택하여 오프라인 우선(Offline-first) CRUD 앱을 즉시 생성할 수 있습니다.
Tech Stack
| 영역 |
기술 |
비고 |
| State |
Riverpod 3 |
Code Gen 필수 (@riverpod) |
| Data |
Freezed 3 |
Immutable Models |
| DB |
Drift |
SQLite, Offline-first |
| Network |
Dio |
HTTP Client |
| Routing |
GoRouter |
Typed Routes 필수 |
Quick Start
스킬 실행 시 다음 정보를 입력받습니다:
- 폴더명 (예: my_habit_app)
- 프로젝트명/패키지명 (예: habit_app)
- 도메인 선택 (Todo/Habit/Note/Expense/Custom)
- 스택 프리셋 (Minimal/Essential/Full Stack/Custom)
그 후 자동으로 다음 단계가 실행됩니다:
# 1. 프로젝트 생성 (Android/Kotlin, iOS/Swift)
flutter create --platforms android,ios --android-language kotlin --org com.example [폴더명]
# 2. 패키지 설치
flutter pub get
# 3. Feature-First 구조로 코드 자동 생성
# - lib/src/features/{domain}/presentation/ (UI + Notifier)
# - lib/src/features/{domain}/domain/ (Freezed 모델)
# - lib/src/features/{domain}/data/ (Repository, DAO)
# - lib/src/database/ (Drift DB 정의)
# - lib/src/routing/ (GoRouter Typed Routes)
# 4. 코드 생성 (Riverpod, Freezed, Drift)
dart run build_runner build --delete-conflicting-outputs
# 5. 코드 검증 및 오류 자동 수정 (필수)
flutter analyze
# 6. 앱 실행
flutter run
Task Instructions
IMPORTANT: 이 스킬은 대화형으로 진행됩니다.
Step 1: 도메인 및 프로젝트 설정 질문
먼저 사용자에게 이렇게 물어보세요:
"Flutter 앱을 생성합니다. 다음 정보를 알려주세요:
1. 도메인(엔티티) 선택
어떤 도메인의 앱을 만드시겠습니까?
A) Todo (할 일 관리)
- 필드: title, description, isCompleted, createdAt, completedAt
- 기능: CRUD, 필터링(전체/진행중/완료), 체크박스 토글
B) Habit (습관 트래커)
- 필드: name, description, frequency(daily/weekly/monthly), streak, lastCompletedAt, goal, isActive
- 기능: CRUD, 연속 기록 추적, 목표 달성률, 완료 체크
C) Note (메모)
- 필드: title, content, tags, isPinned, createdAt, updatedAt
- 기능: CRUD, 태그 필터링, 고정 메모, 검색
D) Expense (지출 관리)
- 필드: amount, category, description, date, paymentMethod
- 기능: CRUD, 카테고리별 집계, 월별 통계, 필터링
E) Custom (직접 정의)
2. 프로젝트 정보
- 폴더명: 프로젝트를 생성할 폴더 이름 (기본값: [도메인]_app, 예: habit_app)
- 이 폴더에 Flutter 프로젝트가 생성됩니다
- 프로젝트명 (패키지명): Flutter 패키지 이름 (기본값: 폴더명과 동일)
- pubspec.yaml의 name 필드에 사용됩니다
- import 문에 사용됩니다 (예: package:habit_app/...)
- 조직명: (기본값: com.example)
- Android/iOS 패키지 식별자에 사용됩니다 (예: com.example.habit_app)
3. 스택 프리셋 선택
다음 중 하나를 선택해주세요:
A) Essential (권장)
- ✅ GoRouter (타입 안전한 라우팅)
- ✅ SharedPreferences (로컬 설정 저장)
- ✅ FPDart (함수형 에러 핸들링)
- ✅ Google Fonts
- ✅ FluentUI Icons
- ❌ Auth 시스템 제외
- ❌ Responsive Utils 제외
B) Minimal (가장 단순)
- ❌ GoRouter (기본 Navigator 사용)
- ✅ SharedPreferences
- ❌ FPDart 제외
- ❌ Google Fonts 제외
- ✅ 기본 FluentUI Icons
- ❌ Auth 시스템 제외
- ❌ Responsive Utils 제외
C) Full Stack (모든 기능)
- ✅ GoRouter
- ✅ SharedPreferences
- ✅ FPDart (함수형 에러 핸들링)
- ✅ Google Fonts
- ✅ Responsive Utils
- ✅ FluentUI Icons
- ✅ Auth 시스템 (Login/Register) - 선택 도메인에 따라
D) Custom (직접 선택)
어떤 도메인과 프리셋을 선택하시겠습니까? (도메인: A/B/C/D/E, 프리셋: A/B/C/D)"
Step 2: Custom 선택 시 추가 질문
2-1. Custom 도메인 (E) 선택 시:
- 엔티티명: 엔티티 이름을 입력하세요 (예: Task, Event, Book)
- 필드 정의: 각 필드를 입력하세요 (형식: 필드명:타입, 예: title:String, amount:double, isActive:bool)
- 지원 타입: String, int, double, bool, DateTime
- createdAt, updatedAt은 자동 추가됨
- 주요 기능: 필터링/정렬 기준이 될 필드를 선택하세요
2-2. Custom 스택 프리셋 (D) 선택 시:
다음 질문들을 순차적으로 하세요:
- 네비게이션: GoRouter를 사용하시겠습니까? (예/아니오)
- 에러 핸들링: FPDart를 사용하시겠습니까? (예/아니오)
- UI: Google Fonts를 사용하시겠습니까? (예/아니오)
- 반응형: Responsive Utils를 포함하시겠습니까? (예/아니오)
- 인증 시스템: Auth 시스템을 포함하시겠습니까? (예/아니오)
Step 3: 선택된 도메인과 스택에 따라 프로젝트 생성
Flutter 프로젝트 생성:
- 사용자가 지정한 폴더명으로 프로젝트 생성
- 명령어:
flutter create --platforms android,ios --android-language kotlin --org [조직명] [폴더명]
- 예:
flutter create --platforms android,ios --android-language kotlin --org com.example my_habit_app
- 폴더명과 프로젝트명(패키지명)이 다른 경우, 생성 후 pubspec.yaml의
name 필드를 수정
Kotlin DSL 확인 (최신 Flutter는 자동으로 Kotlin DSL 사용)
선택된 패키지 설치: pubspec.yaml 업데이트 후 flutter pub get
Feature-First 폴더 구조 생성:
lib/
└── src/
├── features/
│ └── {domain}/
│ ├── presentation/ # UI 위젯 + Notifier (@riverpod)
│ ├── domain/ # Freezed 모델/엔티티
│ └── data/ # Repository 구현, DAO
├── database/ # Drift DB 정의 (전역)
├── routing/ # GoRouter Typed Routes
└── shared/ # 공통 위젯, 유틸리티
도메인별 보일러플레이트 생성 (Feature-First + Riverpod Code Gen):
A) Todo: title, description, isCompleted, createdAt, completedAt
features/todo/domain/todo.dart - Freezed 엔티티
features/todo/data/todo_repository.dart - Repository + DAO
features/todo/presentation/todo_notifier.dart - @riverpod Notifier
features/todo/presentation/todo_list_screen.dart - UI
B) Habit: name, description, frequency, streak, lastCompletedAt, goal, isActive
features/habit/domain/habit.dart - Freezed 엔티티
features/habit/data/habit_repository.dart - Repository + DAO
features/habit/presentation/habit_notifier.dart - @riverpod Notifier
features/habit/presentation/habit_list_screen.dart - UI
C) Note: title, content, tags, isPinned, createdAt, updatedAt
features/note/domain/note.dart - Freezed 엔티티
features/note/data/note_repository.dart - Repository + DAO
features/note/presentation/note_notifier.dart - @riverpod Notifier
features/note/presentation/note_list_screen.dart - UI
D) Expense: amount, category, description, date, paymentMethod
features/expense/domain/expense.dart - Freezed 엔티티
features/expense/data/expense_repository.dart - Repository + DAO
features/expense/presentation/expense_notifier.dart - @riverpod Notifier
features/expense/presentation/expense_list_screen.dart - UI
E) Custom: 사용자 정의 필드
설정 파일 생성:
lib/src/database/app_database.dart - Drift DB (전역)
lib/src/routing/app_router.dart - GoRouter Typed Routes
assets/translations/ - Easy Localization
코드 생성: dart run build_runner build --delete-conflicting-outputs
코드 검증 및 오류 수정:
a. flutter analyze 실행
b. 발견된 오류 수정:
- import 경로:
package: 형식 사용
- Riverpod 3 Code Gen: 모든 Provider는
@riverpod 어노테이션 사용
- Freezed 3:
@freezed 어노테이션 + part 파일 확인
- AsyncValue: 로딩/에러 상태는
.when() 패턴 사용
c. 재검증: 모든 error 레벨 오류가 없을 때까지 반복
d. 목표: flutter analyze 결과가 "0 issues found"
✅ CRITICAL: 이 단계는 필수입니다. 모든 error를 제거해야 다음 단계로 진행할 수 있습니다.
Step 4: 최종 검증 및 안내
✅ CRITICAL: 이 단계는 프로젝트 완료의 필수 조건입니다.
최종 분석 실행:
flutter analyze
성공 기준:
✅ 성공 예시:
Analyzing todo_app...
No issues found!
또는
Analyzing todo_app...
1 issue found. (ran in 2.3s)
info • Prefer using lowerCamelCase for constant names • lib/core/constants.dart:5:7 • constant_identifier_names
❌ 실패 예시 (error가 있으면 반드시 수정):
error • Target of URI doesn't exist: 'package:...' • lib/main.dart:5:8 • uri_does_not_exist
error • The getter 'xyz' isn't defined for the type 'ABC' • lib/presentation/screens/home.dart:42:15
검증 결과 요약 (성공 시):
✅ Flutter 프로젝트 생성 완료!
✅ 코드 생성 완료 (Freezed, Drift, JSON Serializable)
✅ Flutter analyze 통과 (0-1 issues found, info 레벨만)
✅ 모든 패키지 설치 완료
프로젝트 정보 제공:
- 폴더명: [사용자 입력값] (예: my_habit_app)
- 프로젝트명 (패키지명): [사용자 입력값] (예: habit_app)
- 조직명: [사용자 입력값] (예: com.example)
- 도메인: [선택된 도메인] (Todo/Habit/Note/Expense/Custom)
- 선택된 스택: [프리셋명] (GoRouter, Drift, FPDart 등)
- 주요 기능: [도메인] CRUD, 다국어 지원, 로컬 저장소 등
- 생성된 파일: XX개 Dart 파일 (core, data, domain, presentation)
실행 방법 안내:
cd [폴더명]
flutter run
다음 단계 제안 (선택사항, 도메인별):
- Todo: 항목 추가/수정/삭제, 필터링(전체/진행중/완료), 완료 토글
- Habit: 습관 기록, 연속 기록 확인, 목표 달성률, 통계 확인
- Note: 메모 작성/편집, 태그 추가, 고정 메모, 검색
- Expense: 지출 기록, 카테고리별 통계, 월별 집계, 필터링
- 공통: 언어 전환 (영어 ↔ 한국어), 다크/라이트 테마 전환
Core Principles
- Feature-First: 기능 단위 독립 구조 (
lib/src/features/{feature}/)
- Riverpod 3 Code Gen: 모든 Provider는
@riverpod 어노테이션 필수
- Freezed 3: 불변 모델 + JSON 직렬화
- Offline-First: Drift SQLite로 로컬 우선 저장
- Typed Routes: GoRouter로 타입 안전한 네비게이션
- AsyncValue: 로딩/에러 상태는
.when() 패턴 사용
Coding Conventions
1. Riverpod 3 (State Management)
// ✅ Code Gen 사용 (필수)
@riverpod
class TodoNotifier extends _$TodoNotifier {
@override
Future<List<Todo>> build() async {
return ref.watch(todoRepositoryProvider).getTodos();
}
}
// UI에서 사용
ref.watch(todoNotifierProvider).when(
data: (todos) => ListView(...),
error: (e, st) => ErrorWidget(e),
loading: () => CircularProgressIndicator(),
);
2. Freezed 3 (Models)
@freezed
class Todo with _$Todo {
const factory Todo({
required int id,
required String title,
@Default(false) bool isCompleted,
}) = _Todo;
factory Todo.fromJson(Map<String, dynamic> json) => _$TodoFromJson(json);
}
3. 에러 핸들링
- Repository:
try-catch 후 커스텀 에러 반환 또는 AsyncValue로 래핑
- UI:
.when(data, error, loading) 패턴으로 에러 표시
4. Drift (Local DB)
- 테이블 정의:
lib/src/database/ (전역)
- DAO:
features/{feature}/data/ 내에 위치
Reference Files
references/setup-guide.md - 완전한 가이드
- Feature-First 구조 상세
- Riverpod 3 Code Gen 패턴
- Drift DAO 패턴
- GoRouter Typed Routes
Notes
- Feature-First 구조: 기능별 독립 폴더 (
lib/src/features/)
- Code Gen 필수: Riverpod, Freezed, Drift 모두 코드 생성 사용
- 도메인 지원: Todo, Habit, Note, Expense, Custom
- 프리셋 제공: Full Stack, Essential, Minimal, Custom
- 플랫폼: Android/Kotlin, iOS/Swift
- 주요 명령어:
- Build:
dart run build_runner build --delete-conflicting-outputs
- Watch:
dart run build_runner watch
- Lint:
flutter analyze
- Test:
flutter test
1---2name: flutter-init3description: Use when user wants to create a new Flutter project (Todo/Habit/Note/Expense/Custom domain) with Feature-First Architecture, Riverpod 3 Code Gen, Drift, and modern Flutter stack4---56# Flutter Init Skill78도메인 기반 Flutter 프로젝트를 생성하고 **Feature-First 아키텍처**로 자동 설정합니다.9Todo, Habit, Note, Expense 또는 Custom 도메인을 선택하여 오프라인 우선(Offline-first) CRUD 앱을 즉시 생성할 수 있습니다.1011## Tech Stack1213| 영역 | 기술 | 비고 |14|------|------|------|15| **State** | Riverpod 3 | Code Gen 필수 (`@riverpod`) |16| **Data** | Freezed 3 | Immutable Models |17| **DB** | Drift | SQLite, Offline-first |18| **Network** | Dio | HTTP Client |19| **Routing** | GoRouter | Typed Routes 필수 |2021## Quick Start2223스킬 실행 시 다음 정보를 입력받습니다:24- 폴더명 (예: my_habit_app)25- 프로젝트명/패키지명 (예: habit_app)26- 도메인 선택 (Todo/Habit/Note/Expense/Custom)27- 스택 프리셋 (Minimal/Essential/Full Stack/Custom)2829그 후 자동으로 다음 단계가 실행됩니다:3031```bash32# 1. 프로젝트 생성 (Android/Kotlin, iOS/Swift)33flutter create --platforms android,ios --android-language kotlin --org com.example [폴더명]3435# 2. 패키지 설치36flutter pub get3738# 3. Feature-First 구조로 코드 자동 생성39# - lib/src/features/{domain}/presentation/ (UI + Notifier)40# - lib/src/features/{domain}/domain/ (Freezed 모델)41# - lib/src/features/{domain}/data/ (Repository, DAO)42# - lib/src/database/ (Drift DB 정의)43# - lib/src/routing/ (GoRouter Typed Routes)4445# 4. 코드 생성 (Riverpod, Freezed, Drift)46dart run build_runner build --delete-conflicting-outputs4748# 5. 코드 검증 및 오류 자동 수정 (필수)49flutter analyze5051# 6. 앱 실행52flutter run53```5455## Task Instructions5657**IMPORTANT**: 이 스킬은 대화형으로 진행됩니다.5859### Step 1: 도메인 및 프로젝트 설정 질문6061**먼저 사용자에게 이렇게 물어보세요:**6263"Flutter 앱을 생성합니다. 다음 정보를 알려주세요:6465**1. 도메인(엔티티) 선택**6667어떤 도메인의 앱을 만드시겠습니까?6869**A) Todo (할 일 관리)**70- 필드: title, description, isCompleted, createdAt, completedAt71- 기능: CRUD, 필터링(전체/진행중/완료), 체크박스 토글7273**B) Habit (습관 트래커)**74- 필드: name, description, frequency(daily/weekly/monthly), streak, lastCompletedAt, goal, isActive75- 기능: CRUD, 연속 기록 추적, 목표 달성률, 완료 체크7677**C) Note (메모)**78- 필드: title, content, tags, isPinned, createdAt, updatedAt79- 기능: CRUD, 태그 필터링, 고정 메모, 검색8081**D) Expense (지출 관리)**82- 필드: amount, category, description, date, paymentMethod83- 기능: CRUD, 카테고리별 집계, 월별 통계, 필터링8485**E) Custom (직접 정의)**86- 엔티티명과 필드를 직접 입력8788**2. 프로젝트 정보**89- **폴더명**: 프로젝트를 생성할 폴더 이름 (기본값: [도메인]_app, 예: habit_app)90 - 이 폴더에 Flutter 프로젝트가 생성됩니다91- **프로젝트명 (패키지명)**: Flutter 패키지 이름 (기본값: 폴더명과 동일)92 - pubspec.yaml의 name 필드에 사용됩니다93 - import 문에 사용됩니다 (예: package:habit_app/...)94- **조직명**: (기본값: com.example)95 - Android/iOS 패키지 식별자에 사용됩니다 (예: com.example.habit_app)9697**3. 스택 프리셋 선택**9899다음 중 하나를 선택해주세요:100101**A) Essential (권장)**102- ✅ GoRouter (타입 안전한 라우팅)103- ✅ SharedPreferences (로컬 설정 저장)104- ✅ FPDart (함수형 에러 핸들링)105- ✅ Google Fonts106- ✅ FluentUI Icons107- ❌ Auth 시스템 제외108- ❌ Responsive Utils 제외109110**B) Minimal (가장 단순)**111- ❌ GoRouter (기본 Navigator 사용)112- ✅ SharedPreferences113- ❌ FPDart 제외114- ❌ Google Fonts 제외115- ✅ 기본 FluentUI Icons116- ❌ Auth 시스템 제외117- ❌ Responsive Utils 제외118119**C) Full Stack (모든 기능)**120- ✅ GoRouter121- ✅ SharedPreferences122- ✅ FPDart (함수형 에러 핸들링)123- ✅ Google Fonts124- ✅ Responsive Utils125- ✅ FluentUI Icons126- ✅ Auth 시스템 (Login/Register) - 선택 도메인에 따라127128**D) Custom (직접 선택)**129- 각 기능을 개별적으로 선택130131어떤 도메인과 프리셋을 선택하시겠습니까? (도메인: A/B/C/D/E, 프리셋: A/B/C/D)"132133### Step 2: Custom 선택 시 추가 질문134135#### 2-1. Custom 도메인 (E) 선택 시:1361371. **엔티티명**: 엔티티 이름을 입력하세요 (예: Task, Event, Book)1382. **필드 정의**: 각 필드를 입력하세요 (형식: 필드명:타입, 예: title:String, amount:double, isActive:bool)139 - 지원 타입: String, int, double, bool, DateTime140 - createdAt, updatedAt은 자동 추가됨1413. **주요 기능**: 필터링/정렬 기준이 될 필드를 선택하세요142143#### 2-2. Custom 스택 프리셋 (D) 선택 시:144145다음 질문들을 순차적으로 하세요:1461471. **네비게이션**: GoRouter를 사용하시겠습니까? (예/아니오)1482. **에러 핸들링**: FPDart를 사용하시겠습니까? (예/아니오)1493. **UI**: Google Fonts를 사용하시겠습니까? (예/아니오)1504. **반응형**: Responsive Utils를 포함하시겠습니까? (예/아니오)1515. **인증 시스템**: Auth 시스템을 포함하시겠습니까? (예/아니오)152153### Step 3: 선택된 도메인과 스택에 따라 프로젝트 생성1541551. **Flutter 프로젝트 생성**:156 - 사용자가 지정한 **폴더명**으로 프로젝트 생성157 - 명령어: `flutter create --platforms android,ios --android-language kotlin --org [조직명] [폴더명]`158 - 예: `flutter create --platforms android,ios --android-language kotlin --org com.example my_habit_app`159 - 폴더명과 프로젝트명(패키지명)이 다른 경우, 생성 후 pubspec.yaml의 `name` 필드를 수정1601612. **Kotlin DSL 확인** (최신 Flutter는 자동으로 Kotlin DSL 사용)1621633. **선택된 패키지 설치**: `pubspec.yaml` 업데이트 후 `flutter pub get`1641654. **Feature-First 폴더 구조 생성**:166 ```167 lib/168 └── src/169 ├── features/170 │ └── {domain}/171 │ ├── presentation/ # UI 위젯 + Notifier (@riverpod)172 │ ├── domain/ # Freezed 모델/엔티티173 │ └── data/ # Repository 구현, DAO174 ├── database/ # Drift DB 정의 (전역)175 ├── routing/ # GoRouter Typed Routes176 └── shared/ # 공통 위젯, 유틸리티177 ```1781795. **도메인별 보일러플레이트 생성** (Feature-First + Riverpod Code Gen):180181 **A) Todo**: title, description, isCompleted, createdAt, completedAt182 - `features/todo/domain/todo.dart` - Freezed 엔티티183 - `features/todo/data/todo_repository.dart` - Repository + DAO184 - `features/todo/presentation/todo_notifier.dart` - `@riverpod` Notifier185 - `features/todo/presentation/todo_list_screen.dart` - UI186187 **B) Habit**: name, description, frequency, streak, lastCompletedAt, goal, isActive188 - `features/habit/domain/habit.dart` - Freezed 엔티티189 - `features/habit/data/habit_repository.dart` - Repository + DAO190 - `features/habit/presentation/habit_notifier.dart` - `@riverpod` Notifier191 - `features/habit/presentation/habit_list_screen.dart` - UI192193 **C) Note**: title, content, tags, isPinned, createdAt, updatedAt194 - `features/note/domain/note.dart` - Freezed 엔티티195 - `features/note/data/note_repository.dart` - Repository + DAO196 - `features/note/presentation/note_notifier.dart` - `@riverpod` Notifier197 - `features/note/presentation/note_list_screen.dart` - UI198199 **D) Expense**: amount, category, description, date, paymentMethod200 - `features/expense/domain/expense.dart` - Freezed 엔티티201 - `features/expense/data/expense_repository.dart` - Repository + DAO202 - `features/expense/presentation/expense_notifier.dart` - `@riverpod` Notifier203 - `features/expense/presentation/expense_list_screen.dart` - UI204205 **E) Custom**: 사용자 정의 필드206 - 동일한 Feature-First 구조로 생성2072086. **설정 파일 생성**:209 - `lib/src/database/app_database.dart` - Drift DB (전역)210 - `lib/src/routing/app_router.dart` - GoRouter Typed Routes211 - `assets/translations/` - Easy Localization2122137. **코드 생성**: `dart run build_runner build --delete-conflicting-outputs`2142158. **코드 검증 및 오류 수정**:216217 a. `flutter analyze` 실행218219 b. 발견된 오류 수정:220 - **import 경로**: `package:` 형식 사용221 - **Riverpod 3 Code Gen**: 모든 Provider는 `@riverpod` 어노테이션 사용222 - **Freezed 3**: `@freezed` 어노테이션 + `part` 파일 확인223 - **AsyncValue**: 로딩/에러 상태는 `.when()` 패턴 사용224225 c. 재검증: 모든 error 레벨 오류가 없을 때까지 반복226227 d. 목표: `flutter analyze` 결과가 "0 issues found"228229 **✅ CRITICAL**: 이 단계는 필수입니다. 모든 error를 제거해야 다음 단계로 진행할 수 있습니다.230231### Step 4: 최종 검증 및 안내232233**✅ CRITICAL**: 이 단계는 프로젝트 완료의 필수 조건입니다.2342351. **최종 분석 실행**:236 ```bash237 flutter analyze238 ```2392402. **성공 기준**:241 - ✅ **성공 예시**:242 ```243 Analyzing todo_app...244 No issues found!245 ```246 또는247 ```248 Analyzing todo_app...249 1 issue found. (ran in 2.3s)250 info • Prefer using lowerCamelCase for constant names • lib/core/constants.dart:5:7 • constant_identifier_names251 ```252253 - ❌ **실패 예시** (error가 있으면 반드시 수정):254 ```255 error • Target of URI doesn't exist: 'package:...' • lib/main.dart:5:8 • uri_does_not_exist256 error • The getter 'xyz' isn't defined for the type 'ABC' • lib/presentation/screens/home.dart:42:15257 ```2582593. **검증 결과 요약** (성공 시):260 ```261 ✅ Flutter 프로젝트 생성 완료!262 ✅ 코드 생성 완료 (Freezed, Drift, JSON Serializable)263 ✅ Flutter analyze 통과 (0-1 issues found, info 레벨만)264 ✅ 모든 패키지 설치 완료265 ```2662674. **프로젝트 정보 제공**:268 - **폴더명**: [사용자 입력값] (예: my_habit_app)269 - **프로젝트명 (패키지명)**: [사용자 입력값] (예: habit_app)270 - **조직명**: [사용자 입력값] (예: com.example)271 - **도메인**: [선택된 도메인] (Todo/Habit/Note/Expense/Custom)272 - **선택된 스택**: [프리셋명] (GoRouter, Drift, FPDart 등)273 - **주요 기능**: [도메인] CRUD, 다국어 지원, 로컬 저장소 등274 - **생성된 파일**: XX개 Dart 파일 (core, data, domain, presentation)2752765. **실행 방법 안내**:277 ```bash278 cd [폴더명]279 flutter run280 ```2812826. **다음 단계 제안** (선택사항, 도메인별):283 - **Todo**: 항목 추가/수정/삭제, 필터링(전체/진행중/완료), 완료 토글284 - **Habit**: 습관 기록, 연속 기록 확인, 목표 달성률, 통계 확인285 - **Note**: 메모 작성/편집, 태그 추가, 고정 메모, 검색286 - **Expense**: 지출 기록, 카테고리별 통계, 월별 집계, 필터링287 - **공통**: 언어 전환 (영어 ↔ 한국어), 다크/라이트 테마 전환288289## Core Principles290291- **Feature-First**: 기능 단위 독립 구조 (`lib/src/features/{feature}/`)292- **Riverpod 3 Code Gen**: 모든 Provider는 `@riverpod` 어노테이션 필수293- **Freezed 3**: 불변 모델 + JSON 직렬화294- **Offline-First**: Drift SQLite로 로컬 우선 저장295- **Typed Routes**: GoRouter로 타입 안전한 네비게이션296- **AsyncValue**: 로딩/에러 상태는 `.when()` 패턴 사용297298## Coding Conventions299300### 1. Riverpod 3 (State Management)301```dart302// ✅ Code Gen 사용 (필수)303@riverpod304class TodoNotifier extends _$TodoNotifier {305 @override306 Future<List<Todo>> build() async {307 return ref.watch(todoRepositoryProvider).getTodos();308 }309}310311// UI에서 사용312ref.watch(todoNotifierProvider).when(313 data: (todos) => ListView(...),314 error: (e, st) => ErrorWidget(e),315 loading: () => CircularProgressIndicator(),316);317```318319### 2. Freezed 3 (Models)320```dart321@freezed322class Todo with _$Todo {323 const factory Todo({324 required int id,325 required String title,326 @Default(false) bool isCompleted,327 }) = _Todo;328329 factory Todo.fromJson(Map<String, dynamic> json) => _$TodoFromJson(json);330}331```332333### 3. 에러 핸들링334- Repository: `try-catch` 후 커스텀 에러 반환 또는 `AsyncValue`로 래핑335- UI: `.when(data, error, loading)` 패턴으로 에러 표시336337### 4. Drift (Local DB)338- 테이블 정의: `lib/src/database/` (전역)339- DAO: `features/{feature}/data/` 내에 위치340341## Reference Files342343[references/setup-guide.md](references/setup-guide.md) - 완전한 가이드344- Feature-First 구조 상세345- Riverpod 3 Code Gen 패턴346- Drift DAO 패턴347- GoRouter Typed Routes348349## Notes350351- **Feature-First 구조**: 기능별 독립 폴더 (`lib/src/features/`)352- **Code Gen 필수**: Riverpod, Freezed, Drift 모두 코드 생성 사용353- **도메인 지원**: Todo, Habit, Note, Expense, Custom354- **프리셋 제공**: Full Stack, Essential, Minimal, Custom355- **플랫폼**: Android/Kotlin, iOS/Swift356- **주요 명령어**:357 - Build: `dart run build_runner build --delete-conflicting-outputs`358 - Watch: `dart run build_runner watch`359 - Lint: `flutter analyze`360 - Test: `flutter test`