<!-- task=06_defined_data_cli_cleanup plan=0 tag=REFACTOR -->

# Defined Data and CLI Cleanup

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

**경고: 구현 완료의 마지막 단계는 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 모두 채우는 것이다.**
구현 체크리스트를 기준으로 작업하고, plan과 review stub 양쪽의 체크리스트를 완료하며, 중간/최종 검증을 실행한 실제 출력으로 `CODE_REVIEW-*-G??.md`를 채운다.
리뷰 파일의 `이 파일을 읽는 리뷰 에이전트에게` 섹션에 있는 아카이브 지시는 실행하지 말고, `코드리뷰 전용 체크리스트`는 수정하거나 체크하지 않는다.

## 배경

`defined_data.dart`에는 오래된 주석 샘플과 플랫폼별 하드코딩 YAML이 남아 있고, `cli.dart`에는 config, color/style, printer 구현, command dispatch가 한 파일에 있다.
AI가 test build나 CLI 출력 흐름을 이해하려면 실제 사용되는 최소 seed와 출력 계층이 분리되어 있어야 한다.
이 작업은 동작을 바꾸지 않고 내장 테스트 데이터와 CLI 출력 구조를 읽기 좋게 정리한다.

## 의존 관계 및 구현 순서

- 선행 task 없음. `agent-task/06_defined_data_cli_cleanup`은 core/cli 정리이며 다른 command split task와 파일 충돌이 거의 없다.
- `agent-task/03+execution_context_boundaries`와 동시에 구현 중이면 `Application` 테스트를 양쪽 변경 후 다시 실행한다.

## 분석 결과

### 읽은 파일

- `lib/oto/core/defined_data.dart`
- `lib/oto/core/data_composer.dart`
- `lib/cli/cli.dart`
- `bin/main.dart`
- `test/oto_application_test.dart`
- `test/oto_core_test.dart`
- `README.md`
- `agent-ops/rules/project/domain/core/rules.md`
- `agent-ops/rules/project/domain/cli/rules.md`
- `agent-ops/rules/project/domain/sample/rules.md`

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

- `test/oto_application_test.dart`는 file build와 CLI missing file behavior를 커버하지만 `BuildType.test`의 `TestData.buildYaml`은 직접 커버하지 않는다.
- CLI help stdout의 exact formatting은 기존 테스트가 없다.
- 신규 유닛 테스트는 사용자 요청 범위 밖이므로 작성하지 않고, CLI smoke 명령으로 확인한다.

### 심볼 참조

- renamed/removed symbol: none.
- `TestData.buildYaml` 참조: `lib/oto/core/data_composer.dart:25`, `lib/oto/core/defined_data.dart:26`, `lib/oto/core/defined_data.dart:318`, `lib/oto/core/defined_data.dart:334`.
- `TestData.jenkinsMap` 참조: `lib/oto/core/data_composer.dart:24`, `lib/oto/core/defined_data.dart:302`.
- `CLI.initialize` 참조: `bin/main.dart:12`.
- `CLI.print*` 참조 다수: `lib/oto/application.dart:102`, `lib/oto/application.dart:140`, `lib/cli/commands/command_base.dart`, `lib/cli/commands/command_manager.dart`.

### 범위 결정 근거

- `lib/cli/commands/scheduler/**`는 제외한다. scheduler 도메인 규칙상 일반 CLI 정리와 섞지 않는다.
- `CommandBase`와 `CommandManager` 동작은 변경하지 않는다. `package:oto/cli/cli.dart` import 호환을 유지한다.
- assets 샘플 재작성은 제외한다. 내장 `TestData`만 최소화한다.

### 빌드 등급

- build lane: `cloud-G07`. CLI stdout/shell printer와 built-in YAML seed를 건드리는 terminal-agent 성격의 작업이다.

## 구현 체크리스트

- [ ] `TestData.buildYaml`을 플랫폼 분기 없는 최소 유효 YAML로 축소한다.
- [ ] `defined_data.dart`의 Jenkins test map을 placeholder 중심으로 유지하고 오래된 주석 샘플을 제거한다.
- [ ] `cli.dart`의 Printer/Color/Style 책임을 별도 파일로 분리하되 기존 import 호환을 유지한다.
- [ ] CLI help와 기본 샘플 smoke 검증을 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR-1] Minimal TestData build YAML

#### 문제

`TestData.buildYaml`은 `lib/oto/core/defined_data.dart:26`부터 플랫폼별 긴 YAML 문자열과 대부분 주석 처리된 legacy 예시를 포함한다.
실제로 `DataComposerTest`는 `lib/oto/core/data_composer.dart:25`에서 이 문자열을 그대로 사용하므로 test mode의 AI 진입점이 오래된 샘플처럼 보인다.

Before (`lib/oto/core/defined_data.dart:25`):

```dart
class TestData {
  static String get buildYaml {
    String yaml = '';
    if (Platform.isMacOS) {
```

#### 해결 방법

플랫폼 분기를 제거하고 `Print` + `SetValue` + `Print`로 끝나는 최소 YAML을 반환한다.
외부 파일, Git, FTP, iOS build 같은 환경 의존 command는 내장 test seed에서 제거한다.

After:

```dart
class TestData {
  static String get buildYaml => '''
---
property:
  workspace: ${Directory.current.path}
  env: test
...
''';
}
```

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

- [ ] `lib/oto/core/defined_data.dart`: `TestData.buildYaml` 최소화.
- [ ] `lib/oto/core/defined_data.dart`: 불필요해진 `BuildPlatform` import 제거.
- [ ] `lib/oto/core/data_composer.dart`: `DataComposerTest` 호출이 그대로 동작하는지 확인.

#### 테스트 작성

- 신규 유닛 테스트는 작성하지 않는다. 대신 `dart run bin/main.dart exe -t` 또는 equivalent test mode smoke가 가능하면 실행한다.

#### 중간 검증

```bash
dart run bin/main.dart exe -t
```

기대 결과: test mode가 `Build Successfully Complete`를 출력한다.

### [REFACTOR-2] Placeholder-only Jenkins test map

#### 문제

`TestData.jenkinsMap`은 `lib/oto/core/defined_data.dart:302`부터 sample Jenkins URL, commit hash, build number를 platform별로 복제한다.
민감 정보는 아니지만 실제 환경처럼 보여 AI가 예제와 런타임 데이터를 혼동할 수 있다.

Before (`lib/oto/core/defined_data.dart:302`):

```dart
static Map<String, dynamic>? get jenkinsMap {
  Map<String, dynamic>? map;
  if (Platform.isMacOS || Platform.isLinux) {
```

#### 해결 방법

platform branch를 제거하고 `FileData.jenkinsMap`과 같은 placeholder map에 `buildData: buildYaml`만 더한다.
`DataCommon.fromJson()` 필수 필드 타입은 유지한다.

After:

```dart
static Map<String, dynamic>? get jenkinsMap {
  final map = Map<String, dynamic>.from(FileData.jenkinsMap!);
  map['buildData'] = buildYaml;
  return map;
}
```

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

- [ ] `lib/oto/core/defined_data.dart`: `TestData.jenkinsMap` 단일 placeholder map으로 축소.
- [ ] `lib/oto/core/defined_data.dart`: 플랫폼별 복제 제거.

#### 테스트 작성

- 신규 유닛 테스트는 작성하지 않는다. `DataComposerTest` smoke로 확인한다.

#### 중간 검증

```bash
dart test test/oto_application_test.dart test/oto_core_test.dart
```

기대 결과: application/core 테스트가 통과한다.

### [REFACTOR-3] CLI printer split with import compatibility

#### 문제

`lib/cli/cli.dart`는 `CLIConfig` at `34`, `Color`/`Style` at `13`, `CLI` at `50`, `Printer` at `184`, OS별 printer at `226`과 `297`을 모두 담고 있다.
CLI command routing을 볼 때 출력 escape 처리까지 함께 읽게 된다.

Before (`lib/cli/cli.dart:13`):

```dart
enum Color {
  black,
  red,
```

#### 해결 방법

`lib/cli/cli_style.dart`에 `Color`, `Style`을, `lib/cli/printer.dart`에 `Printer`와 OS별 구현을 이동한다.
`lib/cli/cli.dart`는 기존 import 호환을 위해 필요한 export를 제공하고 `CLI`/`CLIConfig`/dispatch만 유지한다.

After:

```dart
// cli.dart
export 'cli_style.dart';
export 'printer.dart';

class CLIConfig { ... }
class CLI { ... }
```

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

- [ ] `lib/cli/cli_style.dart`: `Color`, `Style` 이동.
- [ ] `lib/cli/printer.dart`: `Printer`, `_PrinterWindows`, `_PrinterUnix` 이동.
- [ ] `lib/cli/cli.dart`: export 추가, printer map 접근을 public/internal API로 정리.
- [ ] `bin/main.dart`: 기존 `package:oto/cli/cli.dart` import가 그대로 동작하는지 확인.

#### 테스트 작성

- 신규 유닛 테스트는 작성하지 않는다. CLI stdout exact 테스트는 별도 작업으로 남긴다.

#### 중간 검증

```bash
dart run bin/main.dart
```

기대 결과: CLI help가 출력되고 process가 성공 종료한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `lib/oto/core/defined_data.dart` | REFACTOR-1, REFACTOR-2 |
| `lib/oto/core/data_composer.dart` | REFACTOR-1 검증 대상 |
| `lib/cli/cli.dart` | REFACTOR-3 |
| `lib/cli/cli_style.dart` | REFACTOR-3 |
| `lib/cli/printer.dart` | REFACTOR-3 |
| `bin/main.dart` | REFACTOR-3 검증 대상 |
| `test/oto_application_test.dart` | REFACTOR-2 검증 대상 |
| `test/oto_core_test.dart` | REFACTOR-2 검증 대상 |

## 최종 검증

```bash
dart format lib/oto/core/defined_data.dart lib/cli/cli.dart lib/cli/cli_style.dart lib/cli/printer.dart
dart analyze
dart test test/oto_application_test.dart test/oto_core_test.dart
dart run bin/main.dart
dart run bin/main.dart exe -t
dart run bin/main.dart exe -f assets/yaml/sample/01_basic.yaml
```

기대 결과: format/analyze/test가 통과하고, CLI help/test mode/file mode smoke가 성공한다.

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