<!-- task=m-client-integration-standardization/01_client_module_boundary plan=0 tag=CIS-PATH -->

# Plan - CIS-PATH

## 이 파일을 읽는 구현 에이전트에게

`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수다. 구현 후 검증 명령을 실행하고 실제 stdout/stderr를 붙여 넣은 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용이다.

## 배경

현재 milestone의 표준선은 Flutter host 경로를 `apps/client`로 맞추고 Dart package/app 표시 이름은 프로젝트 정체성을 유지하는 것이다. 현재 repository는 `apps/mobile` 경로와 root helper, README, docs, domain rules가 서로 같은 옛 경로를 참조한다. 먼저 경로와 운영 문서를 맞춰야 이후 Dart skeleton과 integration 작업이 같은 기준에서 진행된다.

## 분석 결과

### 읽은 파일

- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/project/domain/mobile/rules.md`
- `agent-ops/rules/project/domain/workspace-ops/rules.md`
- `agent-ops/rules/project/domain/contracts/rules.md`
- `agent-ops/rules/project/domain/core/rules.md`
- `agent-ops/rules/common/philosophy.md`
- `agent-ops/roadmap/current.md`
- `agent-ops/roadmap/phase/project-workspace-management-ux/PHASE.md`
- `agent-ops/roadmap/phase/project-workspace-management-ux/milestones/client-integration-standardization.md`
- `bin/test`
- `bin/lint`
- `bin/build`
- `bin/dev`
- `README.md`
- `docs/monorepo.md`
- `packages/contracts/README.md`
- `packages/contracts/notes/flutter-core-api-candidates.md`
- `apps/mobile/pubspec.yaml`
- `apps/mobile/analysis_options.yaml`
- `apps/mobile/README.md`
- `apps/mobile/push-notification-todo.md`
- `apps/mobile/lib/main.dart`
- `apps/mobile/lib/models/project_workspace.dart`
- `apps/mobile/lib/screens/workspace_home_page.dart`
- `apps/mobile/lib/services/mattermost_auth_service.dart`
- `apps/mobile/lib/services/workspace_launcher.dart`
- `apps/mobile/test/widget_test.dart`
- `apps/mobile/android/app/src/main/AndroidManifest.xml`
- `apps/mobile/android/app/build.gradle.kts`
- `apps/mobile/web/index.html`
- `apps/mobile/web/manifest.json`

### 테스트 커버리지 공백

- `apps/mobile` to `apps/client` 경로 이동: 기존 widget test는 앱 실행을 확인하지만 root helper와 docs/rules 경로 참조는 테스트하지 않는다. `rg --sort path` 검색 검증으로 보완한다.
- root helper 경로 변경: shell unit test가 없다. `bin/test`, `bin/lint`, `bin/build` 중 최소 `bin/test`와 `bin/lint`를 직접 실행해 Flutter 경로 탐지를 확인한다.
- Android/iOS/native package id는 이번 작업에서 변경하지 않는다. package/app 표시 이름 유지 기준 때문에 native runtime 테스트는 요구하지 않는다.

### 심볼 참조

- Dart symbol rename 없음.
- path reference는 `rg --sort path -n "apps/mobile|nomadcode_app|apps/client|mobile" ...`로 확인했다. 구현 시 `apps/mobile` 경로 참조는 모두 `apps/client` 또는 일반 `client` 표기로 바꾼다.

### 분할 판단

split decision policy를 계획 파일 선택 전에 평가했다. 공유 task group은 `m-client-integration-standardization`이다.

- `01_client_module_boundary`: `apps/mobile` to `apps/client` 경로, root helper, README/docs, domain rules 정리. 선행 작업이다.
- `02+01_client_bootstrap_skeleton`: Dart source layout과 bootstrap 정리. `01_client_module_boundary` 완료 후 시작한다.
- `03+02_integration_boundaries`: proto-socket/Mattermost integration 경계와 설정 주입. `02+01_client_bootstrap_skeleton` 완료 후 시작한다.
- `04+03_clone_handoff_docs`: clone handoff와 target 문서. `03+02_integration_boundaries` 완료 후 시작한다.

경로 이동, Dart 구조 변경, protocol/auth integration, 문서 handoff는 소유 경계와 검증 전략이 달라 multi-plan이 맞다.

### 범위 결정 근거

- Dart source 구조 변경은 이 plan에서 하지 않는다. `02+01_client_bootstrap_skeleton`가 소유한다.
- proto-socket dependency와 Mattermost host adapter 구현은 이 plan에서 하지 않는다. `03+02_integration_boundaries`가 소유한다.
- `../iop`, `../alt`, `../mattermost-push-plugin`, `../proto-socket` 코드는 수정하지 않는다. 이 repository 안의 경로/문서 기준만 맞춘다.
- `agent-ops/rules/common/**`와 `agent-ops/skills/common/**`는 framework 동기화 영역이므로 수정하지 않는다.

### 빌드 등급

- build lane: `cloud-G07`, review lane: `cloud-G07`. 이유: repository path rename, root helper, docs, project rules가 함께 움직이며 테스트가 path reference 전체를 자동 보장하지 않는다.

## 구현 체크리스트

- [ ] [CIS-PATH-1] `apps/mobile` Flutter host를 `apps/client`로 이동하고 package/app 표시 이름은 유지한다.
- [ ] [CIS-PATH-2] root helper와 workspace 문서를 `apps/client` 기준으로 갱신한다.
- [ ] [CIS-PATH-3] project/domain rules의 client 경로 매핑을 갱신한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [CIS-PATH-1] Flutter host 경로를 `apps/client`로 이동

#### 문제

Milestone은 `apps/client` 모듈명을 표준선으로 둔다. 현재 package manifest는 `apps/mobile/pubspec.yaml:1`에 있고 root 전체가 `apps/mobile`을 client source of truth로 본다.

Before:

```yaml
# apps/mobile/pubspec.yaml:1
name: nomadcode_app
```

#### 해결 방법

`git mv apps/mobile apps/client`로 Flutter host 전체를 이동한다. `pubspec.yaml`의 `name: nomadcode_app`, Android `namespace`, `applicationId`, manifest `android:label`은 NomadCode 제품 정체성으로 유지한다.

After:

```yaml
# apps/client/pubspec.yaml:1
name: nomadcode_app
```

#### 수정 파일 및 체크리스트

- [ ] `apps/mobile/**`을 `apps/client/**`로 이동한다.
- [ ] `apps/client/pubspec.yaml` package name은 `nomadcode_app`로 유지한다.
- [ ] `apps/client/android/app/build.gradle.kts`의 `namespace`와 `applicationId`는 이번 작업에서 유지한다.
- [ ] `apps/client/android/app/src/main/AndroidManifest.xml`의 `android:label`은 이번 작업에서 유지한다.

#### 테스트 작성

새 테스트는 작성하지 않는다. 경로 이동은 동작 변경이 아니며 기존 widget test를 새 위치에서 실행해 보장한다.

#### 중간 검증

```bash
test -f apps/client/pubspec.yaml && test ! -e apps/mobile
```

예상: exit code 0.

### [CIS-PATH-2] root helper와 workspace 문서 갱신

#### 문제

root helper는 `apps/mobile`을 직접 탐지한다. 예: `bin/test:14-16`, `bin/lint:34-36`, `bin/build:54-56`, `bin/dev:69-70`.

Before:

```bash
# bin/test:14-16
if [ -f "$root/apps/mobile/pubspec.yaml" ]; then
  if command -v flutter >/dev/null 2>&1; then
    (cd "$root/apps/mobile" && flutter test)
```

#### 해결 방법

helper 경로를 `apps/client`로 바꾸고 skip 메시지도 `apps/client`로 맞춘다. README와 docs도 Flutter host 경로를 `apps/client`로 정리하되 mobile/desktop/web target 설명은 유지한다.

After:

```bash
# bin/test
if [ -f "$root/apps/client/pubspec.yaml" ]; then
  if command -v flutter >/dev/null 2>&1; then
    (cd "$root/apps/client" && flutter test)
```

#### 수정 파일 및 체크리스트

- [ ] `bin/test`
- [ ] `bin/lint`
- [ ] `bin/build`
- [ ] `bin/dev`
- [ ] `README.md`
- [ ] `docs/monorepo.md`
- [ ] `packages/contracts/notes/flutter-core-api-candidates.md`
- [ ] `packages/contracts/README.md`는 링크 변화가 필요할 때만 수정한다.

#### 테스트 작성

새 shell test는 작성하지 않는다. repository에 root helper test harness가 없다. 실제 helper 실행과 deterministic search로 검증한다.

#### 중간 검증

```bash
bash -n bin/test bin/lint bin/build bin/dev
```

예상: exit code 0.

### [CIS-PATH-3] project/domain rules 갱신

#### 문제

project rules와 domain rules는 아직 `apps/mobile`을 client 도메인 경로로 가리킨다. 예: `agent-ops/rules/project/rules.md:15`, `agent-ops/rules/project/rules.md:42`, `agent-ops/rules/project/domain/mobile/rules.md:15-20`.

Before:

```markdown
# agent-ops/rules/project/rules.md:42
| `apps/mobile/**` | mobile | `agent-ops/rules/project/domain/mobile/rules.md` |
```

#### 해결 방법

domain 이름은 `mobile`로 유지하되 포함 경로를 `apps/client/**`로 바꾸고 목적 문장에는 client host가 mobile/desktop/web target을 담당한다고 명확히 쓴다. `workspace-ops`, `contracts`, `core` rule의 제외/경계 문장도 `apps/client`로 맞춘다.

After:

```markdown
| `apps/client/**` | mobile | `agent-ops/rules/project/domain/mobile/rules.md` |
```

#### 수정 파일 및 체크리스트

- [ ] `agent-ops/rules/project/rules.md`
- [ ] `agent-ops/rules/project/domain/mobile/rules.md`
- [ ] `agent-ops/rules/project/domain/workspace-ops/rules.md`
- [ ] `agent-ops/rules/project/domain/contracts/rules.md`
- [ ] `agent-ops/rules/project/domain/core/rules.md`

#### 테스트 작성

새 테스트는 작성하지 않는다. rules 문서는 deterministic search와 수동 리뷰가 검증 수단이다.

#### 중간 검증

```bash
bash -lc '! rg --sort path -n "apps/mobile" bin README.md docs agent-ops/rules/project packages/contracts apps/client'
```

예상: exit code 0. `apps/mobile` 경로 참조가 남으면 실패다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/mobile/**` -> `apps/client/**` | CIS-PATH-1 |
| `bin/test` | CIS-PATH-2 |
| `bin/lint` | CIS-PATH-2 |
| `bin/build` | CIS-PATH-2 |
| `bin/dev` | CIS-PATH-2 |
| `README.md` | CIS-PATH-2 |
| `docs/monorepo.md` | CIS-PATH-2 |
| `packages/contracts/notes/flutter-core-api-candidates.md` | CIS-PATH-2 |
| `agent-ops/rules/project/rules.md` | CIS-PATH-3 |
| `agent-ops/rules/project/domain/mobile/rules.md` | CIS-PATH-3 |
| `agent-ops/rules/project/domain/workspace-ops/rules.md` | CIS-PATH-3 |
| `agent-ops/rules/project/domain/contracts/rules.md` | CIS-PATH-3 |
| `agent-ops/rules/project/domain/core/rules.md` | CIS-PATH-3 |

## 최종 검증

```bash
test -f apps/client/pubspec.yaml && test ! -e apps/mobile
bash -n bin/test bin/lint bin/build bin/dev
bash -lc '! rg --sort path -n "apps/mobile" bin README.md docs agent-ops/rules/project packages/contracts apps/client'
cd apps/client && flutter test
cd apps/client && flutter analyze --no-fatal-infos
```

Go test cache 정책: 해당 없음. Flutter test cache 출력은 허용하지 않는다. 각 명령을 실제 실행한다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
