--- domain: client last_rule_review_commit: unborn-head last_rule_updated_at: 2026-07-23 --- # client ## 목적 / 책임 Ariadne의 조직 범위 오류, 프로젝트, 수정 작업, 검토 상태를 한국어 Flutter 웹 화면으로 제공하며 서버·IOP 권한 판정과 분리된 사용자 경험을 유지한다. ## 포함 경로 - `apps/client/lib/` — 애플리케이션, 기능 화면, 공유 테마의 Dart 코드다. - `apps/client/test/` — Flutter 위젯과 사용자 화면 동작 검증이다. - `apps/client/web/` — Flutter 웹 엔트리와 정적 자산이다. - `apps/client/pubspec.yaml` — Dart SDK와 Flutter 의존성 기준이다. - `.fvmrc` — 프로젝트 Flutter SDK 버전 기준이다. ## 제외 경로 - `internal/domain/` — 조직·오류·수정 작업의 권한과 상태 판정은 domain-model 책임이다. - `internal/platform/httpserver/` — API 라우팅과 서버 수명주기는 platform 책임이다. - `internal/integration/iop/` — IOP 실행과 이벤트 스트림은 integrations 책임이다. ## 주요 구성 요소 - `AriadneApp` — 한국어 locale과 Material 3 테마를 적용하는 앱 루트다. - `OverviewPage` — 화면 너비에 따라 rail과 drawer를 전환하는 반응형 개요 화면이다. - `AppTheme` — Ariadne의 색상, 타이포그래피, 카드 스타일을 모은 공유 테마다. ## 유지할 패턴 - 기능 화면은 `lib/features/`, 공통 시각 요소는 `lib/shared/` 경계를 유지한다. - 가능한 위젯과 값은 `const`로 선언하고 `flutter_lints` 기준을 따른다. - Material 3와 한국어 locale을 유지하며 좁은 화면에서도 조직·탐색 의미가 보존되게 한다. - 아직 연결되지 않은 기능은 활성 동작처럼 보이게 하지 말고 tooltip·semantics로 준비 중 상태를 명확히 한다. - 화면 추가 시 widget test와 `flutter analyze` 검증을 함께 갱신한다. ## 다른 도메인과의 경계 - **domain-model**: 서버가 제공한 조직 범위 상태를 표현하되 클라이언트에서 권한이나 수정 가능성을 최종 판정하지 않는다. - **integrations**: IOP 연결 상태를 표시할 수 있지만 IOP endpoint나 자격 증명을 직접 다루지 않는다. - **platform**: Ariadne API를 통해 통신하며 데이터베이스나 서버 내부 타입에 직접 의존하지 않는다. ## 금지 사항 - 클라이언트가 요청 본문의 조직 식별자만으로 접근 범위를 결정하도록 만들지 않는다. - IOP, PostgreSQL, 운영 환경에 직접 연결하거나 비밀값을 Flutter 자산에 포함하지 않는다. - 미구현 탐색 항목과 조직 선택 UI에 실제 동작이 있는 것처럼 오해시키는 상호작용을 추가하지 않는다. - 로컬 형제 저장소의 Dart 패키지를 정식 의존성으로 추가하지 않는다.