# Implementation Plan - MONOREPO_CLIENT ## 이 파일을 읽는 구현 에이전트에게 구현 완료 전 `CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 사용자 결정, 사용자 소유 외부 환경/secret, 또는 범위 충돌이 있으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 에이전트는 `USER_REVIEW.md`, archive log, `complete.log`를 만들지 않는다. ## 배경 Milestone은 OTO 독립 콘솔의 source of truth를 `apps/client`에 두라고 지정한다. 현재 repo에는 Flutter client app이 없으므로 최소 standalone scaffold와 검증 기준을 만든다. OTO Server API 연동은 아직 contract가 없으므로 이 plan에서는 제외한다. ## 사용자 리뷰 요청 흐름 구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 검증하고 `USER_REVIEW.md` 작성 여부를 결정한다. ## Roadmap Targets - Milestone: `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md` - Task ids: - `client-app`: Flutter client가 `apps/client` 기준으로 추가되고, OTO 독립 콘솔의 source of truth가 client app에 위치한다. - Completion mode: check-on-pass ## 분석 결과 ### 읽은 파일 - `agent-roadmap/current.md` - `agent-roadmap/phase/independent-control-plane/PHASE.md` - `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md` - `agent-ops/rules/project/rules.md` - `agent-ops/skills/common/plan/SKILL.md` - `agent-test/local/rules.md` - `agent-test/local/framework-smoke.md` - `pubspec.yaml` - `analysis_options.yaml` ### 테스트 환경 규칙 - test_env: `local` - `agent-test/local/rules.md`와 `framework-smoke.md`를 읽었다. - 적용 명령: `flutter analyze`, `flutter test`. - 확인한 도구: `flutter`는 `/sdk/flutter/bin/flutter`, Flutter `3.41.5`, Dart `3.11.3`. ### 테스트 커버리지 공백 - 기존 client app이 없어 기존 테스트 커버리지는 없다. - scaffold가 생성하는 widget test 또는 새 smoke widget test로 초기 화면이 렌더링되는지만 검증한다. ### 심볼 참조 - renamed/removed symbols: none. ### 분할 판단 - split decision policy를 적용했다. - `02_client_app`은 Flutter toolchain과 UI scaffold만 다루며 runner/core와 독립 검증 가능하다. - root helper 위임은 `04+01,02,03_root_entrypoints`로 분리했다. ### 범위 결정 근거 - OTO Server API client, auth, runner registry 화면, job/log/artifact UI는 제외한다. - `packages/` 공유 패키지를 만들지 않는다. - runner Dart package와 Go core service를 수정하지 않는다. ### 빌드 등급 - `local-G05`: 새 Flutter scaffold와 기본 widget smoke 검증으로 범위가 명확하고 deterministic하다. ## 구현 체크리스트 - [ ] `apps/client`에 Flutter app scaffold를 만들고 project name은 `oto_client`로 둔다. - [ ] 초기 앱은 독립 콘솔 source of truth가 드러나도록 title/app shell만 최소 수정한다. - [ ] scaffold widget test를 현재 title/app shell에 맞게 보정한다. - [ ] `apps/client`에서 `flutter analyze`와 `flutter test`를 실행한다. - [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. ### [MONOREPO_CLIENT-1] Add Flutter Client Scaffold 문제: Milestone `agent-roadmap/phase/independent-control-plane/milestones/control-plane-separation-migration.md:29`와 `:41`은 `apps/client` Flutter client를 요구하지만 현재 해당 경로가 없다. 해결 방법: ```bash flutter create --project-name oto_client --platforms=web,linux,macos,windows apps/client ``` 그 뒤 기본 sample counter UI를 OTO Console shell로 줄인다. API endpoint, auth, runner list는 만들지 않는다. 수정 파일 및 체크리스트: - [ ] `apps/client/pubspec.yaml` - [ ] `apps/client/lib/main.dart` - [ ] `apps/client/test/widget_test.dart` - [ ] Flutter scaffold가 생성한 platform/config files 테스트 작성: scaffold widget test를 "OTO Console" title 또는 초기 shell 렌더링 assertion으로 수정한다. 중간 검증: ```bash cd apps/client && flutter analyze ``` 예상 결과: analyzer issue 없음. ## 수정 파일 요약 | 파일 | 항목 | |------|------| | `apps/client/**` | MONOREPO_CLIENT-1 | ## 최종 검증 ```bash cd apps/client && flutter analyze && flutter test ``` 예상 결과: Flutter analyze/test 통과. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.