<!-- task=01+04_command_catalog plan=1 tag=REVIEW_REFACTOR -->

# Command Catalog Follow-up Plan

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

**필수 경고: 구현 마지막 단계에서 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 모두 채워야 한다. 이 파일이 채워지기 전에는 작업이 완료된 것이 아니다.**
구현 체크리스트와 검증 명령을 그대로 수행하고 실제 출력을 review stub에 기록한다.
review 파일의 아카이브 지시와 `코드리뷰 전용 체크리스트`는 리뷰 에이전트 전용이다.

## 배경

1차 리뷰에서 `BuildDart`의 `CommandSpec.samplePath`가 실제 `BuildDart` 예시가 없는 `assets/yaml/sample/11_build_flutter.yaml`를 가리키는 문제가 발견되었다.
현재 테스트는 samplePath 파일 존재만 확인하므로 이 잘못된 매핑을 통과시킨다.

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/code-review/SKILL.md`
- `agent-ops/rules/project/domain/command/rules.md`
- `agent-ops/rules/project/domain/core/rules.md`
- `agent-ops/rules/project/domain/sample/rules.md`
- `agent-task/01+04_command_catalog/plan_local_G06_0.log`
- `agent-task/01+04_command_catalog/code_review_cloud_G06_0.log`
- `lib/oto/commands/build/build_dart.dart`
- `test/oto_command_catalog_test.dart`
- `assets/yaml/sample/11_build_flutter.yaml`
- `assets/yaml/sample/12_scheduler.yaml`

### 리뷰 발견 사항

- `lib/oto/commands/build/build_dart.dart:46`의 `samplePath`는 `assets/yaml/sample/11_build_flutter.yaml`이다.
- `assets/yaml/sample/11_build_flutter.yaml`에는 `BuildFlutter`만 있고 `BuildDart` 명령은 없다.
- `assets/yaml/sample/12_scheduler.yaml:33`에는 실제 `BuildDart` 명령 예시가 있다.
- `test/oto_command_catalog_test.dart`의 `spec sample paths exist when provided` 테스트는 파일 존재만 검증한다.

### 범위 결정 근거

- 이 follow-up은 `BuildDart` samplePath 오표기와 해당 회귀 검증만 다룬다.
- command registry 전체 구조, 데이터 모델명 검증 확장, README 생성은 이번 범위가 아니다.
- 샘플 YAML 내용 자체를 바꾸지 않고 기존 실제 예시를 우선 사용한다.

### 빌드 등급

- build lane: `local-G06` — deterministic metadata/test 수정이며 라이브 환경 의존성이 없다.
- review lane: `cloud-G06` — command catalog의 cross-file metadata 검증을 다시 확인해야 한다.

## 구현 체크리스트

- [ ] [REVIEW_REFACTOR-1] `BuildDart` samplePath를 실제 예시와 맞추고 samplePath 검증을 강화한다.
- [ ] 모든 중간 검증과 최종 검증을 실행하고 실제 출력을 `CODE_REVIEW-*-G??.md`에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

- `agent-task/01+04_command_catalog/code_review_cloud_G06_0.log`의 Required 이슈를 해결한다.
- 기존 command catalog 구현 위에서 최소 수정한다.

### [REVIEW_REFACTOR-1] BuildDart samplePath 및 검증 강화

#### 문제

`BuildDart` spec이 `assets/yaml/sample/11_build_flutter.yaml`를 가리키지만, 해당 파일은 `BuildFlutter` 예시만 포함한다.
이 상태에서는 AI가 `BuildDart` 사용 예시를 찾을 때 잘못된 샘플로 안내된다.

```dart
// lib/oto/commands/build/build_dart.dart
samplePath: 'assets/yaml/sample/11_build_flutter.yaml',
```

#### 해결 방법

`BuildDart`의 `samplePath`를 실제 `BuildDart` 명령이 있는 `assets/yaml/sample/12_scheduler.yaml`로 바꾸거나, command-specific sample로 보기 어렵다고 판단하면 `null`로 둔다.
테스트는 `samplePath`가 존재할 때 해당 파일 안에 주석이 아닌 `- command: <CommandType>` 라인이 있는지 검증한다.
주석 처리된 예시(`# - command: SlackFile`)는 통과시키지 않는다.

권장 검증 방식:

```dart
final commandName = entry.key.toString().replaceAll('CommandType.', '');
final commandPattern = RegExp(r'^\s*-\s*command:\s*' + RegExp.escape(commandName) + r'\s*$');
final hasCommand = File(sample).readAsLinesSync().any((line) {
  final trimmed = line.trimLeft();
  return !trimmed.startsWith('#') && commandPattern.hasMatch(line);
});
```

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

- [ ] `lib/oto/commands/build/build_dart.dart`의 `BuildDart` samplePath를 실제 예시와 맞춘다.
- [ ] `test/oto_command_catalog_test.dart`에서 samplePath 파일이 해당 command를 포함하는지 검증한다.
- [ ] 주석 처리된 command 라인은 samplePath 검증에서 제외한다.
- [ ] `dart test test/oto_command_catalog_test.dart`로 회귀 테스트를 확인한다.

#### 테스트 작성

- 수정: `test/oto_command_catalog_test.dart`
- 테스트명: 기존 `spec sample paths exist when provided`를 확장하거나 `spec sample paths contain the registered command`를 추가한다.
- 목적: samplePath가 존재하는 파일이더라도 다른 command의 샘플을 잘못 가리키는 회귀를 잡는다.

#### 중간 검증

```bash
dart test test/oto_command_catalog_test.dart
```

예상: command catalog 테스트 통과.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `lib/oto/commands/build/build_dart.dart` | REVIEW_REFACTOR-1 |
| `test/oto_command_catalog_test.dart` | REVIEW_REFACTOR-1 |

## 최종 검증

```bash
dart analyze
```

예상: `No issues found!`

```bash
dart test
```

예상: 모든 테스트 통과.

```bash
rg --sort path -n "command:\\s+BuildDart\\b" assets/yaml/sample
```

예상: `BuildDart` samplePath가 가리키는 파일에 실제 `BuildDart` command가 존재한다.

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